VerilogHDL语言初步.ppt

上传人:牧羊曲112 文档编号:5452050 上传时间:2023-07-08 格式:PPT 页数:237 大小:768.50KB
返回 下载 相关 举报
VerilogHDL语言初步.ppt_第1页
第1页 / 共237页
VerilogHDL语言初步.ppt_第2页
第2页 / 共237页
VerilogHDL语言初步.ppt_第3页
第3页 / 共237页
VerilogHDL语言初步.ppt_第4页
第4页 / 共237页
VerilogHDL语言初步.ppt_第5页
第5页 / 共237页
点击查看更多>>
资源描述

《VerilogHDL语言初步.ppt》由会员分享,可在线阅读,更多相关《VerilogHDL语言初步.ppt(237页珍藏版)》请在三一办公上搜索。

1、P.11,Verilog HDL语言初步,主讲杨全胜东南大学计算机科学与工程学院,计算机系统综合课程设计(2),P.12,第一部分 Verilog HDL语言1 综述,一.什么是硬件描述语言?,硬件描述语言是一种用文本形式来描述和设计电路的语言。是硬件设计人员和电子设计自动化(EDA)工具之间的界面。,P.13,功能:1)编写设计文件;2)建立电子系统行为级的仿真模型;3)自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist);4)写入到CPLD和FPGA器件中。,P.14,二.为什么要用HDL?,1、电路设计的规模越来越大,复杂度越来越高。2、电子领域的竞争越来越激烈,

2、开发周期要短。3、调试电路速度快。不必修改电路原理图原型,只需要对HDL进行修改。4、易于理解,易于维护。5、有许多易于掌握的仿真、综合和布局布线工具。,P.15,三、Bottom Up和 Top down的设计方法,1.Bottom Up的设计方法,P.16,传统的电路系统设计方法的步骤:1.采用自下而上的设计方法-从状态图的简化,写出最简逻辑表达式;2.采用通用逻辑元器件-通常采用74系列和CMOS4000系列的产品进行设计;3.在系统硬件设计的后期进行调试和仿真;只有在部分或全部硬件电路连接完毕,才可以进行电路调试,一旦考虑不周到,系统设计存在较大缺陷,则要重新设计,使设计周期延长。4.

3、设计结果是一张电路图;当设计调试完毕后,形成电原理图,该图包括元器件型号和信号之间的互连关系等等,P.17,优点:1.设计人员对于用这种方法进行设计比较熟悉;2.实现各个子块电路所需的时间短。缺点:1.一般来讲,对系统的整体功能把握不足;2.实现整个系统的功能所需的时间长,因为必须先 将各个小模块完成,使用这种方法对设计人员之 间相互进行协作有比较高的要求。,P.18,2.Top down 的设计方法,P.19,Top down 的设计方法的特点:,从系统层开始设计和优化,保证了设计结果的正确性适合复杂的、大规模电路的设计缩短设计周期依赖于先进的EDA设计工具和环境,费用昂贵需要精确的工艺库支

4、持,P.110,四.设计过程,P.111,2 Verilog HDL设计初步,内容简介Verilog HDL与C语言的比较Verilog模块的基本结构逻辑功能的定义,P.112,一.Verilog HDL与C语言的比较,Verilog HDL是在C语言基础上发展起来的,保留了C语言的结构特点。,但C语言的各函数之间是串行的,而Verilog的各个模块间是并行的,P.113,Verilog HDL与C语言运算符的比较,P.114,二.Verilog模块的基本结构,由关键词module和endmodule定义,P.115,1.模块声明,module关键词模块名 模块唯一的标识符端口列表是由输入、输

5、出和双向端口的端 口表达式按一定的次序组成的一 个列表,它用来指明模块所具有 的端口,这些端口用来与其它模 块进行连接。,P.116,2.端口定义,又称“端口声明语句”,用来进行端口方向的说明。Verilog语言中有如下三种端口声明语句:1)input对应的端口是输入端口2)output对应的端口是输出端口3)inout对应的端口是双向端口,P.117,3.数据类型说明,用来指定模块内用到的数据对象的类型。wire连线型wire A,B,C,D;/定义信号AD为wire型reg寄存器型reg 3:0 out;/定义信号out的数据类型为 4位reg型,缺省数据类型为wire型,P.118,4.

