HDLBits刷题Day25,3.2.5.10 Lemmings 1 - 3.2.5.11 Lemmings 2

3.2.5.10 Lemmings 1

问题描述

Lemmings游戏涉及大脑相当简单的小动物。如此简单,我们将使用有限状态机对其进行建模。

在旅鼠的 2D 世界中,旅鼠可以处于以下两种状态之一:向左行走或向右行走。如果遇到障碍物,它会切换方向。特别是,如果 Lemming 撞到左边,它会向右走。如果它撞到右边,它会向左走。如果它同时在两侧碰撞,它仍然会切换方向。

实现一个具有两个状态、两个输入和一个输出的摩尔状态机来模拟这种行为。

代码:

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right); //  

    // parameter LEFT=0, RIGHT=1, ...
    reg state, next_state;
    parameter LEFT=0, RIGHT=1;

    always @(*) begin
        case(state)
            LEFT:begin
                if(bump_left)
                    next_state=RIGHT;
                else
                    next_state=LEFT;
            end
            RIGHT:begin
                if(bump_right)
                    next_state=LEFT;
                else
                    next_state=RIGHT;
            end
        endcase// State transition logic
    end

    always @(posedge clk, posedge areset) begin
        if(areset)
            state<=LEFT;
        else
            state<=next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
    assign walk_left = (state == LEFT);  
    assign walk_right = (state == RIGHT);
    // assign walk_left = (state == ...);
    // assign walk_right = (state == ...);

endmodule
3.2.5.11 Lemmings 2

问题描述

除了左右行走之外,如果地面消失在旅鼠脚下,旅鼠还会摔倒(并且可能会“啊啊!”)。

除了左右走动和碰撞时改变方向外,当ground=0时,旅鼠会摔倒并说“啊啊!”。当地面重新出现 ( ground=1 ) 时,旅鼠将继续沿与坠落前相同的方向行走。跌倒时被撞不影响行走方向,与地面消失(但尚未跌倒)同一个周期被撞,或仍在跌倒时再次出现地面时,也不影响行走方向。跌倒的优先级高于碰壁

构建一个模拟这种行为的有限状态机。

 代码:

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    output walk_left,
    output walk_right,
    output aaah ); 

    parameter [1:0] left=0,right=1,fall_l=2,fall_r=3;
    // 四个状态,向左、向右、向左时落下、向右时落下
    reg [1:0] state,next_state;
    
    always @(*) begin
        case(state)
            left:begin
                if(ground==0) //先判断地面有没有消失,因为跌倒时被撞不影响行走方向,与地面消失(但尚未跌倒)同一个周期被撞
                    next_state=fall_l;
                else if(bump_left)
                    next_state=right;
                else
                    next_state=left;
            end
            
            right:begin
                if(ground==0) // 地面消失(但尚未跌倒)同一个周期被撞
                    next_state=fall_r;
                else if(bump_right)
                    next_state=left;
                else
                    next_state=right;
            end
            
            fall_l:begin
                if(ground)
                    next_state=left;
                else
                    next_state=fall_l;
            end
            
            fall_r:begin
                if(ground)
                    next_state=right;
                else // 跌倒时被撞不影响行走方向
                    next_state=fall_r;
            end
            
        endcase
    end
         
    always @(posedge clk or posedge areset) begin
        if(areset)
            state<=left;
        else
            state<=next_state;
    end
    assign walk_left=(state==left);
    assign walk_right=(state==right);
    assign aaah=(state==fall_l)||(state==fall_r);
                
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值