专栏首页数字积木HDLBits:在线学习 Verilog (二十八 · Problem 135-139)

HDLBits:在线学习 Verilog (二十八 · Problem 135-139)

本系列内容来自于知乎专栏,链接如下:https://zhuanlan.zhihu.com/c_1131528588117385216 本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

Problem 135 PS/2 packet parser and datapath / Fsm ps2data

牛刀小试

现在,已经写了一个PS/2接口的状态机,该状态机可以标识PS/2字节流中的三字节消息。请在这个状态机中添加一条数据路径,该数据路径可以在接收数据包的同时输出24bits(3字节)的消息(out_bytes[23:16]为第一字节,out_bytes[15:8]为第二字节,以此类推)。

当发出接收完成信号done时,out_bytes必须是有效的,其他时候可以输出任何的内容(即不在乎输出什么。)

小提示:使用前一题Problem 134 PS/2 packet parser / Fsm ps2 中的状态机,并添加用于捕捉输入字节的数据路径即可。

解答与分析

本题在前一题的三个没有输出动作的状态上添加out_bytes等于输入即可完成。值得注意的是状态4可以跳转为状态2,所以状态4也需要对out_bytes赋值。

module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output [23:0] out_bytes,
    output done); //

    // FSM from fsm_ps2
    parameter A = 2'b00;
    parameter B = 2'b01;
    parameter C = 2'b10;
    parameter D = 2'b11;
    
    reg [1:0] state,next_state;
    
    always@(posedge clk)
        if(reset)
            state<=A;
        else
            state<=next_state;
    
    always@(*)
        case(state)
            A:next_state=in[3]?B:A;
            B:next_state=C;
            C:next_state=D;
            D:next_state=in[3]?B:A;
        endcase
    
    assign done = state ==D;

    // New: Datapath to store incoming bytes.
    always@(posedge clk)
        case(state)
            A:out_bytes[23:16]<=in;
            B:out_bytes[15: 8]<=in;
            C:out_bytes[ 7: 0]<=in;
            D:out_bytes[23:16]<=in;
        endcase

endmodule

Problem136 ~ Problem138 为串行接收器的部分,已经由小伙伴们完成了。附上链接,又可以偷懒啦~~~感谢

@近朱者赤

近朱者赤:HDLBits:Serial Receiver系列问题zhuanlan.zhihu.com

Problem 139 Sequuence recognition / Fsm hdlc

同步HDLC帧涉及从连续的比特流中解码寻找某一帧(即数据包)的开始和结束位置的位模式。(对位模式不太理解的可以参见zhuanlan.zhihu.com/p/46)。如果接收到连续的6个1(即01111110),即是帧边界的“标志”。同时为了避免输入的数据流中意外包含这个帧边界“标志”,数据的发送方必须在数据中连续的5个1之后插入一个0,而数据的接收方必须将这个多余的0检测出来并丢弃掉。同时,如果输入检测到了了连续7个或更多的1时,接收方还需要发出错误信号。

牛刀小试

下面请创建一个有限状态机来识别上述的三个序列:

  1. 输入0111110:插入的信号位需要丢弃(Discarded, disc)。
  2. 输入01111110:标记(Flag)帧的开始/结束(flag)。
  3. 输入01111111 ...:错误(Reeor)(7个或更多的1)(err)。

重置FSM时,其状态应恢复到之前输入0的状态。

以下是一些示例序列,详细的说明了状态机所需的操作。

输入0111110,需要舍弃后面的0

输入01111110,判断为帧的开始/结束

复位逻辑和输入连续7个以上的1

小提示:

1、请使用10个状态以内的摩尔机。

2、状态图:

状态图

解答与分析

这道题可能比较难理解,不知道题干在说什么,但是看了下面的波形图还是能理解一些的,就是对连续输入的比特流进行判断,当连续输入5个1时,下一拍disc=1,当连续输入6个1时,flag=1,当输入的1数量超过7个时,将err置1,如果一旦有0输入,则返回初始状态。

此题还是建议自己去想一下状态转移是怎么样的,需要很多个状态,检测到1向下跳,检测到0返回初始状态,需要的状态比较多,但不要灰心,慢慢画一下。

