------------恢复内容开始------------

虽然旅鼠可以行走、跌倒和挖掘,但旅鼠并非无懈可击。 如果旅鼠跌落太久然后撞到地面,它可能会飞溅。 特别是,如果 Lemming 跌落超过 20 个时钟周期然后撞到地面,它会飞溅并停止行走、跌落或挖掘(所有 4 个输出变为 0),永远(或直到 FSM 重置)。 旅鼠在落地前可以坠落的距离没有上限。 旅鼠只有在落地时才会飞溅; 它们不会在半空中飞溅。

扩展您的有限状态机来模拟这种行为。跌倒20个周期是可以生存的:

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 );
reg [2:0]state ,nstate;
    reg remain;
//i用来计数,本来5位就可以描述十进制的20了,但实际运行却不可以,这个取决于测试给的掉落时间,掉落时间可能会给的很大,所以,i值最好取大一点   

reg[6:0]i;  
    parameter LEFT=3'd0,RIGHT=3'd1,FALL=3'd2,DIG=3'd3,SPLAT=3'd4;
//状态转移
    always@(*)
        begin
            case(state)
                LEFT:nstate=ground==0?FALL:(dig?DIG:(bump_left?RIGHT:LEFT));
                RIGHT:nstate=ground==0?FALL:(dig?DIG:(bump_right?LEFT:RIGHT));
                FALL:nstate=ground==1?((i>20)?SPLAT:(remain?LEFT:RIGHT)):FALL;
                DIG:nstate=ground==0?FALL:DIG;
                SPLAT:nstate=SPLAT;
                default:nstate=LEFT;
            endcase
        end
    always@(posedge clk or posedge areset)
        begin
            if(areset)
                state<=LEFT ;
            else
                state<=nstate ;
        end
    //保存挖掘和跌落之前的状态
    always@(posedge clk)
        begin
            if(state==LEFT&&(dig==1||ground==0))
                remain<=1;
            else if(state==RIGHT&&(dig==1||ground==0))
                remain<=0;
            else
                remain<=remain;
        end
    //对跌落的时间进计数
    always@(posedge clk )
        begin
            if(areset)
                i<=0;
            else if(nstate==FALL)
                i<=i+1;
            else
                i<=0;
        end
    assign walk_left=(state==LEFT);
    assign walk_right=(state==RIGHT);
    assign aaah=(state==FALL);
    assign digging=(state==DIG);
endmodule

 

 

------------恢复内容结束------------

posted on 2022-05-11 09:26  USSTer  阅读(280)  评论(0)    收藏  举报