NO.1: Verilog 中 defparam localparam 的語法說明
今天看程序時忽然出現這樣一些東西:defparam / localparam
- parameter 是一個模塊中,常量的聲明,可進行參數傳遞和重定義
- defparam 是對已經聲明的模塊常量,在例化的時候對這個常量的數值進行修改
- localparam 是模塊內有效的定義,是局部變量,不可用於參數傳遞,也不能被重定義
定義方式如下:
defparam ParameterName = Constant Expression
localparam ParameterName = Constant Expression
參考程序如下:
altddio_in ALTDDIO_IN_component (
.datain (datain),
.inclock (inclock),
.dataout_h (sub_wire0),
.dataout_l (sub_wire1),
.aclr (1'b0),
.aset (1'b0),
.inclocken (1'b1),
.sclr (1'b0),
.sset (1'b0));
defparam
ALTDDIO_IN_component.intended_device_family = "Cyclone V",
ALTDDIO_IN_component.invert_input_clocks = "OFF",
ALTDDIO_IN_component.lpm_hint = "UNUSED",
ALTDDIO_IN_component.lpm_type = "altddio_in",
ALTDDIO_IN_component.power_up_high = "OFF",
ALTDDIO_IN_component.width = 14;
該程序是ALTDDIO_IN IP內核例化程序
程序中 defparam 的使用是對ALTDDIO IP中參數的賦值(修改),和 parameter 不同的是: defparam 是對已存在的變量進行賦值(修改),主要用於不同模塊中使用相同的變量(名),但使用的值不同,或者不同功能中相同變量(名)但又不使用相同值,這樣就需要對變量進行修改後使用,這時 defparam 就起作用了。
parameter 主要用來定義常量標識符,類似C語言的宏定義;增加程序的的可讀性和可維護性;參數型常量經常用於定義延遲時間和變量寬度。在模塊和實例引用時,可以通過參數傳遞改變在被引用模塊或實例中已經定義的參數。
module example
#(parameter WIDTH=8)
//
(
input [WIDTH-1:0] dataa,//[WIDTH-1:0]
input [WIDTH-1:0] datab,
output reg [WIDTH:0] result
);
parameter COUNT = 4'hf;//用於代碼部分的參數
.....
.....
.....
endmodule
NO.2: ALTDDIO IP應用
ALTDDIO_IN IP內核實現了一個DDR寄存器接口,在參考時鐘的上升和下降沿接收數據並以高低雙路輸出。全稱:雙倍數據速率IO,簡稱“D_D_io”
表1:ALTDDIO 參數設置(**對應了NO.1中 defparam 的使用**)
參數 | 說明 |
---|---|
Currently selected device family | 指定所使用的Altera®®器件系列。 |
Width: (bits) | 指定數據總線的寬度。 |
Asynchronous clear and asynchronous set ports | 選擇異步清零(aclr)的 Use ‘aclr’ port。選擇異步預置(aset)的Use ‘aset’ port。如果沒有使用任何異步清零選項,就選擇 Not used並指定寄存器應該高電平或低電平,可通過使能或禁用 Registers power up high來實現。 |
Synchronous clear and synchronous set ports | 選擇同步清零(sclr)的 Use ‘sclr’ port。選擇同步預置(sset)的Use ‘sset’ port。如果沒有使用任何同步清零選項,就選擇Not used。同步復位選項僅適用於Arria GX、Stratix III、Stratix II、Stratix II GX、Stratix、Stratix GX、HardCopy II和HardCopy Stratix器件。 |
Use ‘inclocken’ port | 打開這一選項,添加一個clock enable端口,對數據輸入開始計時時進行控制。該信號防止數據被傳遞。 |
Invert input clock | 使能時,數據的第一個比特在輸入時鐘的上升沿被採集。如果沒有使能,那麼數據的第一個比特在輸入時鐘的下降沿被採集。 |
DDRin I/O 配置
注: 在時鐘的下降沿,負邊沿觸發寄存器BI獲取第一個數據比特。在相應的時鐘的上升沿,正邊沿觸發寄存器AI獲取第二個數據比特。對於成功傳輸到邏輯陣列的數據,鎖存CI將寄存器BI的數據同步到時鐘的正邊沿。
DDRin I/O 時序
注:該圖顯示了輸入路徑的功能時序波形。信號名是ALTDDIO_IN IP內核使用的端口名。datain信號是管腳到DDR電路的輸入。寄存器BI的輸出是neg_reg_out。鎖存器CI的輸出是dataout_1,而寄存器AI的輸出是dataout_h。dataout_h和dataout_l驅動邏輯陣列並顯示DDR實現與正邊沿觸發數據之間的數據轉換。
ALTDDIO_IN IP內核信號
表2:ALTDDIO_IN IP內核的輸入和輸出端口: