Lemmings 2

江左子固發表於2024-04-14
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線上繪圖工具
有時間的話,會再做一次詳細的介紹和嘗試