Fsm 有限状态机 实现串口-FPGA常见问题社区-FPGA CPLD-ChipDebug

Fsm 有限状态机 实现串口

 

Fsm serial

图片[1]-Fsm 有限状态机 实现串口-FPGA常见问题社区-FPGA CPLD-ChipDebug

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

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

图片[2]-Fsm 有限状态机 实现串口-FPGA常见问题社区-FPGA CPLD-ChipDebug
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

图片[3]-Fsm 有限状态机 实现串口-FPGA常见问题社区-FPGA CPLD-ChipDebug
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

 

今天写的《比较》顺利,芜湖~

请登录后发表评论

    没有回复内容