verilog求助 20
自己编的小程序,EN1和EN2是两个按键,按下的时候从低电平变为高电平,按下EN1一次,实现加一,按下EN2一次,实现减一。modulejifen(EN1,EN2,sco...
自己编的小程序,EN1和EN2是两个按键,按下的时候从低电平变为高电平,按下EN1一次,实现加一,按下EN2一次,实现减一。
module jifen(EN1,EN2,score);
input EN1,EN2;
output [3:0] score;
reg [3:0] score;
always@(posedge EN1 or posedge EN2)
begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
endendmodule
编译能通过,但是功能仿真时总是出现22处类似下面的错误
Error: Zero-time oscillation in node
"|jifen|comb~2" at time 20.0 ns.
Check the design or vector source file
for combinational loop.
百思不得其解,望各位大侠帮忙。不胜感激 展开
module jifen(EN1,EN2,score);
input EN1,EN2;
output [3:0] score;
reg [3:0] score;
always@(posedge EN1 or posedge EN2)
begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
endendmodule
编译能通过,但是功能仿真时总是出现22处类似下面的错误
Error: Zero-time oscillation in node
"|jifen|comb~2" at time 20.0 ns.
Check the design or vector source file
for combinational loop.
百思不得其解,望各位大侠帮忙。不胜感激 展开
4个回答
展开全部
你的输出score没有初始化,既没有赋初值;再者程序中应该有复位信号。试一试下面的:
module jifen(EN1,EN2,reset,score);
input EN1,EN2,reset;
output [3:0] score;
reg [3:0] score;
always@(posedge EN1 or posedge EN2 or negedge reset)
begin
if(!reset)
begin
score<=4'b0000; //赋初值
end
else
begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
endendmodule
module jifen(EN1,EN2,reset,score);
input EN1,EN2,reset;
output [3:0] score;
reg [3:0] score;
always@(posedge EN1 or posedge EN2 or negedge reset)
begin
if(!reset)
begin
score<=4'b0000; //赋初值
end
else
begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
endendmodule
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单,你没有赋初值,你将score赋一个初值就OK了,最好添加一个异步清零信号
如rst_n
if(!rst_n)
score <= 4'b0;
如rst_n
if(!rst_n)
score <= 4'b0;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
module jifen(clk,rst,EN1,EN2,score);
input EN1,EN2;
input clk,rst;
output [3:0] score;
reg [3:0] score;
always@(posedge clk or posedge rst)
begin
if(rst)score<=0;
else begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
end
endmodule
这样改完就可以了,你的敏感列表不对,时钟也不对。
input EN1,EN2;
input clk,rst;
output [3:0] score;
reg [3:0] score;
always@(posedge clk or posedge rst)
begin
if(rst)score<=0;
else begin
if(EN1)
score<=score+1'b1;
else
begin
if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
end
endmodule
这样改完就可以了,你的敏感列表不对,时钟也不对。
更多追问追答
追问
能否详细赐教一下,我原来的敏感列表有什么问题?多谢大神
追答
1、你比如要用clk作为时钟,你的begin end之间就不可能出线clk这个词对吧,敏感列表里用的posedge en1和posedge en2,而begin end之间又加了对这两个信号的判断。
2、计数器肯定是时序逻辑,也就是用触发器的,而这些触发器只可能有一个时钟,你上面的意思是en2和en1都是作为时钟,肯定就矛盾了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
module jifen(clk,rst,EN1,EN2,score);
input EN1,EN2;
input clk,rst;
output [3:0] score;
reg [3:0] score;
always@(posedge clk or negedge rst)
begin
if(!rst)score<=0;
else begin
if(EN1)
score<=score+1'b1;
else if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
endmodule
我觉得还是这样改比较好比较好
input EN1,EN2;
input clk,rst;
output [3:0] score;
reg [3:0] score;
always@(posedge clk or negedge rst)
begin
if(!rst)score<=0;
else begin
if(EN1)
score<=score+1'b1;
else if(EN2)
score<=score-1'b1;
else
score<=score;
end
end
endmodule
我觉得还是这样改比较好比较好
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询