Lemmings 4

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
posted @ 2024-04-15 02:28  江左子固  阅读(38)  评论(0编辑  收藏  举报