在许多(较旧的)串行通信协议中,每个数据字节都与一个起始位和一个停止位一起发送,以帮助接收器从位流中划定字节。 一种常见的方案是使用 1 个起始位 (0)、8 个数据位和 1 个停止位 (1)。 当没有传输任何内容(空闲)时,该线路也处于逻辑 1。

设计一个有限状态机,当给定比特流时,它将识别何时正确接收到字节。 它需要识别起始位,等待所有 8 个数据位,然后验证停止位是否正确。 如果停止位未按预期出现,则 FSM 必须等到找到停止位后再尝试接收下一个字节。

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
);
localparam  IDLE=0,START=1,DATA=2,STOP=3,ERROR=4;
    reg [2:0] state,nstate;
    reg [3:0] cnt;
always@(posedge clk)
    if(reset)
            state<=IDLE;
    else
        state<=nstate;

    always@(posedge clk)
        if(reset)
            cnt<=4'd0;
    else
        case(nstate)
            START:cnt<=0;
            DATA:cnt<=cnt+1;
            default:cnt<=cnt;
        endcase
    always@(*)
        begin
            case(state)
                IDLE:nstate=in?IDLE:START;
                START:nstate=DATA;
                DATA:nstate=(cnt==4'd8)?(in?STOP:ERROR):DATA;
                STOP:nstate=in?IDLE:START;
                ERROR:nstate=in?IDLE:ERROR;
                default:nstate=IDLE;
            endcase
        end
    assign done=(state==STOP);
endmodule

 

posted on 2022-05-27 10:44  USSTer  阅读(163)  评论(0)    收藏  举报