问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 8046 人浏览分享

开启左侧

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

[复制链接]
8046 3
悬赏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)    在这个代码里好像区别不大

举报 使用道具

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

本版积分规则

12

关注

71

粉丝

615

主题
精彩推荐
热门资讯
网友晒图
图文推荐

  • 微信公众平台

  • 扫描访问手机版