利用有限状态机实现一个小游戏,共四节。本节为第一节
题目介绍
原题地址:https://hdlbits.01xz.net/wiki/Lemmings1
题目介绍:
游戏《Lemmings》涉及到拥有相当简单大脑的小动物。它们的大脑如此简单,以至于我们要使用有限状态机来对其进行建模。
在《Lemmings》的二维世界中,Lemmings可以处于两种状态之一:向左行走或向右行走。如果它们遇到障碍物,它们会改变行进方向。具体而言,如果一个Lemming被从左边碰撞,它将向右行走。如果被从右边碰撞,它将向左行走。如果同时被两边碰撞,它仍然会改变行进方向。 请实现一个具有两个状态、两个输入和一个输出的Moore状态机,以模拟这种行为.
题目解析
首先根据题目,lemmings有两种状态,我们可以设置为LEFT,RIGHT。
直接采用三段式写法:状态转移逻辑块、组合逻辑块、输出逻辑块。
答案解析
首先是输入输出以及参数的定义,输入时钟clk,复位areset,以及向左碰撞
bump_left,向右碰撞bump_right,输出包括向左行走walk_left和向右行走walk_right
状态为LEFT,RIGHT;
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, ...
parameter LEFT=0, RIGHT=1;
reg state, next_state;;
然后是状态转移逻辑块,下一个状态next_state分别在碰到墙壁后转向相反的方向
我们只需要写一个三目判断语句判断其是否碰到墙壁即可;
always @(*) begin
if(state)// State transition logic
next_state<=bump_right?LEFT:RIGHT;
else
next_state<=bump_left?RIGHT:LEFT;
end
然后是组合逻辑块,复位时默认为LEFT,否则就进入下一个状态;
always @(posedge clk, posedge areset) begin
// State flip-flops with asynchronous reset
if(areset)
state<=LEFT;
else
state<=next_state;
end
最后是输出块,向左和向右行走分别在LEFT和RIGHT状态下即可;
assign walk_left=(state==LEFT);
assign walk_right=(state==RIGHT);
endmodule