2017-02-22 53 views
-1

我设计了一个简单的计数器。以下代码为 。模拟和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高时计数器持续计数!!! 对不起我的英文不好。

回答

3

你说Modelsim上的模拟工作正常,但不指定你如何正确定义。我模拟它,并没有发生任何有趣的事情:cnt仍然在4'bx,因为你没有机制来初始化它。我想你想要cntsig的每个上升沿都递增。如果你不初始化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命名的困扰;大多数人会称之为clkclock或类似的东西。这个名字表明你可能不熟悉同步设计。如果是这样,你应该了解这一点,也应该阅读这个答案here