6、逻辑功能定义,模块中最核心部分,有三种方法可在模块中产生逻辑。1)用“assign”持续赋值语句定义例:assign a=b&c;2)调用元件(元件例化)类似于在电路图输入方式下调入图形符号完成设计。,P.119,元件例化的格式为:门元件名();,例:调用模块的例子,module MUX2-1(out,a,b,sel);output out;input a,b,sel;not(sel_,sel);and(a1,a,sel _);and(b1,b,sel);or(out,a1,b1);endmodule,P.120,设计师自己设计的各种模块也可以看作元件,被顶层文件或其他文件调用:模块名();端

7、口列表有两种表示方式,第一种方式显式给出端口与信号之间的对应关系:(.端口名(信号值表达式),.端口名(信号值表达式),)第二种方法是隐式给出端口与信号之间的关系:(信号值表达式,信号值表达式,)这种方式下,例化的端口列表中信号的顺序要与该模块定义中的端口列表中端口顺序严格一致。而第一种方法则无此要求。,P.121,举例:由1位全加器组成的4位全加器,module full_add(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign cout,sum=a+b+cin;endmodulemodule add4(sum,cout,a,b,c

8、in);output 3:0 sum;output cout;input 3:0 a,b;input cin;,P.122,wire cin1,cin2,cin3;full_add f0(a0,b0,cin,sum0,cin1);full_add f1(a1,b1,cin1,sum1,cin2);full_add f2(.a(a2),.b(b2),.cin(cin2),.sum(sum2),.cout(cin3);full_add f3(.cin(cin3),.a(a3),.b(b3),.cout(cout),.sum(sum3);endmodule,P.123,3)用“always”过程块赋

9、值,例:always(posedge clk)beginif(reset)out=0;else out=out+1;end,P.124,要点总结:,在Verilog模块中,所有的过程块(如initial、always)、连续赋值语句、实例引用之间都是并行的;它们表示的是一种通过变量名互相连接的关系;在同一模块中这三者出现的先后顺序没有关系;只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分。,P.125,3 Verilog HDL语言要素,内容简介词法数据类型寄存器和存储器运算符,P.126,一.词法,空白符(间隔符)包括:空格(b)、tab(t)(制表符)、

10、换行符(n)及换页符。空白符使代码错落有致、阅读方便。综合时,空白符被忽略。但是在字符串中空白和制表符会被认为是有意义的字符。,P.127,Verilog程序可以不分行:initial begin ina=3b001;inb=3b011;end也可以加入空白符采用多行编写:initial begin ina=3b001;inb=3b011;end,P.128,注释有两种注释形式:单行注释:以/开始到本行结束。多行注释:以/*开始到*/结束。,/*举例说明*/module addbit(a,b,ci,sum,co);/输入端口input a;input b;.,P.129,3.数字与字符串,Ve

11、rilog HDL有下面4种基本逻辑状态:0低电平、逻辑0或“假”1高电平、逻辑1或“真”X未知状态Z高阻态,X、Z不分大小写,P.130,1)整数有4种进制表示形式:二进制整数(b或B)十进制整数(d或D)十六进制整数(h或H)八进制整数(o或O),常数按照其数值类型可以划分为整数和实数两种,P.131,数字表达方式有以下3种:,举例:8b11000101/位宽为8位的二进制数8hd5/位宽为8位的十六进制数d5H5o27/位宽为5位的八进制数27O,P.132,4B1X_01/4位二进制数1X015HX/5位十六进制数XX4hz/4位十六进制数z8h 2 A/位宽与字符间允许有空格-8D5

12、/8位二进制数,-5的补码,X可以用来定义十六进制数的4位二进制状,八进制数的3位,二进制数的1位。Z的表示方法同X类似。,P.133,数值常量中的下划线“_”是为了增加可读性,可以忽略。如8b1100_0110表示8位二进制数。数值常量中的“?”表示高阻状态。例:2B1?表示2位的二进制数其中的一位是高 阻状态。,P.134,如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子:o721/9位2进制位宽的八进制数hAF/8位2进制位宽的十六进制数如果定义的长度比为常量指定的长度长,通常在左边填0补位。但是如果数最左边一位为x或z,就相应地用x或z在左边补位。例如:10b

13、10 左边添0占位,0000000010 10bx0 x1 左边添x占位,xxxxxxx0 x1,P.135,如果定义的位宽比实际的位数小,那么最左边的位相应地被截断:3b1001_0011/与3b011相等5h0FFF/与5h1F相等,P.136,2)实数有两种表示方法:十进制表示方法 2.0 5.67 2./非法:小数点两侧必须有数字 科学计数法 43_5.1e2/43510.0(下划线忽略)9.6E2/960.0 5E-4/0.0005,P.137,下面的几个例子是无效的格式:.253.7.E3.8e-2,实数可以转化为整数,根据四舍五入的原则,而不是截断原则,当将实数赋给一个整数时,这

