See also: Lemmings1.
In addition to walking left and right, Lemmings will fall (and presumably go "aaah!") if the ground disappears underneath them.
In addition to walking left and right and changing direction when bumped, when ground=0, the Lemming will fall and say "aaah!". When the ground reappears (ground=1), the Lemming will resume walking in the same direction as before the fall. Being bumped while falling does not affect the walking direction, and being bumped in the same cycle as ground disappears (but not yet falling), or when the ground reappears while still falling, also does not affect the walking direction.
Build a finite state machine that models this behaviour.
clkbump_leftbump_rightgroundwalk_leftwalk_rightaaah
See also: Lemmings3 and Lemmings4.
module top_module(
input clk,
input areset, // Freshly brainwashed Lemmings walk left.
input bump_left,
input bump_right,
input ground,
output walk_left,
output walk_right,
output aaah );
parameter LEFT=0, RIGHT=1,FALLL=2,FALLR=3;
//fall分出左右更有利于编程
reg [1:0]state, next_state;
//这里两位状态寄存器,必须记住!
always @(*) begin
// State transition logic
case(state)
LEFT:next_state<=ground?(bump_left?RIGHT:LEFT):FALLL;
RIGHT:next_state<=ground?(bump_right?LEFT:RIGHT):FALLR;
//这里要记得ground判定在前
FALLL:next_state<=ground?LEFT:FALLL;
FALLR:next_state<=ground?RIGHT:FALLR;
endcase
end
always @(posedge clk, posedge areset) begin
// State flip-flops with asynchronous reset
if(areset)
state<=LEFT;
else
state<=next_state;
end
// Output logic
assign walk_left = (state == LEFT);
assign walk_right = (state == RIGHT);
assign aaah=(state==FALLL||state==FALLR);
endmodule
fall分出左右是点睛之笔