1、这个题目多了一个挖掘状态,状态机的话相当于是多了两个状态(左挖和右挖),
2、这个题注意到的是状态机是根据状态来进行切换而不是跟之前是根据输入来切换状态(输入确实是有影响,但是代码上看是先看当前状态然后再看输入,之前前两个输入少可以根据输入判断状态,后面输入多的话肯定会有影响。!)
3、注意读懂题干了解状态切换。
完整代码如下:
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,fl=2,fr=3,dl=4,dr=5;
reg[2:0] state,next_state;
always@(*)begin
case(state)
left:next_state=(ground)?((dig)?dl:((bump_left)?right:left)):fl;//首先检查还有没有地面有的话就接着走没有就下落,
//然后检查有没有挖掘的信号有就挖没有就接着走,
//然后再看左边有没有撞到东西
//撞到就往反方向走否则就还按照原来的走
right:next_state=(ground)?((dig)?dr:((bump_right)?left:right)):fr;
fl:next_state=(ground)?left:fl;//如果有地面就接着走没有就接着降落
fr:next_state=(ground)?right:fr;
dl:next_state=(ground)?dl:fl;//如果由地面就接着挖,直到没有地面。
dr:next_state=(ground)?dr:fr;
endcase
end
always@(posedge clk or posedge areset)begin
if(areset)begin
state<=left;
end
else begin
state<=next_state;
end
end
assign walk_left=(state==left);
assign walk_right=(state==right);
assign digging=(state==dl)|(state==dr);
always@(posedge clk)begin
aaah<=(!ground);
end
endmodule