------------恢复内容开始------------
虽然旅鼠可以行走、跌倒和挖掘,但旅鼠并非无懈可击。 如果旅鼠跌落太久然后撞到地面,它可能会飞溅。 特别是,如果 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
------------恢复内容结束------------
浙公网安备 33010602011771号