verilog always块模拟与合成的差异
我设计了一个简单的计数器。 下面是代码verilog always块模拟与合成的差异,verilog,fpga,Verilog,Fpga,我设计了一个简单的计数器。 下面是代码 input sig; reg [3:0] cnt; always @(sig) begin if(sig) cnt = cnt + 1; end 使用Modelsim进行的仿真工作正常。我在fpga上实现了这段代码(ISE14.7的Spartan6),当sig很高时,计数器会连续计数!!!? 很抱歉我的英语不好。您说Modelsim上的模拟“工作正常”,但没有说明如何定义“正确”。我模拟了它,但没有发生任何有趣的事情:cnt保持
input sig;
reg [3:0] cnt;
always @(sig) begin
if(sig)
cnt = cnt + 1;
end
使用Modelsim进行的仿真工作正常。我在fpga上实现了这段代码(ISE14.7的Spartan6),当sig很高时,计数器会连续计数!!!?
很抱歉我的英语不好。您说Modelsim上的模拟“工作正常”,但没有说明如何定义“正确”。我模拟了它,但没有发生任何有趣的事情:
cnt
保持在4'bx
位置,因为您没有初始化它的机制。我可以想象,您打算cnt
在sig
的每个上升沿上递增。如果您初始化了cnt
(请参阅注释掉的代码),则会发生这种情况:
然而,虽然此代码可以合成,但这不是同步设计,因此它合成为无意义(一个加法器和四个锁存器)。假设您确实需要cnt
在sig
的每个上升沿上递增,您需要同步递增此设计:
<>但你可能需要考虑复位信号:
always @(posedge sig, posedge reset)
if(reset)
cnt <= 4'b0; // or some other reset value
else
cnt <= cnt + 1;
始终@(posedge信号,posedge重置)
如果(重置)
碳纳米管
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;