我設計了一個簡單的計數器。以下代碼爲 。模擬和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。