module top_module(
    input clk,
    input reset,    // Synchronous reset
    input in,
    output disc,
    output flag,
    output err);
    
    parameter none=4'd0;
    parameter one=4'd1;
    parameter two=4'd2;
    parameter three=4'd3;
    parameter four=4'd4;
    parameter five=4'd5;
    parameter six=4'd6;
    parameter error=4'd7;
    parameter discard=4'd8;
    parameter flag_=4'd9;
    
    reg [3:0] state;
    reg [3:0] next_state;
    
    always@(posedge clk)
        if(reset)
            state<=none;
        else
            state<=next_state;
    
    always@(*)
        case(state)
            none   :next_state=in?one:none;
            one    :next_state=in?two:none;
            two    :next_state=in?three:none;
            three  :next_state=in?four:none;
            four   :next_state=in?five:none;
            five   :next_state=in?six:discard;
            six    :next_state=in?error:flag_;
            error  :next_state=in?error:none;
            discard:next_state=in?one:none;
            flag_  :next_state=in?one:none;
        endcase
    
    assign disc = state == discard;
    assign flag = state == flag_;
    assign err  = state == error;

endmodule

本文分享自微信公众号 - 数字积木(ggreat-top)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HDLBits:在线学习 Verilog (十八 · Problem 85-89)

    Problem 85 : DFF with byte enable(Dff16e)

    数字积木
  • HDLBits:在线学习 Verilog (二十 · Problem 95 - 99)

    在一个8bit的变量中,从一个周期到另一个周期期间,检测输入信号变化。即上升沿变化或下降沿变化。输出应在0变为1后产生。

    数字积木
  • HDLBits:在线学习 Verilog (十二 · Problem 55 - 59)

    假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring),电路必须把震动( output motor = 1 )或响铃( out...

    数字积木
  • HDLBits:在线学习 Verilog (二十二 · Problem 105 - 109)

    用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时,用ena使能信号来驱动时钟的递增。

    数字积木
  • HDLBits:在线学习Verilog(八 · Problem 35-39)

    Problem 35: Always nolatches(Always nolatches)

    数字积木
  • HDLBits:在线学习 Verilog (二十一 · Problem 100 - 104)

    设计一个0~9的计数器,共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增,而是随着一个slowena使能信号来控...

    数字积木
  • HDLBits:在线学习 Verilog (二十七 · Problem 130-134)

    前面Problem 125 Simple one-hot state transtion 3应该已经介绍过独热one-hot编码方式。这是一种生成逻辑最为简单的...

    数字积木
  • HDLBits:在线学习 Verilog (二十三 · Problem 110-114)

    相比于上一题 5-bit 线性移位寄存器,本题原理上相同,但作者希望我们结合实际的板子(DE1-SoC,可能是一个教学板)和其外部接口(KEY&LED),实现一...

    数字积木
  • HDLBits:在线学习 Verilog (二十四 · Problem 115-119)

    下表更详细地给出了跳变的规则,(可以视为状态转移表),元素下一个状态可以视作输出,输入为元素本身的状态与相应两个相邻元素的当前状态。

    数字积木
  • HDLBits:在线学习 Verilog (二十九 · Problem 140-144)

    Problem 140 Serial two's complementer (Mealy FSM)

    数字积木
  • HDLBits:在线学习 Verilog (十 · Problem 45 - 49)

    解析:如上图所示, 一个异或门,一个同或门,我声明一个wire型的temp来存放同或门的输出。

    数字积木
  • HDLBits:在线学习 Verilog (二 · Problem 10-14)

    什么是 Verilog 中的向量(vector)?向量是一组 wire 信号的集合,通过赋予这一组信号的集合一个名称,以便于访问其中的 wire 信号。

    数字积木
  • HDLBits:在线学习 Verilog (一 · Problem 0-9)

    本文是系列文章的第一篇,讨论下前十道习题和解答,HDLBits 共有约 180 题。Step one - HDLBits

    数字积木
  • HDLBits:在线学习 Verilog (十九 · Problem 90 - 94)

    我们用3个包含触发器和多路选择器的子模块来实现图中电路。题目要求我们写出包含一个触发器和一个多路选择器的子模块。

    数字积木
  • HDLBits:在线学习 Verilog (十六 · Problem 75 - 79)

    一个4输入a, b, c, d和一输出的逻辑电路,当输入为2, 7或15时,输出为1, 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时...

    数字积木
  • HDLBits:在线学习 Verilog (十三 · Problem 60-64)

    Problem 60 : 2-to-1 multiplexer (Mux2to1)

    数字积木
  • HDLBits:在线学习 Verilog (十四 · Problem 65-69)

    本题中需要实现一个 2 进制 1bit 加法器,加法器将输入的两个 1bit 数相加,产生两数相加之和以及进位。

    数字积木
  • HDLBits:在线学习 Verilog (十五 · Problem 70 - 74)

    题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout。

    数字积木
  • HDLBits:在线学习 Verilog (十一 · Problem 50 - 54)

    在前面的练习中,我们使用简单的逻辑门和多个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出只是其输入的函数(在数学意义上)。这意味着对于任何给定的输...

    数字积木

扫码关注云+社区

领取腾讯云代金券