在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1999|回复: 2

[求助] 请教下三段状态机加计数器计数错误的问题

[复制链接]
发表于 2023-3-24 16:33:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
在做HDLBits中Lemmings4(https://hdlbits.01xz.net/wiki/Lemmings4
想向各位前辈请教下这个程序哪里出现问题了
想法是在悬空状态下计数,CLK上升沿每到一次加一,在落地时如果计数大于21就死亡,可是计数器会出现类似于在同一个clk内多次触发的问题,仿真结果悬空状态不足21个clk也转到死亡状态。HDLbits的仿真是先给异步置零信号的,应该不会出现锁在空闲状态的吧
L是向左走,R是像右走,DL是挖掘(左),DR是挖掘(右),UGL是悬空态(左),UGR是悬空态(右),die是死亡(随便找了一个状态机内的空余状态)
module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    input dig,
    output walk_left,
    output walk_right,
    output aaah,
    output digging );

    //参量声明
    parameter L=3'b010,R=3'b011,DL=3'b110,DR=3'b111,UGL=3'b000,UGR=3'b001,die=3'b101;

    //寄存声明
    reg [2:0] s,ns;
    reg [31:0] k;
    reg [0:0] dead;


    //下一状态
    always @(posedge clk or posedge areset)
        if(areset)
            s<=L;
    else
        s<=ns;

    //状态转换
    always @(s or ground or dig or bump_left or bump_right or k)
        case(s)
            L:
                begin
                    if(!ground)
                        ns=UGL;
                    else
                        if(dig)
                            ns=DL;
                    else
                        if(bump_left)
                            ns=R;
                    else
                        ns=L;
                end

            R:
                begin
                    if(!ground)
                        ns=UGR;
                    else
                        if(dig)
                            ns=DR;
                    else
                        if(bump_right)
                            ns=L;
                    else
                        ns=R;
                end

            DL:
                if(!ground)
                    ns=UGL;
            else
                ns=DL;

            DR:
                if(!ground)
                    ns=UGR;
            else
                ns=DR;

            UGL:
                if(ground)
                    begin
                        if(k[20:0]==21'd0)
                            ns=die;
                        else
                            ns=L;
                    end
            else
                ns=UGL;
            UGR:
                if(ground)
                    begin
                        if(k[20:0]==21'd0)
                            ns=die;
                        else
                            ns=R;
                    end
            else
                ns=UGR;

            die:ns=die;
        endcase
    //输出walk

    assign walk_right=(s==R);
    assign walk_left=(s==L);

    //输出ahhh
    assign aaah=(s==UGR)||(s==UGL);

    //输出digging

    assign digging=(s==DL)||(s==DR);

    //计数器
    always @(s)
        begin
        if((s==UGL)||(s==UGR))
            k=k<<1;
    else
        k=32'd1;
        end

    //死亡状态


endmodule


题目要求

题目要求

错误提示

错误提示

错误提示

错误提示

波形图

波形图
发表于 2023-3-25 13:23:24 | 显示全部楼层
额,计数器怎么能是组合逻辑呢。
 楼主| 发表于 2023-3-26 15:46:57 | 显示全部楼层


RayZyl 发表于 2023-3-25 13:23
额,计数器怎么能是组合逻辑呢。


感谢!这里确实是有问题。我想的是clk上升沿到达,s拿到ns的值,根据s改变的结果触发计数器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-5-16 04:06 , Processed in 0.018255 second(s), 10 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表