Verilog专题(二十六)PS/2 packet parser(​PS/2鼠标协议)

HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page

 

题目

The PS/2 mouse protocol sends messages that are three bytes long. However, within a continuous byte stream, it's not obvious where messages start and end. The only indication is that the first byte of each three byte message always has bit[3]=1 (but bit[3] of the other two bytes may be 1 or 0 depending on data).

We want a finite state machine that will search for message boundaries when given an input byte stream. The algorithm we'll use is to discard bytes until we see one with bit[3]=1. We then assume that this is byte 1 of a message, and signal the receipt of a message once all 3 bytes have been received (done).

The FSM should signal done in the cycle immediately after the third byte of each message was successfully received.

 

Module Declaration

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

 

状态转移图

 

我的设计

    PS / 2鼠标协议发送三字节长的消息。但是,在连续的字节流中,消息的开始和结束位置并不明显。唯一的指示是每个三字节消息的第一个字节始终具有bit [3] = 1(但其他两个字节的bit [3]取决于数据可能是1或0)。尽管in [7:0]是一个字节,但FSM只有一个输入:in [3]。

    当给定输入字节流时,它将搜索消息边界。我们将使用的算法是丢弃字节,直到看到bit [3] = 1的字节为止。然后,我们假定这是消息的字节1,并且一旦接收到所有3个字节(完成),就发出接收消息的信号。

    由此状态转移图就能得到设计:

module top_module(    input clk,    input [7:0] in,    input reset,    // Synchronous reset    output done); //    parameter a=1,b=2,c=3;    reg [1:0] s,ns;    // State transition logic (combinational)    always@(*)begin        case(s)           a:begin               if(in[3])ns<=b;               else ns<=a;           end            b:begin               ns<=c;           end            c:begin                if(in)ns<=a;               else ns<=c;           end       endcase            end    // State flip-flops (sequential)    always@(posedge clk)begin        if(reset) s <= a;        else s <= ns;    end    // Output logic    reg d;    always@(posedge clk)begin        if(reset)  d=0;        else if(s==c) d=1;        else d=0;    end  assign done=d;endmodule

 

微信公众号

     建立了一个微信公众号“Andy的ICer之路”,此公众号主要分享数字IC相关的学习经验,做公众号的目的就是记录自己的学习过程,很多东西回过头来可能就忘记了,为了记住知识和分享知识,希望自己可以保持更新,有兴趣的朋友可以关注一下!

 

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值