[转]Verilog的常数的声明(parameter和define)
(2010-11-30 15:41:27)
标签:
杂谈 |
分类: FPGA |
Verilog的常数的声明(parameter和define)
1、语法
声明:
parameter xx = yy;
`define XX YY
使用:
xx
`XX
2、作用域
parameter
作用于声明的那个文件;`define
从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。
如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
`ifndef xx
`endif
`define
3、作用
parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文
数字声明
Verilog中有两种数字生命:指明位数的数字和不指明位数的数字
指明位数的数字表示形式:<size>’<base format><number>
Size用来指明数字位宽度,只能用十进制整数表示
Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)
例如
4’b1111
12’h3ac
要注意的是这不是表示12位16进制数,表示12位二进制显示是16进制数
例子
parameter LinePeriod =12'd1040;
parameter H_SyncPulse=8'd120;
parameter H_BackPorch=10'd1040;
parameter H_ActivePix=706;
综合(Synthesize)后
H_SyncPulse = "01111000"
H_BackPorch = "0000010000"
H_ActivePix =
"000000000000000000000010
如
parameter H_ActivePix=33'b706;
会报错,报错信息如下:
ERROR:HDLCompilers:34 - "VGA_800X600.v" line 19 Illegal digit(s) in binary constant '706'
还有注意的一个问题是LinePeriod和H_BackPorch都是1040(十进制),1040二进制为11位(2的十次方为1024),但“H_BackPorch”没有因为位数不够报错,但是把高位截掉了,变成“0000010000”,所以在Verilog编程的时候要注意赋值问题。
不限定位数,默认为32位,这很浪费寄存器资源。
限定位数小于常数的位数时,赋值就不正确了。
参考资料:
1)
http://www.rickysu.com/bo/post/57/
2)