我设计了一个简单的计数器。以下代码为 。模拟和verilog合成之间的区别始终阻止
input sig;
reg [3:0] cnt;
always @(sig) begin
if(sig)
cnt = cnt + 1;
end
使用Modelsim进行仿真可正常工作。我在fpga上执行代码(Spartan 6 by ise 14.7),sig高时计数器持续计数!!! 对不起我的英文不好。
我设计了一个简单的计数器。以下代码为 。模拟和verilog合成之间的区别始终阻止
input sig;
reg [3:0] cnt;
always @(sig) begin
if(sig)
cnt = cnt + 1;
end
使用Modelsim进行仿真可正常工作。我在fpga上执行代码(Spartan 6 by ise 14.7),sig高时计数器持续计数!!! 对不起我的英文不好。
你说Modelsim上的模拟工作正常,但不指定你如何正确定义。我模拟它,并没有发生任何有趣的事情:cnt
仍然在4'bx
,因为你没有机制来初始化它。我想你想要cnt
在sig
的每个上升沿都递增。如果你不初始化cnt
(见注释代码)会出现这种情况:
https://www.edaplayground.com/x/4zXf
然而,尽管这个代码可以合成,这是不是一个同步设计,因此它synthesises废话(一加法器和四个锁存器)。假设你需要cnt
上的sig
每个上升沿递增,你需要增加这样的设计同步:
always @(posedge sig)
cnt <= cnt + 1;
这将合成到加法器和四个d型触发器。
复位计数器是正常的,因为否则在实际硬件中计数器将具有未知值(因此模拟中为4'bx
)。你可以逃脱在FPGA初始化cnt
:
reg [3:0] cnt = 4'b0;
,但你可能要考虑一个复位信号,而不是:
always @(posedge sig, posedge reset)
if(reset)
cnt <= 4'b0; // or some other reset value
else
cnt <= cnt + 1;
我对你的sig
命名的困扰;大多数人会称之为clk
或clock
或类似的东西。这个名字表明你可能不熟悉同步设计。如果是这样,你应该了解这一点,也应该阅读这个答案here。