这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » Verilog的常数的声明(parameter和define)

共4条 1/1 1 跳转至

Verilog的常数的声明(parameter和define)

专家
2009-03-18 17:19:35     打赏

Verilog常数的声明(parameterdefine

1、语法
声明:
parameter xx = yy;
`define XX YY

使用:
xx
`XX

2、作用域
parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。

如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
`ifndef xx
 `define xx yy // or parameter xx = yy;
`endif

`define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。

3、作用
parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文

 

 

数字声明

Verilog中有两种数字生命:指明位数的数字不指明位数的数字

指明位数的数字表示形式:<size>’<base format><number>

Size用来指明数字位宽度,只能用十进制整数表示

Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)

例如

4’b1111       //4位2进制数

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)后

       LinePeriod = "010000010000"

H_SyncPulse = "01111000"

H_BackPorch = "0000010000"

H_ActivePix = "00000000000000000000001011000010"

 

   可以看出12’d 不是表示有12位十进制,而是表示有12位二进制。如果没有限定位数,ISE综合时默认为32位,所以编Verilog的时候不要超过32位。

   如果限定多余32位的话,综合时会报错。

 

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)           Verilogparameterdefine 

http://www.rickysu.com/bo/post/57/ 

2)           Verilog HDL语法基础(1)

http://blog.21ic.com/user1/5196/archives/2008/50766.html




关键词: Verilog     常数     声明     parameter     d    

助工
2009-03-19 09:19:19     打赏
2楼
学习了!

助工
2009-03-19 09:46:11     打赏
3楼
没有看明白,那个parameter LinePeriod =12'd1040;编译出来后为什么会是010000010000,中间的04是用8位的前后的1,0用的却是2位难道头尾要舍去一些数位吗?那个parameter H_SyncPulse=8'd120;怎么会编译出来H_SyncPulse = "01111000" 搞不懂,看来要好好学习一下了

高工
2009-03-19 16:59:06     打赏
4楼

回风语者:估计你给看错了,是12'd1040和8'd120,这是十进制表示,不是十六进制,所以当然是010000010000和01111000了。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]