|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
在做HDLBits中Lemmings4(https://hdlbits.01xz.net/wiki/Lemmings4)
想向各位前辈请教下这个程序哪里出现问题了
想法是在悬空状态下计数,CLK上升沿每到一次加一,在落地时如果计数大于21就死亡,可是计数器会出现类似于在同一个clk内多次触发的问题,仿真结果悬空状态不足21个clk也转到死亡状态。HDLbits的仿真是先给异步置零信号的,应该不会出现锁在空闲状态的吧
L是向左走,R是像右走,DL是挖掘(左),DR是挖掘(右),UGL是悬空态(左),UGR是悬空态(右),die是死亡(随便找了一个状态机内的空余状态)
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 L=3'b010,R=3'b011,DL=3'b110,DR=3'b111,UGL=3'b000,UGR=3'b001,die=3'b101;
//寄存声明
reg [2:0] s,ns;
reg [31:0] k;
reg [0:0] dead;
//下一状态
always @(posedge clk or posedge areset)
if(areset)
s<=L;
else
s<=ns;
//状态转换
always @(s or ground or dig or bump_left or bump_right or k)
case(s)
L:
begin
if(!ground)
ns=UGL;
else
if(dig)
ns=DL;
else
if(bump_left)
ns=R;
else
ns=L;
end
R:
begin
if(!ground)
ns=UGR;
else
if(dig)
ns=DR;
else
if(bump_right)
ns=L;
else
ns=R;
end
DL:
if(!ground)
ns=UGL;
else
ns=DL;
DR:
if(!ground)
ns=UGR;
else
ns=DR;
UGL:
if(ground)
begin
if(k[20:0]==21'd0)
ns=die;
else
ns=L;
end
else
ns=UGL;
UGR:
if(ground)
begin
if(k[20:0]==21'd0)
ns=die;
else
ns=R;
end
else
ns=UGR;
die:ns=die;
endcase
//输出walk
assign walk_right=(s==R);
assign walk_left=(s==L);
//输出ahhh
assign aaah=(s==UGR)||(s==UGL);
//输出digging
assign digging=(s==DL)||(s==DR);
//计数器
always @(s)
begin
if((s==UGL)||(s==UGR))
k=k<<1;
else
k=32'd1;
end
//死亡状态
endmodule
|
|