版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、标签: FPGA Verilog 【原创】Verilog-2001新增特性(实例分析) Verilog-2001标准在2001年就发布了,不过翻了一些Verilog书籍,对Verilog-2001的新增特性很少有提及,即使提到了,也只是寥寥数语带过,其实在Verilog-2001中做了很多有用的改进,给编程带来很大的帮助,有必要详细了解。 在Quartus II软件中现在支持的Verilog标准有三类,即Ve
2、rilog-1995,Verilog-2001,以及SystemVerilog-2005.具体用那种标准进行编译综合,需要在设置对话框中进行设置,如下图所示: 下面对Verilog-2001新增特性进行详细说明,部分说明用实例进行解析。l generate语句Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,functi
3、on,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。为此,Verilog-2001还增加了以下关键字:generate,endgenerate,genvar,localparam。genvar为新增数据类型,存储正的integer。在generate语句中使用的index必须定义成genvar类型。localparam与parameter有些类似,不过其不能通过redefinition改变值。除了可以在generate语句中使用if-else,case外,还能使用for语句进行
4、循环。下面是一个使用generate的例子,根据a_width和b_width的不同,实例化不同的multiplier。module multiplier (a, b, product);parameter a_width = 8, b_width = 8;localparam product_width = a_width+b_width;input a_width-1:0 a;input b_width-1:0 b;outputproduct_width-1:0product;generateif(a_width < 8) | (b_width < 8)CLA_multipli
5、er #(a_width, b_width)u1 (a, b, product);elseWALLACE_multiplier #(a_width, b_width)u1 (a, b, product);endgenerateendmodule在下面的例子中,在generate语句中使用了for语句。module Nbit_adder (co, sum, a, b, ci);parameter SIZE = 4;output SIZE-1:0 sum;output co;input SIZE-1:0 a, b;input ci;wire SIZE:0 c;genvar i;assign c0
6、= ci;assign co = cSIZE;generatefor(i=0; i<SIZE; i="i"+1)begin:addbitwire n1,n2,n3; /internal netsxor g1 ( n1, ai, bi);xor g2 (sumi,n1, ci);and g3 ( n2, ai, bi);and g4 ( n3, n1, ci);or g5 (ci+1,n2, n3);endendgenerateendmodulegenerate执行过程中,每一个generated net在每次循环中有唯一的名字,比如n1在4次循环中会产生如下名字:ad
7、dbit0.n1addbit1.n1addbit2.n1addbit3.n1这也是为什么在begin-end块语句需要名字的一个原因。同样,实例化的module,gate等在每次循环中也有不同的名字。addbit0.g1addbit1.g1addbit2.g1addbit3.g1l constant functionsVerilog的语法要求定义向量的宽度或数组大小时其值必须是一个确定的数字或一个常量表达式。比如:parameter WIDTH = 8;wire WIDTH-1:0 data;在Ve
8、rilog-1995标准中,常量表达式只能是基于一些常量的算术操作。而在Verilog-2001中增加了constant function,其定义与普通的function一样,不过constant function只允许操作常量。下面是一个使用constant function的例子,clogb2函数返回输入值2次方的次数。module ram (address_bus, write, select, data);parameter SIZE = 1024;input clogb2(SIZE)-1:0 address_bus;.function integer clogb2 (input in
9、teger depth);beginfor(clogb2=0; depth>0; clogb2=clogb2+1)depth = depth >> 1;endendfunction.endmodulel Indexed vector part selects在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始末数值的index需要是常量。而在Verilog-2001中,可以用变量作为index,进行part select。bas
10、e_expr +: width_expr /positive offsetbase_expr -: width_expr /negative offset其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向上递减width_expr位。例如:reg 63:0 word;reg 3:0 byte_num; /a value from 0 to 7wire 7:0 byteN = wordbyte_num*8 +: 8;如果byte_num的值为4,则word39:32赋值给byteN。l
11、160; 多维数组Verilog-1995只允许一维数组,而Verilog-2001允许多维数组。/1-dimensional array of 8-bit reg variables/(allowed in Verilog-1995 and Verilog-2001)reg 7:0 array1 0:255;wire 7:0 out1 = array1address;/3-dimensional array of 8-bit wire nets/(new for Verilog-2001)wire 7:0 a
12、rray3 0:2550:2550:15;wire 7:0 out3 = array3addr1addr2addr3;而且在Verilog-1995中不能对一维数组中取出其中的一位,比如要取出上面array175,需要将array17赋给一个reg变量比如arrayreg <= array17,再从arrayreg中取出bit5,即arrayreg5。而在Verilog-2001中,可以任意取出多维数组中的一位或连续几位,比如:/select the high-order byte of one word in a/2-dimensional array of 32-bit reg va
13、riablesreg 31:0 array2 0:2550:15;wire 7:0 out2 = array2100731:24;l 符号运算在Verilog-1995中,integer数据类型为有符号类型,而reg和wire类型为无符号类型。而且integer大小固定,即为32位数据。在Verilog-2001中对符号运算进行了如下扩展。Reg和wire变量可以定义为有符号类型:reg signed 63:0 data;wire signed 7:0 vector;input signed 31:
14、0 a;function signed 128:0 alu;函数返回类型可以定义为有符号类型。带有基数的整数也可以定义为有符号数,在基数符号前加入s符号。16'hC501 /an unsigned 16-bit hex value16'shC501 /a signed 16-bit hex value操作数可以在无符号和有符号之间转变。通过系统函数$signed和$unsigned实现。reg 63:0 a; /unsigned data typealways (a) beginresult1 = a / 2; /unsigned arithmeticresult2 = $si
15、gned(a) / 2;/signed arithmeticend增加了算术移位操作,在Verilog-1995中只有逻辑移位操作。比如D的初始值为8b10100011,则:D >> 3 /logical shift yields 8'b00010100D >>> 3 /arithmetic shift yields 8'b11110100l 指数运算Verilog-2001中增加了指数运算操作,操作符为*。always (posedge clock)r
16、esult = base * exponent;l 递归函数和任务在Verilog-2001中增加了一个新的关键字:automatic。该关键字可以让任务或函数在运行中从新调用该任务和函数。function automatic 63:0 factorial;input 31:0 n;if (n = 1)factorial = 1;elsefactorial = n * factorial(n-1);endfunctionl
17、60; 组合逻辑敏感信号通配符在组合逻辑设计中,需要在敏感信号列表中包含所有组合逻辑输入信号,以免产生锁存器。在大型的组合逻辑中比较容易遗忘一些敏感信号,因此在Verilog-2001中可以使用*包含所有的输入信号作为敏感信号。always * /combinational logic sensitivityif (sel)y = a;elsey = b;l 使用逗号隔开敏感信号Verilog-2001中可以用逗号来代替or隔开敏感信号。always (a or b or c or d
18、or sel)always (a, b, c, d, sel)l Automatic width extension beyond 32 bits在Verilog-1995中,在不指定基数的情况下为大于32位的变量赋高阻值,只能使其低32位为高阻值,其他高位会被设置为0,此时需要指定基数值才能将高位赋值为高阻。Verilog-1995:parameter WIDTH = 64;reg WIDTH-1:0 data;data = 'bz; /fills with 'h00000000zzzzzzzzdata = 64'bz; /fills with 'hzzzzzzzzzzzzzzzz而在Verilog-2001中并没有这一限制。Verilog-2001:parameter WIDTH = 64;reg WIDTH-1:0 data;data = 'bz; /fills with
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论