[X]关闭

参考的一个三段式状态机,感觉有问题,大家来看看

文档创建者:uisrc
浏览次数:6548
最后更新:2016-07-02
悬赏1积分已解决

module detect_3(
        input clk_i,
        input rst_n_i,
        output out_o
        );
    reg out_r;
    //状态声明和状态编码
    reg [1:0] Current_state;
    reg [1:0] Next_state;
    parameter [1:0] S0=2'b00;
    parameter [1:0] S1=2'b01;
    parameter [1:0] S2=2'b10;
    parameter [1:0] S3=2'b11;
   
    //时序逻辑:描述状态转换
    always@(posedge clk_i)
    begin
        if(!rst_n_i)
#2            Current_state<=0;
        else
#2            Current_state<=Next_state;
    end
   
    //组合逻辑:描述下一状态
    always@(Current_state)
    begin
        case(Current_state)
            S0:
#0.5                 Next_state = S1;
            S1:
#0.5                Next_state = S2;
            S2:
#0.5                Next_state = S3;
            S3:
                begin
                     Next_state = Next_state;
                end
          endcase
    end
    //输出逻辑:让输出out,经过寄存器out_r锁存后输出,消除毛刺
    always@(posedge clk_i)
    begin
        if(!rst_n_i)
            out_r<=1'b0;
        else
        begin
            out_r<=1'b0;
            case(Current_state)
               S0,S2:
#2                    out_r<=1'b0;
               S1,S3:
#2                    out_r<=1'b1;
            endcase
         end
    end
   
    assign out_o=out_r;   


仿真结果

P8BF2~M)@}D)WZYR1NVA9(X.png






最佳答案

查看完整内容

逻辑性,没问题,case要完整

发表评论已发布 3

母子平安

发表于 2016-6-21 19:44:10 来自手机 | 显示全部楼层

逻辑性,没问题,case要完整
回复

使用道具 举报

uisrc

发表于 2016-6-23 09:44:03 | 显示全部楼层

母子平安 发表于 2016-6-21 15:01
逻辑性,没问题,case要完整

没有不可知的case
这个部分完善了,always(*)
module detect_3(
        input clk_i,
        input rst_n_i,
        output out_o
        );
    reg out_r;
    //状态声明和状态编码
    reg [1:0] Current_state;
    reg [1:0] Next_state;
    parameter [1:0] S0=2'b00;
    parameter [1:0] S1=2'b01;
    parameter [1:0] S2=2'b10;
    parameter [1:0] S3=2'b11;
   
    //时序逻辑:描述状态转换
    always@(posedge clk_i)
    begin
        if(!rst_n_i)
#2            Current_state<=0;
        else
#2            Current_state<=Next_state;
    end
   
    //组合逻辑:描述下一状态
    always@(*)
    begin
        case(Current_state)
            S0:
#0.5                 Next_state = S1;
            S1:
#0.5                Next_state = S2;
            S2:
#0.5                Next_state = S3;
            S3:
                begin
                     Next_state = Next_state;
                end
                        default :
                                Next_state = S0;
          endcase
    end
    //输出逻辑:让输出out,经过寄存器out_r锁存后输出,消除毛刺
    always@(posedge clk_i)
    begin
        if(!rst_n_i)
            out_r<=1'b0;
        else
        begin
            case(Current_state)
               S0,S2:
#2                    out_r<=1'b0;
               S1,S3:
#2                    out_r<=1'b1;
                           default :
                                          out_r<=out_r;
            endcase
         end
    end
   
    assign out_o=out_r;   


越努力越幸运!加油!
回复

使用道具 举报

母子平安

发表于 2016-7-2 19:46:23 | 显示全部楼层

  always@(*)   和   always@(Current_state)    在这个代码里好像区别不大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则