Lemmings 2

See also: Lemmings1.

In addition to walking left and right, Lemmings will fall (and presumably go "aaah!") if the ground disappears underneath them.

In addition to walking left and right and changing direction when bumped, when ground=0, the Lemming will fall and say "aaah!". When the ground reappears (ground=1), the Lemming will resume walking in the same direction as before the fall. Being bumped while falling does not affect the walking direction, and being bumped in the same cycle as ground disappears (but not yet falling), or when the ground reappears while still falling, also does not affect the walking direction.

Build a finite state machine that models this behaviour.

参见:旅鼠1。

除了向左和向右走之外,如果下面的地面消失,旅鼠还会摔倒(大概会“啊啊!”)。

除了左右行走和撞到时改变方向外,当地面=0时,旅鼠还会摔倒并说“啊!当地面重新出现(地面=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 LEFT=2'b00,RIGHT=2'b01,LEFT_F=2'b10,RIGHT_F=2'b11;
    reg [3:0]state,next_state;
    wire [1:0]bump;
    assign bump={bump_left,bump_right};
    
    always@(*)begin
        case(state)
            LEFT:begin
                if(ground==1'b0)begin
                    next_state=LEFT_F;
                end
                else if(ground==1'b1)begin
                    if(bump==2'b11||bump==2'b10)begin
                    next_state=RIGHT;
                	end
                	else begin
                    next_state=LEFT;
                	end
                end
            end
            RIGHT:begin
                if(ground==1'b0)begin
                    next_state=RIGHT_F;
                end
                else if(ground==1'b1)begin
                    if(bump==2'b11||bump==2'b01)begin
                    next_state=LEFT;
                	end
                	else begin
                    next_state=RIGHT;
                	end
                end
            end
            LEFT_F:begin
                if(ground==1'b0)begin
                    next_state=LEFT_F;
                end
                else if(ground==1'b1)begin
                    next_state=LEFT;
                end
            end
            RIGHT_F:begin
                if(ground==1'b0)begin
                    next_state=RIGHT_F;
                end
                else if(ground==1'b1)begin
                    next_state=RIGHT;
                end
            end
        endcase
    end
    
    always@(posedge clk,posedge areset)begin
        if(areset)begin
            state<=LEFT;
        end
        else begin
            state<=next_state;
        end
    end
    
    assign walk_left = (state == LEFT);
    assign walk_right = (state == RIGHT); 
    assign aaah=(state==LEFT_F||state==RIGHT_F);
    
endmodule

啊

这个题目如果有状态机图,会好些很多,因为实现的方法有很多种。
自己的写法在波形图中总是有一条不匹配,所以借鉴了这个写法
CSDN写法

另外,开始逐渐复杂的状态转换图也让我想去找到一款高效的状态转换绘图软件,暂时找到了如下:
一款用于绘制状态机转换图和流程图的web在线绘图工具
有时间的话,会再做一次详细的介绍和尝试

posted @ 2024-04-14 22:43  江左子固  阅读(23)  评论(0编辑  收藏  举报