2017-02-22 56 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