Fsm ps2
PS/2鼠标协议发送的信息有三个字节长。然而,在一个连续的字节流中,消息的开始和结束并不明显。唯一的迹象是,每个三字节消息的第一个字节总是bit[3]=1(但其他两个字节的位[3]可能是1或0,取决于数据)。
我们想要一个有限状态机,当给定一个输入字节流时,它将搜索消息的边界。我们将使用的算法是丢弃字节,直到我们看到一个bit[3]=1的字节。然后我们假设这是一个消息的第1字节,一旦所有的3个字节都被收到,就发出收到消息的信号(done)。
FSM应该在每个消息的第三个字节被成功接收后立即发出完成信号。
思路:
module top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output done); //
parameter bit1=0, bit2=1,bit3=2, Done=3;
reg [2:0]state;
reg [2:0]next_state;
// State transition logic (combinational)
always@(*) begin
case(state)
bit1: next_state=in[3]?bit2:bit1;
bit2: next_state=bit3;
bit3: next_state=Done;
Done: next_state=in[3]?bit2:bit1;
endcase
end
// State flip-flops (sequential)
always@(posedge clk) begin
if(reset) state<=bit1;
else state<=next_state;
end
// Output logic
assign done=(state==Done)?1:0;
endmodule
Fsm ps2data(输出数据)
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 bit1=0,bit2=1,bit3=2,Done=3;
reg [2:0]state;
reg [2:0]next_state;
always@(*) begin
case(state)
bit1:next_state=in[3]?bit2:bit1;
bit2:next_state=bit3;
bit3:next_state=Done;
Done:next_state=in[3]?bit2:bit1;
endcase
end
always@(posedge clk) begin
if(reset) state<=bit1;
else state<=next_state;
end
assign done=(state==Done)?1:0;
// New: Datapath to store incoming bytes.
always@(posedge clk) begin
if(reset) out_bytes<=0;
else begin
case(next_state)
bit1:out_bytes[7:0]<=in;
bit2:out_bytes[23:16]<=in;
//bit2,bit3的位置容易出错,next_state为bit2,state为bit1,作为输出三字节最后一位
//next_state为bit3,state为bit2,作为输出三字节的第二位
bit3:out_bytes[15:8]<=in;
Done:out_bytes[7:0]<=in;
endcase
end
end
endmodule