串行数据接收状态机
前一道题(135.Serial receiver),不用记录数据,只输出接收完成标志done,只要把136中数据存储输出部分删除即可,因此这里不再赘述。
136:串行数据接收Serial receiver and datapath(fsm_serialdata)
原题链接:https://hdlbits.01xz.net/wiki/Fsm_serialdata
题目简单说明:接收数据格式为:1bit起始位(0)+8bit数据位+1bit停止位(1);若停止位为0则数据传输出错。
状态转换如下图:
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output [7:0] out_byte,
output done
); //
reg [3:0] state_c, state_n;
parameter Idle=0, Recv=1, Done=2, Error=3, Stop=4;
wire Idle2Recv, Recv2Stop, Stop2Error, Stop2Done, Done2Recv, Done2Idle, Error2Idle;
wire cnt_add, cnt_end;
reg [3:0] cnt;
reg [7:0] temp_data;
always@(posedge clk) begin
if(reset)
cnt <= 0;
else if(cnt_add) begin
if(cnt_end)
cnt <= 0;
else
cnt <= cnt+1;
end
end
assign cnt_add = state_c==Recv;
assign cnt_end = cnt_add && cnt==8-1;
always@(posedge clk) begin
if(reset)
state_c <= Idle;
else
state_c <= state_n;
end
always@(*) begin
case (state_c)
Idle:begin
if(Idle2Recv)
state_n = Recv;
else
state_n = state_c;
end
Recv: