[Actel FPGA] Verilog的常数的声明(parameter和define)

[复制链接]
2950|0
 楼主| 蹦蹦车 发表于 2009-3-20 10:21 | 显示全部楼层 |阅读模式
1、语法<br />声明:<br />parameter&nbsp;xx&nbsp;=&nbsp;yy;<br />`define&nbsp;XX&nbsp;YY<br /><br />使用:<br />xx<br />`XX<br /><br />2、作用域<br />parameter&nbsp;作用于声明的那个文件;`define&nbsp;从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。<br /><br />如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:<br />`ifndef&nbsp;xx<br />&nbsp;`define&nbsp;xx&nbsp;yy&nbsp;//&nbsp;or&nbsp;parameter&nbsp;xx&nbsp;=&nbsp;yy;<br />`endif<br /><br />`define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。<br /><br />3、作用<br />parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文&nbsp;<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />数字声明<br /><br />Verilog中有两种数字生命:指明位数的数字和不指明位数的数字<br /><br />指明位数的数字表示形式:&ltsize&gt’&ltbase&nbsp;format&gt&ltnumber&gt<br /><br />Size用来指明数字位宽度,只能用十进制整数表示<br /><br />Base&nbsp;format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)<br /><br />例如<br /><br />4’b1111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//4位2进制数<br /><br />12’h3ac&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />要注意的是这不是表示12位16进制数,表示12位二进制显示是16进制数<br /><br />&nbsp;<br /><br />例子<br /><br />parameter&nbsp;LinePeriod&nbsp;=12'd1040;<br /><br />parameter&nbsp;H_SyncPulse=8'd120;<br /><br />parameter&nbsp;H_BackPorch=10'd1040;<br /><br />parameter&nbsp;H_ActivePix=706;<br /><br />&nbsp;<br /><br />综合(Synthesize)后<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinePeriod&nbsp;=&nbsp;&quot;010000010000&quot;<br /><br />H_SyncPulse&nbsp;=&nbsp;&quot;01111000&quot;&nbsp;<br /><br />H_BackPorch&nbsp;=&nbsp;&quot;0000010000&quot;<br /><br />H_ActivePix&nbsp;=&nbsp;&quot;00000000000000000000001011000010&quot;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;可以看出12’d&nbsp;不是表示有12位十进制,而是表示有12位二进制。如果没有限定位数,ISE综合时默认为32位,所以编Verilog的时候不要超过32位。<br /><br />&nbsp;&nbsp;&nbsp;如果限定多余32位的话,综合时会报错。<br /><br />如&nbsp;<br /><br />&nbsp;<br /><br />parameter&nbsp;H_ActivePix=33'b706;<br /><br />&nbsp;<br /><br />会报错,报错信息如下:<br /><br />&nbsp;<br /><br />ERROR:HDLCompilers:34&nbsp;-&nbsp;&quot;VGA_800X600.v&quot;&nbsp;line&nbsp;19&nbsp;Illegal&nbsp;digit(s)&nbsp;in&nbsp;binary&nbsp;constant&nbsp;'706'<br /><br />&nbsp;<br /><br />还有注意的一个问题是LinePeriod和H_BackPorch都是1040(十进制),1040二进制为11位(2的十次方为1024),但“H_BackPorch”没有因为位数不够报错,但是把高位截掉了,变成“0000010000”,所以在Verilog编程的时候要注意赋值问题。<br /><br />&nbsp;<br /><br />不限定位数,默认为32位,这很浪费寄存器资源。<br /><br />限定位数小于常数的位数时,赋值就不正确了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;所以赋值的位数要有富裕但不至于太浪费寄存器资源。<br /><br />&nbsp;<br /><br />&nbsp;<br /><br />参考资料:<br /><br />1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Verilog的parameter和define&nbsp;&nbsp;<br /><br />http://www.rickysu.com/bo/post/57/&nbsp;&nbsp;<br /><br />2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Verilog&nbsp;HDL语法基础(1)<br /><br />http://blog.21ic.com/user1/5196/archives/2008/50766.html&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

106

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部