打印
[FPGA]

新手学习状态机求助一个问题

[复制链接]
365|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YCD1234|  楼主 | 2020-6-1 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 YCD1234 于 2020-6-1 21:19 编辑

一个检测按键按下的消抖状态机,为什么quartus中在
1:
        if(cnt >= 999999)begin
                state <= 2;
                cnt_en <= 1'b0;
        end
这种写法下就不能看到状态转换图但是换成
1:
        if(cnt == 999999)begin
                state <= 2;
                cnt_en <= 1'b0;
        end
就可以看到
以下是源码
module key_detect(
        clk,
        key,
        rst_n,
        led
);

        input clk;
        input key;
        input rst_n;
        
        output [3:0]led;
        
        reg key_r;

        always@(posedge clk)
                key_r <= key;        //clk上升沿的时候为key_r赋key的值
        
        wire key_nedge;
        wire key_pedge;
        
        assign key_nedge = (!key)&&key_r;//因为key按下后在下一个时钟上升沿key_r才会变化所以key下降沿时会出现key为低而key_r依旧保持上一个时钟上升沿赋值时的高
        assign key_pedge = (!key_r)&&key;
        
        reg [19:0]cnt;
        reg cnt_en;
        
        always@(posedge clk,negedge rst_n)begin
                if(!rst_n)
                        cnt <= 0;
                else if(cnt_en)
                                cnt <= cnt + 1'b1;
                          else
                                cnt <= 0;
         end
        
        reg [1:0]state;
        
        always@(posedge clk,negedge rst_n)begin
        if(!rst_n)
                state <= 0;
        else
                case(state)
                        0:
                                if(key_nedge)begin
                                        state <= 1;
                                        cnt_en <= 1'b1;
                                end
                                else
                                        state <= 0;
                        1:
                                if(cnt == 999999)begin
                                        state <= 2;
                                        cnt_en <= 1'b0;
                                end
                                else if(key_pedge)begin
                                                cnt_en <= 1'b0;
                                                state <= 0;
                                          end
                                          else
                                                state <= 1;
                        2:
                                if(key_pedge)begin
                                        cnt_en <= 1'b0;
                                        state <= 3;
                                end
                                else
                                        state <= 2;
                        3:
                                if(cnt == 999999)begin
                                        state <= 0;
                                        cnt_en <= 1'b0;
                                end
                                else if(key_pedge)begin
                                                        state <= 2;
                                                        cnt_en <= 1'b0;
                                          end
                                          else
                                                        state <= 3;
                        default : state <= 0;
                endcase
        end
endmodule


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

0

粉丝