2016-04-23 46 views
1

我學習的Verilog我的大學課程但我模塊講師離開,所以我希望在這裏一些幫助的一部分,Verilog的數據類型

一個例子,我們已經給出了一個參數n位灰色二進制代碼轉換器,如下:

module bin_n_gray #(parameter n=4) (input [n-1 : 0] gray, output [n-1 : 0] bin); 

    integer i; 
    always @ (*) 
     for(i = 0; i < n; i = i+1) 
      bin[i] = ^(gray >> i); 

endmodule 

我的問題:

由於bin[i]變量賦值語句的左手側的@ always塊內不應將此變量聲明爲output reg [n-1 : 0] bin

因爲我認爲過程塊的賦值語句左側的變量,例如always/initial應該聲明爲reg數據類型?

+0

是的,我認爲,這應該是REG類型的,因爲它是不連續分配,並且可能需要保留它的價值 –

回答

0

由於bin [i]變量位於'@ always'塊內賦值語句的左側,因此不應將此變量聲明爲'output reg [n-1:0] bin?

是的,它應該要求您說的reg,至少根據Xilinx XST。在使用該工具進行合成時(並且缺少無關分號),您的問題中給出的代碼會發生錯誤。我們首先讓我們開始理解Verilog中的程序塊是什麼(假設我們正在使用Verilog開發硬件,例如FPGA設計)。程序塊是always塊(兩種類型,組合和順序)以及其他類型的塊,我們在這裏不會介紹。首先要知道的是,在程序塊中,,允許的唯一分配是那些在左側具有reg的分配。

這並不一定意味着將創建物理寄存器/觸發器。在這種情況下,一個不會。原因是該塊的聲明爲always @ (*)。該聲明意味着該過程是組合的(即不是順序的,不具有任何內部狀態或時鐘信號)。結果,沒有物理觸發器被創建。

或者,您可以將過程塊聲明爲always @ (posedge some_clock_signal)。這意味着可以使用時序邏輯,並且可以使用物理觸發器(或其他存儲方式,例如FPGA查找表中的分佈式存儲器)。結論是,你仍然在那裏聲明爲reg,但現在你實際上正在創建寄存器。

有在您使用wire(或output)一種情況下,它是由連續的分配(例如,assign a = b & c),其落在程序塊之外。在這個例子中,我使用generate做同樣的事情循環在原始代碼:

module bin_n_gray #(parameter n=4) (input [n-1 : 0] gray, output [n-1 : 0] bin); 
    genvar i; 
    generate 
     for (i=0; i < n; i=i+1) 
     begin: graydecoder // arbitrary label needed by generate syntax 
     assign bin[i] = ^(gray >> i); 
     end 
    endgenerate 
endmodule 
+0

我很困惑!你能否以簡單的方式解釋它,因爲我只是在學習這些東西! –

+0

@AndyWest我會很高興,但不幸的是我不能在這一刻。如果我在半小時左右更新我的答案,會不會是一個問題? – hexafraction

+0

你的答案的第一部分看起來好像你說的是它應該宣佈爲reg,但第二部分看起來像你說的線很好, –