目录
Fsm serialdp
Fsm ps2
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 top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output done); //
parameter S0=0, S1=1, S2=2, S3=3;
reg [1:0] state, next;
// State transition logic (combinational)
always @(*) begin
case (state)
S0: next= in[3]? S1:S0;
S1: next= S2;
S2: next= S3;
S3: next= in[3]? S1:S0;
endcase
end
// State flip-flops (sequential)
always @(posedge clk) begin
if(reset) state<=S0;
else state<=next; end
// Output logic
assign done= (state == S3);
endmodule
Fsm ps2data
See also: PS/2 packet parser.
Now that you have a state machine that will identify three-byte messages in a PS/2 byte stream, add a datapath that will also output the 24-bit (3 byte) message whenever a packet is received (out_bytes[23:16] is the first