除了走路和摔倒之外,旅鼠有时会被告知做一些有用的事情,比如挖掘(当 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
浙公网安备 33010602011771号