hdlbits.01xz.net /Circuits/Sequential Logic/Finite State Machines/Serial receiver

错误情况1:

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 

    parameter IDLE  = 5'b00001;
    parameter START = 5'b00010;
    parameter RECV  = 5'b00100;
    parameter STOP  = 5'b01000;
    parameter END  =  5'b10000;
    
    reg [4:0] state, next;
    integer cnt;
    
    //state trans
    always @(*) begin
        if(reset)
            next = IDLE;
        else begin
            case(state)
                IDLE: begin
                    if(in == 0)
                        next = START;
                    else 
                        next = IDLE;
                end
                START: begin
                    next = RECV;
                	
                end
                RECV: begin
                    if(cnt >= 7)
                        next = STOP;
                    else
                        next = RECV;
                end
                STOP: begin
                    if(in == 1) begin
                        next = IDLE;
                    end
                    else begin
                        next = STOP;
                    end
                end
                default: begin
                	next = IDLE;
                end
            endcase
        end
    end

    //ff
    always @(posedge clk) begin
        if(reset)
            state = IDLE;
        else
			state = next;
    end
    
    //cnt
    always @(posedge clk) begin
        if(reset) 
        	cnt = 0;
        else begin
            if(state == START)
                cnt = 0;
            else
                cnt = cnt+1;
        end
    end

    //output
    assign done = (state==STOP)? 1'b1: 1'b0;
endmodule

错误状况2, 第一个字节的检验过了, 问题发生在第二个字节:

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 
    parameter IDLE = 	12'b000000000001;
    parameter START = 	12'b000000000010;
    parameter B0 = 		12'b000000000100;
    parameter B1 = 		12'b000000001000;
    parameter B2 = 		12'b000000010000;
    parameter B3 = 		12'b000000100000;
    parameter B4 = 		12'b000001000000;
    parameter B5 = 		12'b000010000000;
    parameter B6 = 		12'b000100000000;
    parameter B7 = 		12'b001000000000;
    parameter STOP = 	12'b010000000000;
    parameter END =     12'b100000000000;
    
    reg [11:0] state, next;
    
    //ff
    always @(posedge clk) begin
        if(reset)
            state = START;
        else
            state = next;
    end
    
    // trans
    always @(*) begin
        next = START;
        case(state)
            START:begin
                if(in == 0)
                    next = B0;
                else
                    next = START;
            end
            B0:begin
                next = B1;
            end
            B1:begin
                next = B2;
            end
            B2:begin
                next = B3;
            end
            B3:begin
                next = B4;
            end
            B4:begin
                next = B5;
            end
            B5:begin
                next = B6;
            end
            B6:begin
                next = B7;
            end
            B7:begin
                next = STOP;
            end
            STOP:begin
                if(in == 1)
                    next = END;
                else
                    next = STOP;
            end
            END:
                next = START;
            default:begin
                next = START;
            end
        endcase
    end

    //out
    assign done = (state == END)? 1: 0;
endmodule

 

第三版, 还是有错, 错误点又后移了, 新的验证条件是该出现stopbit的时候没出现, 晚了一个时钟, done不应该有一个输出, 表示这次的数据应该废弃。

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 
    parameter IDLE = 	12'b000000000001;
    parameter START = 	12'b000000000010;
    parameter B0 = 		12'b000000000100;
    parameter B1 = 		12'b000000001000;
    parameter B2 = 		12'b000000010000;
    parameter B3 = 		12'b000000100000;
    parameter B4 = 		12'b000001000000;
    parameter B5 = 		12'b000010000000;
    parameter B6 = 		12'b000100000000;
    parameter B7 = 		12'b001000000000;
    parameter STOP = 	12'b010000000000;
    parameter END =     12'b100000000000;
    
    reg [11:0] state, next;
    
    //ff
    always @(posedge clk) begin
        if(reset)
            state = START;
        else
            state = next;
    end
    
    // trans
    always @(*) begin
        next = START;
        case(state)
            START:begin
                if(in == 0)
                    next = B0;
                else
                    next = START;
            end
            B0:begin
                next = B1;
            end
            B1:begin
                next = B2;
            end
            B2:begin
                next = B3;
            end
            B3:begin
                next = B4;
            end
            B4:begin
                next = B5;
            end
            B5:begin
                next = B6;
            end
            B6:begin
                next = B7;
            end
            B7:begin
                next = STOP;
            end
            STOP:begin
                if(in == 1)
                    next = END;
                else
                    next = STOP;
            end
            END:
                //next = START;
                if(in == 0)
                    next = B0;
            	else
                    next = START;
            default:begin
                next = START;
            end
        endcase
    end

    //out
    assign done = (state == END)? 1: 0;
endmodule

 第四次修改, 加了一个error状态, 终于对了

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 
    parameter IDLE = 	13'b0000000000001;
    parameter START = 	13'b0000000000010;
    parameter B0 = 		13'b0000000000100;
    parameter B1 = 		13'b0000000001000;
    parameter B2 = 		13'b0000000010000;
    parameter B3 = 		13'b0000000100000;
    parameter B4 = 		13'b0000001000000;
    parameter B5 = 		13'b0000010000000;
    parameter B6 = 		13'b0000100000000;
    parameter B7 = 		13'b0001000000000;
    parameter STOP = 	13'b0010000000000;
    parameter END =     13'b0100000000000;
    parameter ERROR =   13'b1000000000000;
    
    reg [12:0] state, next;
    
    //ff
    always @(posedge clk) begin
        if(reset)
            state = START;
        else
            state = next;
    end
    
    // trans
    always @(*) begin
        next = START;
        case(state)
            START:begin
                if(in == 0)
                    next = B0;
                else
                    next = START;
            end
            B0:begin
                next = B1;
            end
            B1:begin
                next = B2;
            end
            B2:begin
                next = B3;
            end
            B3:begin
                next = B4;
            end
            B4:begin
                next = B5;
            end
            B5:begin
                next = B6;
            end
            B6:begin
                next = B7;
            end
            B7:begin
                next = STOP;
            end
            STOP:begin
                if(in == 1)
                    next = END;
                else
                    next = ERROR;
            end
            ERROR:
                if(in == 1)
                    next = START;
                else
                    next = ERROR;
            END:
                if(in == 0)
                    next = B0;
            	else
                    next = START;
            default:begin
                next = START;
            end
        endcase
    end

    //out
    assign done = (state == END)? 1: 0;
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值