14、种转化会自行发生,例如:在转化成整数时,实数25.5和25.8都变成26,而25.2则变成25。,P.138,3)字符串字符串是双引号内的字符序列,不能分成多行书写。若字符串用做Verilog HDL表达式或赋值语句中的操作数,则字符串被看作8位似的ASCII值序列,每一个字符对应8位ASCII值。,P.139,例1:字符串变量声明reg 8*12:1 stringvar;initial begin stringvar=“hello world!”;end,P.140,转意符:,P.141,4.标识符,Verilog HDL中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组

15、合,但是标识符的第一个字符必须是字母或下划线。标识符是区分大小写的。,合法标识符:count_A1_d2COUNTR56_68,非法标识符:30 count/标识符不允许以数字开头out*/标识符中不允许包含*,P.142,5.关键字,Verilog HDL内部已经使用的词称为关键字或保留字。这些关键字用户不能随便使用。在编写程序时,变量的定义不要与这些关键词冲突。,所有的关键字都是小写,P.143,二.数据类型,Verilog HDL中共有19种数据类型。数据类型是用来表示数字电路硬件中的数据储存和传送元件的。这里主要介绍4种最基本的数据类型。,连线型(Net Type)net type 相

16、当于硬件电路中的各种物理连线。,P.144,Net Type的变量不能存储值,而且必须受到驱动器的驱动。两种驱动方式:1)在结构描述中将它连接到一个逻辑门或模块的输出端。2)用持续赋值语句assign对其进行赋值。,特点:输出的值紧跟输入值的变化而变化。,当没有驱动源对其驱动时,它将保持高阻态。,P.145,为了能够精确地反映硬件电路中各种可能的物理信号连接特性,Verilog HDL提供了多种连线型数据。常用的有wire型和tri型。这两种变量都用于连接器件单元,它们具有相同的语法格式和功能。,wire型变量:通常用来表示单个门驱动或连续 赋值语句驱动的连线型数据。tri型变量:通常用来表示

17、多驱动器驱动的连线 型数据。,P.146,wire型变量的格式:wire n-1:0 数据名1,数据名2,数据名n;,wirewire型数据确认符;n-1:0代表该数据的位宽。缺省状态,位宽 默认值为1。这里的位是二进制的位。数据名若一次定义多个数据,数据名之间 用逗号隔开。声明语句的最后用分号表示语句的结束。,P.147,例1.定义数据总线宽8位,地址总线宽20位。wire7:0 databus;/databus宽8位wire19:0 addrbus;/addrbus宽20位或:wire8:1 databus;wire20:1 addrbus;,wire a;/定义了一个1位的wire型数据

18、,P.148,例2.多位wire 型数据可按下面方法使用wire7:0 in,out;/定义两个8位wire型向量assign out=in;/assign 就是持续赋值语句,例3.可只使用多位数据中的几位,但要注意 位宽。wire7:0 out;wire3:0 in;assign out5:2=in;,P.149,说明:1)wire 型变量常用来表示以assign语句赋值的组合逻辑信号。2)输入/输出信号缺省时自动定义为wire 型。3)对综合器而言,wire 型信号的每一位可以取0,1,X或Z中的任意值。,P.150,2.寄存器型(Register Type)寄存器是数据存储单元的抽象。寄

19、存器型数据对应的是具有状态保持作用的硬件电路,如触发器、锁存器等。,寄存器型数据和连线型数据的区别:寄存器型数据保持最后一次的赋值。而连线型数据需有持续的驱动。,P.151,reg 常用的寄存器型变量reg型数据的格式:reg n-1:0 数据名1,数据名2,数据名n;,例1.reg a,b;/定义了两个reg型变量reg 7:0 qout;/定义qout为8位宽的reg 型变量,P.152,说明:1)reg型数据常用来表示“always”模块内的指定信号,常代表触发器。在“always”模块内被赋值的每一个信号都必须定义成reg型。2)对于reg型数据,其赋值语句的作用就如同改变一组触发器的

20、存储单元的值。3)若reg型数据未初始化(即缺省),则初始值为不定状态。,P.153,3.参数型(parameter),在Verilog HDL中,用parameter来定义常量,即用它来定义变量的位宽及延时等。,格式:parameter 参数名1=表达式1,参数名2=表达式2,;,parameter常用来定义延迟时间和变量宽度。,P.154,例:parameter e=2,f=9;/定义两个常数参数parameter r=5.7;/定义r为一个实型参数parameter a_delay=(r+f)/2;/用常数表达式赋值,P.155,三.寄存器和存储器,用reg类型变量可构成寄存器和存储器寄

21、存器reg 7:0 mybyte;A=mybyte6;/将mybyte的第6位赋值给AB=mybyte5:2;/将mybyte的第5,4,3,2 位赋值给B,P.156,例:reg 7:0 a,b;reg 3:0 c;reg d;d=a7&b7;/位选择c=a7:4+b3:0;/域选择,寄存器可以取任意长度。寄存器中的值通常被解释为无符号数。,P.157,2.存储器 Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM存储器和reg 文件数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在,memory型数据是通过扩展re

22、g型数据的地址范围来生成的。,P.158,格式:reg n-1:0 存储器名m-1:0;或reg n-1:0 存储器名m:1;,reg n-1:0:定义了存储器中每一个存储单元的大小。m-1:0:定义了该存储器中有多少个这样的单元。,P.159,例1.定义一个存储器,1024个字节,每个字节 8位。reg 7:0 mymem1023:0;例2.存储器与寄存器的区别reg n-1:0 rega;/一个n位的寄存器reg meman-1:0;/n个一位寄存器组成的存 储器组reg 3:0 Amem63:0;,P.160,说明:1)数组的维数不能大于2。2)存储器属于寄存器数组类型。连线数据类 型没

23、有相应的存储器类型。3)单个寄存器说明既能够用于说明寄存器类 型,也可以用于说明存储器类型。,P.161,例:parameter ADDR_SIZE=16,WORD_SIZE=8;reg WORD_SIZE:1 RamPar ADDR_SIZE-1:0,DataReg;RamPar存储器,是16个8位寄存器数组;DataReg8位寄存器。,P.162,4)在赋值语句中需要注意如下区别:存储器 赋值不能在一条赋值语句中完成,但是寄 存器可以。因此在存储器被赋值时,需要定 义一个索引。下例说明它们之间的不同。,reg 5:1 Dig;/Dig为5位寄存器。.Dig=5b11011;/赋值正确,re

24、g BOg5:1;/Bog为5个1位寄存器组成的的存储器组.Bog=5b11011;/赋值不正确,P.163,有一种存储器赋值的方法是分别对存储器中的每个字赋值。例如:reg 3:0 Xrom 4:1;Xrom1=4hA;Xrom2=4h8;Xrom3=4hF;Xrom4=4h2;,P.164,四.运算符,Verilog语言参考了C语言中大多数运算符的语义和句法。但Verilog中没有增1(i+)和减1(i)运算符。,1.算术运算符,+(一元加和二元加)(一元减和二元减)*(乘)/(除)%(取模),P.165,说明:1)两个整数相除,结果值要略去小数部分,只取整数部分;2)取模运算时,结果的符

25、号位采用模运算式里第一个操作数的符号位;,P.166,3)在进行算术运算操作时,如果某个操作数有不确定的值X或Z,那么整个结果为X。例:b10 x1+b01111 结果为不确定数bxxxxx4)无符号数和有符号数若操作数为寄存器型或连线型,或基数格式表示形式的整数则为无符号数;若为整型或实型,则可以是有符号数。,P.167,例:reg 5:0 Bar;integer Tab;.Bar=-6d12;/寄存器变量Bar的十进制数为 52,向量值为110100。Tab=-6d12;/整数Tab的十进制数为-12,位 形式为110100。,P.168,5)算术操作结果的长度算术表达式结果的长度由最长的

26、操作数决定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。reg 3:0 Arc,Bar,Crt;reg 5:0 Frx;.Arc=Bar+Crt;Frx=Bar+Crt;,P.169,例:算术运算符应用的一个例子。module arithmetic(a,b,out1,out2,out3,out4,out5)input 2:0 a,b;output 3:0 out1;output 4:0 out3;output 2:0 out2,out4,out5;reg 3:0 out1;reg 4:0 out3;reg 2:0 out2,out4,out5;,P.170,always(a or

27、 b)begin out1=a+b;out2=a-b;out3=a*b;out4=a/b;out5=a%b;endendmodule,P.171,2.逻辑运算符,逻辑运算符有3种:&(逻辑与)|(逻辑或)!(逻辑非),说明:1)&和|为二目运算符,要求有两个操作数。例(ab)&(bc),a&b(ab)|(bc),a|b,P.172,2)!是单目运算符,只要求一个操作数。例:!(ab),!a 3)在一个逻辑表达式中,如果包含多个逻辑运算符,如:!a&b|(xy)&c按以下优先次序:!&|逻辑运算符中,“&”和“|”的优先级别低于关系运算符,“!”高于算术运算符。,P.173,3.位运算,按位取反

28、;|按位或;&按位与;按位异或;,在Verilog语言中有7种位逻辑运算符:,或按位异或非;&按位与非;|按位或非;,P.174,例:若A=5b11001;B=5b10101,则:A=5b00110A&B=5b10001A|B=5b11101AB=5b01100,说明:1)按位运算符中,除了“”为单目运算符外,其余均为双目运算符。,P.175,2)对于双目运算符,如果操作数长度不相等,长度较小的操作数在最左侧添0补位。3)无论单目按位运算符还是双目按位运算符,经过按位运算后,原来的操作数有几位,所得结果仍为几位。4)不要将逻辑运算符和按位运算符相混淆。,P.176,4.关系运算符,Verilo

29、g关系运算符有:(大于)=(大于等于)=(小于等于),P.177,例:关系运算符应用的一个例子。module relation(a,b,out1,out2,out3,out4)input 2:0 a,b;output out1,out2,out3,out4;reg out1,out2,out3,out4;always(a or b)begin out1=ab;if(a=b)out4=1 else out4=0 endendmodule,P.178,说明:1)在进行关系运算时,若声明的关系为“假”,则返回值是“0”;若声明的关系为“真”,则返回值是“1”;2)若某个操作数的值不定,则关系是模糊的

30、,返回值是不定值。3)所有关系运算符有着相同的优先级别。关系运算符的优先级别低于算术运算符。,P.179,5.等式运算符,等式运算符有4种=(等于)!=(不等于)=(全等)!=(非全等),两目运算符,要求有两个操作数,得到的结果是1位的逻辑值。声明的关系为真,结果为1;声明的关系为假,结果为0;,P.180,“=”与“=”的区别:,相等运算符真值表,全等运算符真值表,P.181,6.缩位运算符(归约运算符),单目运算符,也有与、或、非运算。包括下面几种:&与&与非|或|或非 异或,同或,P.182,其与、或、非运算规则类似于位运算符的运算规则,但其运算过程不同。,对操作数的相应位进行与、或、非

31、运算,操作数是几位数,则运算结果是几位。,位运算:,缩位运算:,对单个操作数进行与、或、非递推运算,最后的运算结果是1位的二进制数。,P.183,具体运算过程:第一步:先将操作数的第1位与第2位进行与、或、非运算;第二步:将运算结果与第3位进行与、或、非 运算,依次类推,直至最后一位。,例:reg3:0 a;b=&a;,若:A=5b11001则:&A=0;|A=1;,P.184,7.移位运算符,左移 右移,使用方法:an 或 ana代表要进行移位的操作数;n 代表要移几位,这两种移位运算都用0来填补移出的空位,P.185,module shift;reg3:0 start,result;ini

32、tialbigin start=1;result=(start2);endendmodule,P.186,8.条件运算符,?:条件运算符,有三个操作数,与C 语言相同。,格式:信号=条件?表达式1:表达式2;,当条件成立时,信号取表达式1的值,反之取表达式2的值。,P.187,module add_or_sub(a,b,op,result);parameter ADD=1b0;input 7:0 a,b;input op;output 7:0 result;assign result=(op=ADD)?a+b:a-b;endmodule,P.188,9.位拼接运算,这是一个特殊的运算符,这一运

33、算符可以将两个或更多个信号的某些位并接起来进行运算操作。其使用方法是把某些信号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。,格式:信号1的某几位,信号2的某几位,信号n的某几位,P.189,例:wire 7:0 Dbus;wire 11:0 Abus;assign Dbus 7:4=Dbus 0,Dbus 1,Dbus2,Dbus3;/以反转的顺序将低端4位赋给高端4位。assign Dbus=Dbus 3:0,Dbus 7:4;/高4位与低4位交换。,P.190,由于非定长常数的长度未知,不允许连接非定长常数。例如,下列式子非法:Dbus,5/不允许连接操作非定

34、长常数。,P.191,运算符优先级排序:,!*/%+-=!=!=&|&|?:,高优先级别,低优先级别,P.192,4 Verilog HDL行为语句,内容简介过程语句块语句赋值语句条件语句循环语句编译向导语句,P.193,Verilog HDL是由模块组成的,P.194,一.过程语句,P.195,1.always过程语句,格式:always(敏感信号表达式)begin/过程赋值/if-else,case,casex,casez选择语句/while,repeat,for循环/task,function调用end,过程块,可选项,P.196,1)敏感信号只要表达式中某个信号发生变化,就会引发块内语

35、句的执行。,(a)/当信号a的值发生变化时(a or b)/当信号a或b的值发生变化时(posedge clock)/当clock上升沿到来时(negedge clock)/当clock下降沿到来时(posedge clk or negedge reset)/当clk的上升沿或reset的下降沿到来时,P.197,module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input 1:0 sel;reg out;always(in0 or in1 or in2 or in3)case(sel)2b00:ou

36、t=in0;2b01:out=in1;,P.198,2b10:out=in2;2b11:out=in3;default:out=2bx;endcaseendmodule,P.199,2)posedge 与 negedge 关键字,例1:同步置数、同步清零的计数器module count(out,data,load,reset,clk);output7:0 out;input 7:0 data;input load,clk,reset;reg 7:0 out;always(posedge clk)/clk上升沿触发begin,P.1100,if(!reset)out=8h00;/同步清零,低有效

37、else if(load)out=data;/同步预置else out=out+1;/记数endendmodule,例2:时钟信号为clk,clear为异步清零信号always(posedge clk or posedge clear)always(posedge clk or negedge clear),P.1101,错误的描述:always(posedge clk or negedge clear)begin if(clear)out=0;else out=in;end,/应改为if(!clear),P.1102,3)用always过程块实现组合逻辑功能,敏感信号表达式内不能包含pose

38、dge 与 negedge 关键字组合逻辑的所有输入信号都要作为“信号名”出现在敏感信号表达式中。,P.1103,例:有什么问题?module three_and(f,a,b,c);output f;input a,b,c;reg f;always(a or b)begin f=aendendmodule,/应改为(a or b or c),P.1104,4)用always过程块实现时序逻辑功能,敏感信号表达式内可以有posedge 与 negedge 关键字,也可以只有信号名;不要求所有输入信号都出现在敏感信号列表的“信号名”中。,P.1105,module D_FF(Q,D,CLK);ou

39、tput Q;input D,CLK;reg Q;always(posedge CLK)begin Q=D;endendmodule,例:时钟下降沿触发的D触发器,P.1106,说明:1)always过程语句后面可以是一个敏感事件列表,该敏感事件列表的作用是用来激活always过程语句的执行;2)如果always过程块中的敏感事件列表缺省,则认为触发条件始终被满足,always过程块将无条件地循环执行下去,直到遇到$finish或$stop系统任务为止;3)进行仿真时,always过程块是从模拟0开始执行的,且always语句在仿真过程中是不断重复执行的;,P.1107,4)敏感事件列表由一个

40、或多个“事件表达式”构成,事件表达式说明了启动块内语句执行时的触发条件,当存在多个事件表达式时要用关键词or将多个触发条件组合起来。Verilog规定:只要这些事件表达式所代表的多个触发条件中有一个成立,就启动块内语句的执行。5)切勿将变量引入敏感信号列表。6)always过程块和initial过程块都不能嵌套使用。,P.1108,例:不恰当使用always语句而产生仿真死锁的情况。,alwaysbegin clk=clk;end,alwaysbegin#50 clk=clk;end,加上时延控制“#50”产生一个周期为100的方波信号,当敏感信号列表缺省时,语句块将一直执行下去,这就可能在仿

41、真时产生仿真死锁情况,P.1109,2.initial过程块,P.1110,说明:1)initial语句后面没有“敏感信号列表”;2)initial过程块中的语句是从模拟0开始执 行,它在仿真过程中只执行一次,在执行 完后,该initial过程块就被挂起,不再执 行;3)initial过程块的使用主要是面向功能模拟 的,通常不具综合性。,P.1111,例1:用initial过程语句对测试变量A、B、C 赋值。timescale 1ns/100ps module test;reg A,B,C;initialbeginA=0;B=1;C=0;#50 A=1;B=0;,P.1112,#50 A=0;

42、C=1;#50 B=1;#50 B=0;C=0;#50$finish;endendmodule,P.1113,例2:initial过程块用于对变量和存储器进行初始化。module register_initialize(memory);inout areg;inout memory;parameter size=1024,bytesize=8;reg bytesize-1:0 memory size-1:0;,P.1114,initial begin:SEQ-BLK-A integer:index;for(index=0;indexsize;index=index+1)memoryindex=

43、0;areg=0;endendmodule,P.1115,3.两类语句在模块中的使用,module tese reg sa,sb,ze;initialbegin sa=0;sb=0;#5 sb=1#5 sa=1;#5 sb=0;end always(sa or sb)ze=sasb;endmodule,P.1116,二.块语句,在Verilog HDL中有两类语句块:1.串行块(begin-end),格式:begin:块内局部变量说明;时间控制1行为语句1;时间控制n行为语句n;end,P.1117,说明:1)块内的语句按顺序方式执行;2)每条语句中的时延值与其前一条语句执行的 仿真时间有关;

44、3)一旦顺序语句块执行结束,跟随顺序语句块 过程的下一条语句继续执行。,P.1118,例:用begin-end串行块产生信号波形timescale 10ns/1ns module wave1;reg wave;parameter cycle=10;initialbegin wave=0;#(cycle/2)wave=1;#(cycle/2)wave=0;,P.1119,#(cycle/2)wave=1;#(cycle/2)wave=0;#(cycle/2)wave=1;#(cycle/2)$finish;end initial$monitor($time,“wave=%b”,wave);end

45、module,P.1120,2.并行块(fork-join),格式:fork:块内局部变量说明;时间控制1行为语句1;时间控制n行为语句n;join,P.1121,说明:1)块内语句是同时执行的,即程序流程控制 一进入到该并行块,块内语句则开始同时 并行执行。2)块内每条语句的延迟时间是相对于程序流 程控制进入到块内的仿真时间的。3)延迟时间用来给赋值语句提供执行时序。4)当按时间时序排序在最后的语句执行完后,程序流程控制跳出该程序块。,P.1122,例:用fork-join并行块产生信号波形,timescale 10ns/1ns module wave2;reg wave;parameter

46、 cycle=5;initialfork wave=0;#(cycle)wave=1;/5*10ns延迟#(2*cycle)wave=0;/2*5*1050ns延迟,P.1123,#(3*cycle)wave=1;#(4*cycle)wave=0;#(5*cycle)wave=1;#(6*cycle)$finish;join initial$monitor($time,“wave=%b”,wave);endmodule,P.1124,三.赋值语句1.持续赋值语句(不能出现在过程块中),持续赋值语句只能对连线型变量wire进行赋值,不能对寄存器型变量进行赋值。,格式:连线型变量类型 连线型变量位

47、宽 连线型变量名assign#(延时量)连线型变量名=赋值表达式,P.1125,“延时量”的基本格式:#(delay1,delay2,delay3)delay1上升延时;delay2下降延时;delay3转移到高阻态延时。,如果“延时量”这项缺省,默认为0延时。,P.1126,例:module and_cont_assignment(z,x,y);input 3:0 x,y;output 3:0z;wire 3:0z,x,y;assign#(1.5,1.0,2.0)z=xendmodule,P.1127,1)标量连线型 wire a,b;assign a=b;2)向量连线型 wire 7:0

48、a,b;assign a=b;3)向量连线型变量中的某一位 wire 7:0 a,b;assign a3=b3;,P.1128,4)向量连线型变量中的某几位 wire 7:0 a,b;assign a3:2=b1:0;5)上面几种类型的任意拼接运算 wire a,c;wire1:0 b;assign a,c=b;,P.1129,说明:1)持续赋值用来描述组合逻辑。2)持续赋值语句驱动连线型变量,输入操作 数的值一发生变化,就重新计算并更新它 所驱动的变量。3)连线型变量没有数据保持能力。4)若一个连线型变量没有得到任何连续驱动,则它的取值将为不定态“x”。,P.1130,5)在仿真时,只要右端

49、赋值表达式内的任一 操作数发生变化,就会立即触发对被赋值 连线型变量的更新操作。6)如果持续赋值语句带有延时,则在仿真时只 要右端赋值表达式中的任一信号发生变化,都将立即对赋值表达式进行重新计算,然后 进入延时等待状态,待指定延时过去后再进 行赋值。,P.1131,例:用持续赋值语句实现4位全加器。,module adder_4(a,b,ci,sum,co);input 3:0 a,b;input ci;output 3:0 sum;output co;assign co,sum=a+b+ci;endmodule,P.1132,2.过程赋值语句,过程赋值是在always和initial语句内的

50、赋值,它只能对寄存器数据类型的变量赋值。,P.1133,格式:=阻塞型赋值 非阻塞型赋值,P.1134,1)非阻塞型赋值方式(如b=a;)非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立即就改变的。,P.1135,module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always(posedge clk)beginb=a;c=b;endendmodule,例1:非阻塞赋值,P.1136,P.1137,2)阻塞赋值方式(如b=a;)阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立即改变,如果在一个语句

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号