2012-03-19 54 views
2

我對FPGA和Verilog非常陌生,但我遇到了讓我的代碼在模擬器中以我期望的方式運行的問題。看來Isim模擬器並不是在我的代碼中對整數進行「操作」。以下是相關代碼的一部分。我試圖通過在每次達到10的整數時切換SCK_gen來分割clk脈衝。當我在Isim中運行此代碼時,SCK_gen永遠不會更改值。另外,當我在FPGA上實現代碼時,它的行爲與我所期望的相同,我可以觀察到時鐘頻率爲1/10的脈衝。如果任何人都能指出我的方向,我會很感激。謝謝Xilinx,Isim處理Verilog整數類型的仿真

//signals 
//for SCK_clock 
reg SCK_gen, SCK_hold; 
integer i; 
reg en_SCK; 
wire neg_edge_SCK; 


//SCK_generator 
always @(posedge clk, posedge reset) 
    if (reset) 
     begin 
      SCK_gen <= 0; 
     end 
    else 
     begin 
      i <= i+1; 
      SCK_hold <= SCK_gen; 
       if(i == 10) 
        begin 
         SCK_gen <= ~SCK_gen; 
         i <= 0; 
        end 
     end 

//detect neg edge of SCK 
assign neg_edge_SCK = SCK_hold & SCK_gen; 
+0

你對我有重置價值嗎? – 2012-03-19 18:29:55

回答

4

如果任何操作數是'x',任何算術或邏輯相等操作的結果都是'x'。由於它看起來像i未初始化,所以語句i <= i+1i沒有影響,因此比較(i == 10)將始終爲假。

+0

我發佈後,我發現了部分內容。我用** initial **語句解決了這個問題。所以,爲了看看我是否得到了正確的結果,如果你沒有爲一個reg或變量指定一個初始值,那麼在仿真中它的值是** x **,直到賦值爲止。但另一方面,當它們以硬件實現時,它們會取** 0 **值。它是否正確?還應該在硬件綜合和實施之前註釋掉我的**初始**語句,還是通常忽略這些語句? – 2012-03-19 20:28:13

+0

是的。並不總是,這恰好是您的工具鏈和目標硬件的行爲。模擬器無法從RTL描述中知道這一點,因此它將信號標記爲未知。 – 2012-03-19 22:08:44