1、题目
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.
2、分析
1byte=8bit
PS/2鼠标协议发送三字节长的消息,第一个字节的bit[3]=1,其它不一定,完成所有三个字节的接受后表示消息已经收到。
3、代码
module top_module( input clk, input [7:0] in, input reset, // Synchronous reset output done); // parameter IDLE=4'b0001,BYTE1=4'b0010,BYTE2=4'b0100,BYTE3=4'b1000; reg [4:0]state,next_state; // State transition logic (combinational) always@(*)begin case(state) IDLE:next_state=in[3]?BYTE1:IDLE; BYTE1:next_state=BYTE2; BYTE2:next_state=BYTE3; BYTE3:next_state=in[3]?BYTE1:IDLE; default:next_state=IDLE; endcase end // State flip-flops (sequential) always@(posedge clk)begin if(reset) state<=IDLE; else state<=next_state; end // Output logic assign done=(state==BYTE3); endmodule