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内核的输入和输出端口: