verilog数据类型及应用.ppt
《verilog数据类型及应用.ppt》由会员分享,可在线阅读,更多相关《verilog数据类型及应用.ppt(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 Verilog的数据类型及逻辑系统的数据类型及逻辑系统学习学习Verilog逻辑值系统逻辑值系统学习学习Verilog中不同类的数据类型中不同类的数据类型理解每种数据类型的用途及用法理解每种数据类型的用途及用法数据类型说明的语法数据类型说明的语法学习内容:学习内容:Verilog采用的四值逻辑系统采用的四值逻辑系统0,Low,False,Logic Low,Ground,VSS,Negative Assertion1,High,True,Logic High,Power,VDD,VCC,Positive AssertionX Unknown:Occurs at Logical W
2、hich Cannot be Resolved ConflictHiZ,High Impedance,Tri-Stated,Disabled Driver(Unknown)主要数据类型主要数据类型Verilog主要有三类主要有三类(class)数据类型:数据类型:net(线网)(线网):表示器件之间的物理连接表示器件之间的物理连接register(寄存器)(寄存器):表示抽象存储元件:表示抽象存储元件parameters(参数参数):运行时的常数运行时的常数(run-time constants)net(线网)(线网)net需要被持续的驱动,驱动它的可以是门和模块。需要被持续的驱动,驱动它的可
3、以是门和模块。当当net驱动器的值发生变化时,驱动器的值发生变化时,Verilog自动的将新值传送到自动的将新值传送到net上。在例上。在例子中,线网子中,线网out由由or门驱动。当门驱动。当or门的输入信号置位时将传输到线网门的输入信号置位时将传输到线网net上。上。net类的类型(线网)类的类型(线网)有多种有多种net类型用于设计类型用于设计(design-specific)建模和工艺建模和工艺(technology-specific)建模建模没有声明的没有声明的net的缺省类型为的缺省类型为 1 位位(标量标量)wire类型。但这个类型。但这个缺省类型可由下面的编译指导改变:缺省类型
4、可由下面的编译指导改变:default_nettype net类型类型功功 能能wire,trisupply1,supply0wor,triorwand,triandtriregtri1,tri0标准内部连接线标准内部连接线(缺省缺省)电源和地电源和地多驱动源线或多驱动源线或多驱动源线与多驱动源线与能保存电荷的能保存电荷的net无驱动时上拉无驱动时上拉/下拉下拉综合编译综合编译器不支持器不支持的的net类型类型net类的类型(线网)类的类型(线网)wire类型是最常用的类型,只有连接功能。类型是最常用的类型,只有连接功能。wire和和tri类型有相同的功能。用户可根据需要将线网定义为类型有相同
5、的功能。用户可根据需要将线网定义为wire或或tri以提高可以提高可读性。例如,可以用读性。例如,可以用tri类型表示一个类型表示一个net有多个驱动源。或者将一个有多个驱动源。或者将一个net声明为声明为tri以指示这个以指示这个net可以是高阻态可以是高阻态Z(hign-impedance)。可推广至。可推广至wand和和triand、wor和和triorwand、wor有线逻辑功能;与有线逻辑功能;与wire的区别见下页的表。的区别见下页的表。trireg类型很象类型很象wire类型,但类型,但trireg类型在没有驱动时保持以前的值。这个值的类型在没有驱动时保持以前的值。这个值的强度随
6、时间减弱。强度随时间减弱。修改修改net缺省类型的编译指导:缺省类型的编译指导:default_nettype nettype不能是不能是supply1和和supply0。net类在发生逻辑冲突时的决断类在发生逻辑冲突时的决断 Verilog有预定义的决断函数有预定义的决断函数支持与工艺无关的逻辑冲突决断支持与工艺无关的逻辑冲突决断wire-and用于集电极开路电路用于集电极开路电路wire-or用于射极耦合电路用于射极耦合电路寄存器类寄存器类(register)寄存器类型在赋新值以前保持原值寄存器类型在赋新值以前保持原值寄存器类型大量应用于行为模型描述及激励描述。在下面的例子中,寄存器类型大
7、量应用于行为模型描述及激励描述。在下面的例子中,reg_a、reg_b、reg_sel用于施加激励给用于施加激励给2:1多路器。多路器。用行为描述结构给寄存器类型赋值。给用行为描述结构给寄存器类型赋值。给reg类型赋值是在过程块中。类型赋值是在过程块中。寄存器类的类型寄存器类的类型寄存器类有四种数据类型寄存器类有四种数据类型寄存器类型 功能 reg 可定义的无符号整数变量,可以是标量(1位)或矢量,是 最常用的寄存器类型 integer 32位有符号整数变量,算术操作产生二进制补码形式的 结果。通常用作不会由硬件实现的的数据处理。real 双精度的带符号浮点变量,用法与integer相同。ti
8、me 64位无符号整数变量,用于仿真时间的保存与处理realtime 与real内容一致,但可以用作实数仿真时间的保存与 处理不要混淆寄存器数据类型与结构级存储元件,如不要混淆寄存器数据类型与结构级存储元件,如udp_dffVerilog中中net和和register声明语法声明语法net声明声明 range delay,net_name;net_type:net类型类型range:矢量范围,以矢量范围,以MSB:LSB格式格式delay:定义与定义与net相关的延时相关的延时net_name:net名称,一次可定义多个名称,一次可定义多个net,用逗号分开。用逗号分开。寄存器声明寄存器声明
9、range,reg_name;reg_type:寄存器类型:寄存器类型range:矢量范围,以矢量范围,以MSB:LSB格式。只对格式。只对reg类型有效类型有效reg_name:寄存器名称,一次可定义多个寄存器,用逗号分开:寄存器名称,一次可定义多个寄存器,用逗号分开Verilog中中net和和register声明语法声明语法举例:举例:reg a;/一个标量寄存器一个标量寄存器wand w;/一个标量一个标量wand类型类型netreg 3:0 v;/从从MSB到到LSB的的4位寄存器向量位寄存器向量reg 7:0 m,n;/两个两个8位寄存器位寄存器tri 15:0 busa;/16位三
10、态总线位三态总线wire 0:31 w1,w2;/两个两个32位位wire,MSB为为bit0选择正确的数据类型选择正确的数据类型module top;wire y;reg a,b;DUT u1(y,a,b);initial begina=0;b=0;#5 a=1;endendmodulemodule DUT(Y,A,B);output Y;input A,B;wire Y,A,B;and(Y,A,B);endmodule输入端口可以由输入端口可以由net/register驱动,但输驱动,但输入端口只能是入端口只能是net输出端口可以是输出端口可以是net/register类型,输出类型,输出
11、端口只能驱动端口只能驱动net在过程块中只能给在过程块中只能给register类型赋值类型赋值若若Y,A,B说明为说明为reg则会产生错误。则会产生错误。in1in2OABY双向端口输入双向端口输入/输出输出只能是只能是net类型类型选择数据类型时常犯的错误选择数据类型时常犯的错误用过程语句给一个用过程语句给一个net类型的或忘记声明类型的信号赋值。类型的或忘记声明类型的信号赋值。信息:信息:illegal assignment.将实例的输出连接到声明为将实例的输出连接到声明为register类型的信号上。类型的信号上。信息:信息:has illegal output port specifi
12、cation.将模块的输入信号声明为将模块的输入信号声明为register类型。类型。信息:信息:incompatible declaration,下面所列是常出的错误及相应的错误信息下面所列是常出的错误及相应的错误信息(error message)信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。信号。对于端口信号,输入端口只能是对于端口信号,输入端口只能是net类型。输出端口可以是类型。输出端口可以是net类型,也可以是类型,也可以是register类型。若类型。若输出端
13、口在过程块中赋值则为输出端口在过程块中赋值则为register类型;若在过程块外赋值类型;若在过程块外赋值(包括实例化语句),则为包括实例化语句),则为net类类型。型。内部信号类型与输出端口相同,可以是内部信号类型与输出端口相同,可以是net或或register类型。判断方法也与输出端口相同。若在类型。判断方法也与输出端口相同。若在过程块中赋值,则为过程块中赋值,则为register类型;若在过程块外赋值,则为类型;若在过程块外赋值,则为net类型。类型。若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情
14、况是有可能出现的,如决断信号。这时需要一个中间信号转换。号。这时需要一个中间信号转换。信号类型确定方法总结如下:信号类型确定方法总结如下:选择数据类型时常犯的错误举例选择数据类型时常犯的错误举例修改前:修改前:module example(o1,o2,a,b,c,d);input a,b,c,d;output o1,o2;reg c,d;reg o2 and u1(o2,c,d);always(a or b)if(a)o1=b;else o1=0;endmodule修改后:修改后:module example(o1,o2,a,b,c,d);input a,b,c,d;output o1,o2;
15、/reg c,d;/reg o2 reg o1;and u1(o2,c,d);always(a or b)if(a)o1=b;else o1=0;endmoduleexample.v选择数据类型时常犯的错误举例选择数据类型时常犯的错误举例Compiling source file example.vError!Illegal left-hand-side assignment Verilog-ILHSA example.v,11:o1=b;Error!Illegal left-hand-side assignment Verilog-ILHSA example.v,12:o1=0;2 erro
16、rs第一次编译信息第一次编译信息verilog c example.v第二次编译信息第二次编译信息Compiling source file example.vError!Incompatible declaration,(c)defined as input at line 2 Verilog-IDDIL example.v,5:Error!Incompatible declaration,(d)defined as input at line 2 Verilog-IDDIL example.v,5:Error!Gate(u1)has illegal output specification
17、 Verilog-GHIOS example.v,8:3 errors参数(参数(parameters)用参数声明一个可变常量,常用于定义延时及宽度变量。用参数声明一个可变常量,常用于定义延时及宽度变量。参数定义的语法:参数定义的语法:parameter ;可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。在使用文字在使用文字(literal)的地方都可以使用参数。的地方都可以使用参数。参数的定义是局部的,只在当前模块中有效。参数的定义是局部的,只在当前模块中有效。参数定义可使用以前定义的整数和实数参数。参数定义可使用以前定义的整数和实数参数。module mod1(out,in
18、1,in2);.parameter cycle=20,prop_ del=3,setup=cycle/2-prop_del,p1=8,x_ word=16bx,file=/usr1/jdough/design/mem_ file.dat;.wire p1:0 w1;/A wire declaration using parameter .endmodule注意注意:参数:参数file不是不是string,而是一个整数,其值是所有而是一个整数,其值是所有字母的扩展字母的扩展ASCII值。若值。若file=“AB”,则,则file值为值为8h4142。用法:。用法:$fopen(file);$di
19、splay(“%s”,file);参数重载(参数重载(overriding)可用可用defparam语句在编译时重载参数值。语句在编译时重载参数值。defparam语句引用参数的层次化名称语句引用参数的层次化名称使用使用defparam语句可单独重载任何参数值。语句可单独重载任何参数值。Defparam语句语句(现在综合工具还不支持)(现在综合工具还不支持)module mod1(out,in1,in2);.parameter p1=8,real_constant=2.039,x_word=16bx,file=/usr1/jdough/design/mem_file.dat;.endmodul
20、emodule test;.mod1 I1(out,in1,in2);defparam I1.p1=6,I1.file=./my_mem.dat;.endmodule参数重载(参数重载(overriding)module mod1(out,in1,in2);.parameter p1=8,real_constant=2.039,x_word=16bx,file=/usr1/jdough/design/mem_file.dat;.endmodulemodule top;.mod1#(5,3.0,16bx,./my_mem.dat)I1(out,in1,in2);.endmodule模块实例化时参
21、数重载模块实例化时参数重载使用#次序与原说明相同不需要给所有参数赋新值,但不能跳跃赋值,假设模块MOD顺序定义三个参数a,b,c,则:MOD u1#(a,b)(.);MOD u2#(a)(.);MOD u3#(a,c)(.);MOD u4#(,b,c)(.);为什么编译器认为什么编译器认为这是参数而不为这是参数而不是延时呢?是延时呢?因为因为#说明延时的时候只能用说明延时的时候只能用于于gategate或过程语句,不能用于或过程语句,不能用于模块实例。模块实例。gategate(primitives)primitives)在实例化时只在实例化时只能有延时,不能有模块参数。能有延时,不能有模块参
22、数。寄存器数组寄存器数组(Register Arrays)在在Verilog中可以说明一个寄存器数组。中可以说明一个寄存器数组。integer NUMS 7:0;/包含包含8个整数数组变量个整数数组变量 time t_vals 3:0;/4个时间数组变量个时间数组变量reg类型的数组通常用于描述存储器类型的数组通常用于描述存储器 其语法为:其语法为:reg MSB:LSB first_addr:last_addr;MSB:LSB定义存储器字的位数定义存储器字的位数 first_addr:last_addr定义存储器的深度定义存储器的深度 例如:例如:reg 15:0 MEM 0:1023;/1
23、K x 16存储器存储器 reg 7:0 PREP hFFFE:hFFFF;/2 x 8存储器存储器描述存储器时可以使用参数或任何合法表达式描述存储器时可以使用参数或任何合法表达式 parameter wordsize=16;parameter memsize=1024;reg wordsize-1:0 MEM3 memsize-1:0;存储器寻址存储器寻址(Memory addressing)存储器元素可以通过存储器索引(存储器元素可以通过存储器索引(index)寻址,也就是给出元素在存储器的寻址,也就是给出元素在存储器的位置来寻址。位置来寻址。mem_name addr_exprVeril
24、og不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存储器中一个字的位寻址。储器中一个字的位寻址。module mems;reg 8:1 mema 0:255;/declare memory called memareg 8:1 mem_word;/temp register called mem_ word.initial begin$displayb(mema5);/显示存储器中第显示存储器中第6个字的内容个字的内容 mem_word=mema5;$displayb(mem_word8);/显示第显示第6个字的最高有效位个字
25、的最高有效位 endendmodule若要对存储器字的某些位存取,若要对存储器字的某些位存取,只能通过暂存器传递只能通过暂存器传递复习复习(review)问题:问题:1.在在Verilog中,什么情况下输出端会输出中,什么情况下输出端会输出X值?值?和和register类型的主要区别是什么?类型的主要区别是什么?3.在在Verilog中如何定义一个常数?中如何定义一个常数?解答:解答:1.若输出端输出若输出端输出X值,值,一种可能是输出一种可能是输出net上发生驱动冲突,二上发生驱动冲突,二是由一个未知值传递到是由一个未知值传递到net上引起。上引起。2.register有存储功能,而有存储功
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 数据类型 应用
限制150内