除了走路和摔倒之外,旅鼠有时会被告知做一些有用的事情,比如挖掘(当 dig=1 )。 如果旅鼠当前在地面上行走( ground=1 并且没有下落),它可以挖掘,并且会继续挖掘直到它到达另一边( ground=0 )。 到那时,由于没有地面,它会掉下来(啊啊!),然后一旦再次撞到地面,就继续沿原来的方向行走。 与坠落一样,挖掘时被撞到没有效果,并且在坠落或没有地面时被告知要挖掘被忽略。

(换句话说,行走的旅鼠可以跌倒、挖掘或切换方向。如果满足这些条件中的一个以上,则跌倒的优先级高于 dig,而 dig 的优先级高于切换方向。)

扩展您的有限状态机来模拟这种行为。

 

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 RIGHT=2'b00,LEFT=2'b01,FALL=2'b10,DIG=2'b11;
    reg [1:0]state,nstate;
    reg remain;

    always@(*)
        case(state)

//使用三目运算符
            RIGHT:nstate=ground==0 ? FALL:(dig ? DIG:(bump_right ? LEFT:RIGHT));
            LEFT: nstate=ground==0 ? FALL:(dig ? DIG:(bump_left  ? RIGHT:LEFT));
            FALL: nstate=ground==1 ? (remain ? LEFT:RIGHT):FALL;
            DIG:  nstate=ground==0 ? FALL:DIG;
            default:nstate=LEFT;
        endcase
    always@(posedge clk or posedge areset)
        begin
            if(areset)
                state<=LEFT;
            else
                state<=nstate;
        end
    always@(posedge clk)
        begin
            if(state==RIGHT && (ground==0||dig==1))
                remain<=0;
            else if(state==LEFT && (ground==0||dig==1))
                remain<=1;
            else
                remain<=remain;   
        end
    assign walk_right=(state==RIGHT);
    assign walk_left =(state==LEFT);
    assign aaah=(state==FALL);
    assign digging=(state==DIG);
endmodule

 

posted on 2022-05-10 12:12  USSTer  阅读(93)  评论(0)    收藏  举报