我设计了一个简单的计数器。 下面的代码。
input sig;
reg [3:0] cnt;
always @(sig) begin
if(sig)
cnt = cnt + 1;
end
使用Modelsim进行模拟可以正常工作。当sig为高时,我在fpga(Spartan 6 by ise 14.7)上实现了代码,计数器连续计数!!! 抱歉我的英语不好。
答案 0 :(得分:3)
你说模型上的模拟“工作正常”,但没有说明你如何定义“正确”。我模拟它并没有任何有趣的事情发生:cnt
仍然在4'bx
,因为你没有机制来初始化它。我想你希望cnt
在sig
的每个上升沿递增cnt
。如果您初始化cnt
(请参阅注释掉的代码),则会发生这种情况:
https://www.edaplayground.com/x/4zXf
然而,虽然这个代码可以合成,但这不是同步设计,因此它合成了无意义(加法器和四个锁存器)。假设您需要sig
在always @(posedge sig)
cnt <= cnt + 1;
的每个上升沿递增,您需要同步递增此设计 :
4'bx
这将合成加法器和四个D型触发器。
重置计数器是正常的,因为否则在实际硬件中计数器将具有未知值(因此模拟中的cnt
)。您可以在FPGA中初始化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
或$(document).ready(function () {
$('<img src="/wp-content/uploads/2017/01/MachineLearning_hoverx2.png">');
$('<img src="/wp-content/uploads/2017/01/MachineLearningx2.png">');
});
或类似的东西。这个名字表明你可能不熟悉同步设计。如果是这样,您应该了解相关信息,并且还应该阅读此答案here。