Fsm serial
在许多(较早的)串行通信协议中,每个数据字节都与一个起始位和一个停止位一起发送,以帮助接收器从比特流中划定字节。一个常见的方案是使用一个起始位(0),8个数据位和一个停止位(1)。当没有任何传输时(空闲),该线路也处于逻辑1。
设计一个有限状态机,当给定一个比特流时,它将识别字节是否被正确接收。它需要识别起始位,等待所有8个数据位,然后验证停止位是否正确。如果停止位没有在预期时间出现,有限状态机必须等待,直到它找到一个停止位,然后再尝试接收下一个字节。
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
parameter idle1=0,start=1,s1=2,s2=3,s3=4,s4=5,s5=6,s6=7,s7=8,s8=9,stop=10,idle2=11;
reg [3:0]state;
reg [3:0]next_state;
always@(*) begin
case(state)
idle1:next_state=in?idle1:start;
start:next_state=s1;
s1:next_state=s2;
s2:next_state=s3;
s3:next_state=s4;
s4:next_state=s5;
s5:next_state=s6;
s6:next_state=s7;
s7:next_state=s8;
s8:next_state=in?stop:idle2;
stop:next_state=in?idle1:start;
idle2:next_state=in?idle1:idle2;//没有在预定位置停止时,不输出done
default next_state=idle1;
endcase
end
always@(posedge clk) begin
if(reset) state<=idle1;
else state<=next_state;
end
assign done=(state==stop)?1:0;
endmodule
Fsm serialdata
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output [7:0] out_byte,
output done
); //
// Use FSM from Fsm_serial
parameter idle1=0,start=1,s1=2,s2=3,s3=4,s4=5,s5=6,s6=7,s7=8,s8=9,stop=10,idle2=11;
reg [3:0]state;
reg [3:0]next_state;
reg [7:0]out;
always@(*) begin
case(state)
idle1:next_state=in?idle1:start;
start: begin next_state=s1; out[0]=in; end
s1: begin next_state=s2; out[1]=in;end
s2:begin next_state=s3;out[2]=in;end
s3:begin next_state=s4;out[3]=in;end
s4:begin next_state=s5;out[4]=in;end
s5:begin next_state=s6;out[5]=in;end
s6:begin next_state=s7;out[6]=in;end
s7:begin next_state=s8;out[7]=in;end
s8:next_state=in?stop:idle2;
stop:next_state=in?idle1:start;
idle2:begin next_state=in?idle1:idle2; out=0;end //没有在预定位置停止时,不输出done
endcase
end
always@(posedge clk) begin
if(reset) begin state<=idle1; end
else begin state<=next_state; end
end
assign done=(state==stop)?1:0;
assign out_byte=(state==stop)?out:0;
// New: Datapath to latch input bits.
endmodule
今天写的《比较》顺利,芜湖~
没有回复内容