3.2.5.10 Lemmings 1
问题描述
Lemmings游戏涉及大脑相当简单的小动物。如此简单,我们将使用有限状态机对其进行建模。
在旅鼠的 2D 世界中,旅鼠可以处于以下两种状态之一:向左行走或向右行走。如果遇到障碍物,它会切换方向。特别是,如果 Lemming 撞到左边,它会向右走。如果它撞到右边,它会向左走。如果它同时在两侧碰撞,它仍然会切换方向。
实现一个具有两个状态、两个输入和一个输出的摩尔状态机来模拟这种行为。
代码:
module top_module(
input clk,
input areset, // Freshly brainwashed Lemmings walk left.
input bump_left,
input bump_right,
output walk_left,
output walk_right); //
// parameter LEFT=0, RIGHT=1, ...
reg state, next_state;
parameter LEFT=0, RIGHT=1;
always @(*) begin
case(state)
LEFT:begin
if(bump_left)
next_state=RIGHT;
else
next_state=LEFT;
end
RIGHT:begin
if(bump_right)
next_state=LEFT;
else
next_state=RIGHT;
end
endcase// State transition logic
end
always @(posedge clk, posedge areset) begin
if(areset)
state<=LEFT;
else
state<=next_state;// State flip-flops with asynchronous reset
end
// Output logic
assign walk_left = (state == LEFT);
assign walk_right = (state == RIGHT);
// assign walk_left = (state == ...);
// assign walk_right = (state == ...);
endmodule
3.2.5.11 Lemmings 2
问题描述
除了左右行走之外,如果地面消失在旅鼠脚下,旅鼠还会摔倒(并且可能会“啊啊!”)。
除了左右走动和碰撞时改变方向外,当ground=0时,旅鼠会摔倒并说“啊啊!”。当地面重新出现 ( ground=1 ) 时,旅鼠将继续沿与坠落前相同的方向行走。跌倒时被撞不影响行走方向,与地面消失(但尚未跌倒)同一个周期被撞,或仍在跌倒时再次出现地面时,也不影响行走方向。跌倒的优先级高于碰壁
构建一个模拟这种行为的有限状态机。
代码:
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 [1:0] left=0,right=1,fall_l=2,fall_r=3;
// 四个状态,向左、向右、向左时落下、向右时落下
reg [1:0] state,next_state;
always @(*) begin
case(state)
left:begin
if(ground==0) //先判断地面有没有消失,因为跌倒时被撞不影响行走方向,与地面消失(但尚未跌倒)同一个周期被撞
next_state=fall_l;
else if(bump_left)
next_state=right;
else
next_state=left;
end
right:begin
if(ground==0) // 地面消失(但尚未跌倒)同一个周期被撞
next_state=fall_r;
else if(bump_right)
next_state=left;
else
next_state=right;
end
fall_l:begin
if(ground)
next_state=left;
else
next_state=fall_l;
end
fall_r:begin
if(ground)
next_state=right;
else // 跌倒时被撞不影响行走方向
next_state=fall_r;
end
endcase
end
always @(posedge clk or posedge areset) begin
if(areset)
state<=left;
else
state<=next_state;
end
assign walk_left=(state==left);
assign walk_right=(state==right);
assign aaah=(state==fall_l)||(state==fall_r);
endmodule