Lemmings 4

江左子固發表於2024-04-15
See also: Lemmings1, Lemmings2, and Lemmings3.

Although Lemmings can walk, fall, and dig, Lemmings aren't invulnerable. If a Lemming falls for too long then hits the ground, it can splatter. In particular, if a Lemming falls for more than 20 clock cycles then hits the ground, it will splatter and cease walking, falling, or digging (all 4 outputs become 0), forever (Or until the FSM gets reset). There is no upper limit on how far a Lemming can fall before hitting the ground. Lemmings only splatter when hitting the ground; they do not splatter in mid-air.

Extend your finite state machine to model this behaviour.

另請參閱:Lemmings1、Lemmings2 和 Lemmings3。

雖然旅鼠可以走路、跌倒和挖掘,但旅鼠並不是刀槍不入的。如果旅鼠跌倒時間過長然後撞到地面,它可能會飛濺。特別是,如果旅鼠跌倒超過 20 個時鐘週期然後撞到地面,它會飛濺並停止行走、跌落或挖掘(所有 4 個輸出變為 0),永遠(或直到 FSM 被重置)。旅鼠在落地之前可以跌落多遠沒有上限。旅鼠只有在落地時才會飛濺;它們不會在半空中飛濺。

擴充套件有限狀態機以對此行為進行建模。

跌倒 20 個週期是可以生存的:
題目網站
a

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 left=0,right=1,falll=2,fallr=3,digl=4,digr=5,die=6;
    reg [2:0] state,nstate;
    int counter;
   
   //狀態交換 
    always @(posedge clk or posedge areset) begin
        if(areset) 
            state <= left;
        else 
            state <= nstate;
    end
    
    //計數器
    always @(posedge clk or posedge areset) begin
        if(areset)
            counter <= 0;
        else if(nstate==fallr||nstate==falll) begin
            counter <= counter+1;
        end
        else if(counter > 20)
            counter <= counter;
        else
            counter <= 0;
    end
    
    //下一個狀態
    always @(*) begin
        case(state)
            left: nstate = ground?(dig?digl:(bump_left?right:left)):falll;
            right: nstate = ground?(dig?digr:(bump_right?left:right)):fallr;
            falll: nstate = ground?((counter>20)?die:left):falll;
            fallr: nstate = ground?((counter>20)?die:right):fallr;
            digl: nstate = ground?digl:falll;
            digr: nstate = ground?digr:fallr;
            die: nstate = die;
            default: nstate = 3'bx;
        endcase
    end
    
    //狀態輸出
    assign walk_left = (state == left)&&!(state == die);
    assign walk_right = (state == right)&&!(state == die);
    assign aaah = (state == fallr)||(state == falll)&&!(state == die);
    assign digging = (state == digr)||(state == digl)&&!(state == die);
endmodule