旅鼠4-HDLbits
在老鼠左右走,碰墙翻转,挖坑,掉落之外加了摔死的状态。要求掉落时长超过20个时钟并且撞地就死。
难点在于下落时长的计算,必须在2种下落状态计算是否超过20个时钟,另,计数器的位宽不方便定义很大,用int比较合适。
再者就是状态转换。
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,FALL_L=2,FALL_R=3,DIG_L=4,DIG_R=5,SPLAT=6;
reg [2:0]state,next_state;
always @(posedge clk,posedge areset)
if(areset)
state<=LEFT;
else
state<=next_state;
//20 clk counter
int cnt;
always @(posedge clk,posedge areset)
if(areset )
begin
cnt<=0;
end
else if(next_state==FALL_L || next_state==FALL_R)
begin
cnt<=cnt+1;
end
else if(cnt>20)
begin
cnt<=cnt;
end
else
cnt<=0;
always @(*)
case(state)
LEFT:next_state=ground?(dig?DIG_L:(bump_left?RIGHT:LEFT)):FALL_L;
RIGHT:next_state=ground?(dig?DIG_R:(bump_right?LEFT:RIGHT)):FALL_R;
FALL_L:next_state=ground?((cnt>20)?SPLAT:LEFT):FALL_L;
FALL_R:next_state=ground?((cnt>20)?SPLAT:RIGHT):FALL_R;
DIG_L:next_state=ground?DIG_L:FALL_L;
DIG_R:next_state=ground?DIG_R:FALL_R;
SPLAT:next_state=SPLAT;
default:next_state=3'bx;
endcase
assign walk_left=(state==LEFT && !(state==SPLAT));
assign walk_right=(state==RIGHT && !(state==SPLAT));
assign aaah=(state==FALL_L) || (state==FALL_R )&&!(state==SPLAT);
assign digging=(state==DIG_L) || (state==DIG_R)&& !(state==SPLAT);
endmodule
浙公网安备 33010602011771号