1、这个题多了一个下坠伤害,倒是不难,注意题目中给定下落时间是无限的,如果time位宽太少就会导致如果下落的时间太长就会time变成0的情况。所以要把计数器的位宽定义的长一点(其实这样也不严谨,也会有出问题的概率)。
2、然后其他输出是根据当前状态进行输出。ahhh就不用放在时序逻辑里面了 放在正常的assign里面进行赋值就行。
完整代码如下:
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,fs=6;
reg[2:0] state,next_state;
reg[6:0] count;//这里题目说下落时间可以是无限的,如果设置的位宽太短就有问题
always@(posedge clk)begin
if(ground)begin
count<=0;
end
else begin
count<=count+1;
end
end
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)?((count>20)?fs:left):fl;//如果有地面就接着走没有就接着降落
fr:next_state=(ground)?((count>20)?fs:right):fr;
dl:next_state=(ground)?dl:fl;//如果由地面就接着挖,直到没有地面。
dr:next_state=(ground)?dr:fr;
fs:next_state=fs;
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);
assign aaah=(state==fl)|(state==fr);
endmodule