VerilogHDL语言初步

上传人:re****.1 文档编号:570125168 上传时间:2024-08-02 格式:PPT 页数:244 大小:1.48MB
返回 下载 相关 举报
VerilogHDL语言初步_第1页
第1页 / 共244页
VerilogHDL语言初步_第2页
第2页 / 共244页
VerilogHDL语言初步_第3页
第3页 / 共244页
VerilogHDL语言初步_第4页
第4页 / 共244页
VerilogHDL语言初步_第5页
第5页 / 共244页
点击查看更多>>
资源描述

《VerilogHDL语言初步》由会员分享,可在线阅读,更多相关《VerilogHDL语言初步(244页珍藏版)》请在金锄头文库上搜索。

1、2024/8/2 P.1Verilog HDL语言初步语言初步2024/8/2 P.2第一部分第一部分 Verilog HDL语言语言1 综述综述一一. 什么是硬件描述语言?什么是硬件描述语言?硬件描述语言是一种用文本形式来描述和硬件描述语言是一种用文本形式来描述和设计电路的语言。是硬件设计人员和电子设计设计电路的语言。是硬件设计人员和电子设计自动化(自动化(EDA)工具之间的界面。)工具之间的界面。2024/8/2 P.3功能:功能:1)编写设计文件;)编写设计文件;2)建立电子系统行为级的仿真模型;)建立电子系统行为级的仿真模型;3)自动综合以生成符合要求且在电路结构上可)自动综合以生成符

2、合要求且在电路结构上可以实现的数字逻辑网表(以实现的数字逻辑网表(Netlist););4)写入到)写入到CPLD和和FPGA器件中。器件中。2024/8/2 P.4二二.为什么要用为什么要用HDL?1、电路设计的规模越来越大,复杂度越来越高。、电路设计的规模越来越大,复杂度越来越高。2、电子领域的竞争越来越激烈。、电子领域的竞争越来越激烈。3、调试电路速度快。不必修改电路原理图原型,、调试电路速度快。不必修改电路原理图原型,只需要对只需要对HDL进行修改。进行修改。4、易于理解,易于维护。、易于理解,易于维护。5、有许多易于掌握的仿真、综合和布局布线工具。、有许多易于掌握的仿真、综合和布局布

3、线工具。2024/8/2 P.5三、三、Verilog HDL与与C C语言的比较语言的比较Verilog HDL是在是在C语言基础上发展起来的,语言基础上发展起来的,保留了保留了C语言的结构特点。语言的结构特点。C语言由函数组成语言由函数组成, Verilog HDL由模块由模块(module)组成组成C语言通过函数名及其参数变量实现调用,语言通过函数名及其参数变量实现调用, Verilog HDL通过模块名及其端口变量实现调用通过模块名及其端口变量实现调用C语言有主函数语言有主函数main( ), Verilog HDL的各模块均等的各模块均等价,但必有一个顶层模块,包含芯片系统与外界的所

4、价,但必有一个顶层模块,包含芯片系统与外界的所有有I/O信号信号C语言顺序执行,语言顺序执行, Verilog HDL的各模块均并发执行的各模块均并发执行2024/8/2 P.6Bottom Up和和 Top down的设计方法的设计方法1. Bottom Up的设计方法的设计方法1.由基本门构成各由基本门构成各个组合与时序逻辑个组合与时序逻辑2.由逻辑单元组成各由逻辑单元组成各个独立的功能模块个独立的功能模块3.由各个功能模块连由各个功能模块连成一个完整系统成一个完整系统4.完成整个系统测试完成整个系统测试与性能分析与性能分析REGISTERPCRAMALU&12024/8/2 P.7传统的

5、电路系统设计方法的步骤传统的电路系统设计方法的步骤:1.采用自下而上的设计方法采用自下而上的设计方法- -从状态图的简化,写出最从状态图的简化,写出最简逻辑表达式简逻辑表达式;2. 采采用用通通用用逻逻辑辑元元器器件件- -通通常常采采用用7474系系列列和和CMOS4000CMOS4000系系列的列的产品品进行行设计; 3.3.在系统硬件设计的后期进行调试和仿真在系统硬件设计的后期进行调试和仿真 ; 只只有有在在部部分分或或全全部部硬硬件件电电路路连连接接完完毕毕,才才可可以以进进行行电电路路调调试试,一一旦旦考考虑虑不不周周到到,系系统统设设计计存存在在较较大大缺缺陷陷,则要重新设计,使设

6、计周期延长。则要重新设计,使设计周期延长。 4.设计结果是一张电路图设计结果是一张电路图 ; 当当设设计计调调试试完完毕毕后后,形形成成电电原原理理图图,该该图图包包括括元元器器件件型号和信号之间的互连关系等等型号和信号之间的互连关系等等 2024/8/2 P.8优点:优点:1.设计人员对于用这种方法进行设计比较熟悉;设计人员对于用这种方法进行设计比较熟悉;2.实现各个子块电路所需的时间短。实现各个子块电路所需的时间短。缺点:缺点:1.一般来讲,对系统的整体功能把握不足;一般来讲,对系统的整体功能把握不足;2.实现整个系统的功能所需的时间长,因为必须先实现整个系统的功能所需的时间长,因为必须先

7、 将各个小模块完成,使用这种方法对设计人员之将各个小模块完成,使用这种方法对设计人员之 间相互进行协作有比较高的要求。间相互进行协作有比较高的要求。2024/8/2 P.92. Top down 的设计方法的设计方法4.工艺库映射工艺库映射3.各个功能模块系统各个功能模块系统级联合验证级联合验证2.各个功能模块划分,各个功能模块划分,设计和验证设计和验证1. 系统层:顶层模块,系统层:顶层模块,行为级描述,功能模行为级描述,功能模拟和性能评估拟和性能评估REGISTERPCRAMALU&1CPU2024/8/2 P.10Top down 的设计方法的特点:的设计方法的特点:从系统层开始设计和优

8、化,保证了设计结果的正从系统层开始设计和优化,保证了设计结果的正确性确性适合复杂的、大规模电路的设计适合复杂的、大规模电路的设计缩短设计周期缩短设计周期依赖于先进的依赖于先进的EDA设计工具和环境,费用昂贵设计工具和环境,费用昂贵需要精确的工艺库支持需要精确的工艺库支持2024/8/2 P.11四四.设计过程设计过程文本编辑器文本编辑器 图形编辑器图形编辑器生成生成Verilog HDL源程序源程序逻辑综合优化逻辑综合优化FPGA/CPLD布线布线/适配器适配器FPGA/CPLD编程、下载编程、下载行为仿真行为仿真功能仿真功能仿真时序仿真时序仿真硬件测试硬件测试Verilog仿真器仿真器202

9、4/8/2 P.122 Verilog HDL设计初步设计初步 内容简介内容简介vVerilog HDL与与C语言的比较语言的比较vVerilog模块的基本结构模块的基本结构v逻辑功能的定义逻辑功能的定义2024/8/2 P.13一一. Verilog HDL与与C语言的比较语言的比较C语言语言Verilog语言语言functionmodule, functionif-then-elseif-then-elseforforwhilewhilecasecasebreakbreakdefinedefineprintfprintfintint2024/8/2 P.14Verilog HDL与与C语言

10、运算符的比较语言运算符的比较C语言Verilog功能C语言Verilog功能+加=大于等于-减=大于左移右移2024/8/2 P.15二二. Verilog模块的基本结构模块的基本结构由关键词由关键词module和和endmodule定义定义module 模块名模块名 (端口列表端口列表)端口定义端口定义数据类型说明数据类型说明逻辑功能定义逻辑功能定义endmodule模块声明模块声明结束行结束行2024/8/2 P.161.模块声明模块声明module关键词关键词模块名模块名 模块唯一的标识符模块唯一的标识符端口列表端口列表是由输入、输出和双向端口的端是由输入、输出和双向端口的端 口表达式按

11、一定的次序组成的一口表达式按一定的次序组成的一 个列表,它用来指明模块所具有个列表,它用来指明模块所具有 的端口,这些端口用来与其它模的端口,这些端口用来与其它模 块进行连接。块进行连接。2024/8/2 P.172. 端口定义端口定义又称又称“端口声明语句端口声明语句”,用来进行端口方向的,用来进行端口方向的说说明。明。 Verilog语言中有如下三种端口声明语句:语言中有如下三种端口声明语句:1)input对应的端口是输入端口对应的端口是输入端口2 )output对应的端口是输出端口对应的端口是输出端口3 )inout对应的端口是双向端口对应的端口是双向端口moduleinputoutpu

12、tinout2024/8/2 P.183. 数据类型说明数据类型说明用来指定模块内用到的数据对象的类型。用来指定模块内用到的数据对象的类型。wire连线型连线型wire A,B,C,D;/定义信号定义信号AD为为wire型型reg寄存器型寄存器型reg 3:0 out;/定义信号定义信号out的数据类型为的数据类型为 4位位reg型型缺省数据类型为缺省数据类型为wire型型2024/8/2 P.194. 逻辑功能定义逻辑功能定义 模块中最核心部分,有三种方法可在模块中模块中最核心部分,有三种方法可在模块中产生逻辑。产生逻辑。1)用)用“assign”持续赋值语句定义持续赋值语句定义例:例: a

13、ssign a = b & c;2)调用元件(元件例化)调用元件(元件例化) 类似于在电路图输入方式下调入图形符号完类似于在电路图输入方式下调入图形符号完成设计。成设计。2024/8/2 P.20元件例化的格式为:元件例化的格式为:门元件名门元件名 ();例:调用模块的例子例:调用模块的例子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);endmodule2024/8/2 P.212024/8/2 P.22设

14、计师自己设计的各种模块也可以看作元件,被顶层设计师自己设计的各种模块也可以看作元件,被顶层文件或其他文件调用:文件或其他文件调用:模块名模块名模块名模块名 ( (););端口列表有两种表示方式,端口列表有两种表示方式,第一种方式显式给出端口与信号之间的对应关系:第一种方式显式给出端口与信号之间的对应关系:(. .端口名(信号值表达式)端口名(信号值表达式)端口名(信号值表达式)端口名(信号值表达式), . , .端口名端口名端口名端口名( (信号值表达式信号值表达式信号值表达式信号值表达式),),)第二种方法是隐式给出端口与信号之间的关系:第二种方法是隐式给出端口与信号之间的关系:(信号值表达

15、式(信号值表达式(信号值表达式(信号值表达式, , 信号值表达式信号值表达式信号值表达式信号值表达式,)这种方式下,例化的端口列表中信号的顺序要与该模这种方式下,例化的端口列表中信号的顺序要与该模块定义中的端口列表中端口顺序严格一致。而第一种方块定义中的端口列表中端口顺序严格一致。而第一种方法则无此要求。法则无此要求。2024/8/2 P.23举例:由举例:由1位全加器组成的位全加器组成的4位全加器位全加器module full_add (a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign cout,sum = a+b+cin;e

16、ndmodulemodule add4(sum,cout,a,b,cin); output 3:0 sum; output cout; input 3:0 a,b; input cin;2024/8/2 P.24 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),

17、 .cout(cout),.sum(sum3);endmodule2024/8/2 P.253)用)用“always”过程块赋值过程块赋值例:例:always (posedge clk) beginif(reset) out=0;else out=out+1; end2024/8/2 P.26要点总结:要点总结:1.在在Verilog模块中,所有的过程块(如模块中,所有的过程块(如initial、always)、连续赋值语句、实例引用都是并)、连续赋值语句、实例引用都是并行的;行的;2.它们表示的是一种通过变量名互相连接的关它们表示的是一种通过变量名互相连接的关系;系;3.在同一模块中这三者出

18、现的先后顺序没有关在同一模块中这三者出现的先后顺序没有关系;系;4.只有连续赋值语句只有连续赋值语句assign和实例引用语句可和实例引用语句可以独立于过程块而存在于模块的功能定义部以独立于过程块而存在于模块的功能定义部分。分。2024/8/2 P.273 Verilog HDL语言要素语言要素 内容简介内容简介v词法词法v数据类型数据类型v寄存器和存储器寄存器和存储器v运算符运算符2024/8/2 P.28一一. 词法词法1.空白符(间隔符)空白符(间隔符)包括:空格包括:空格(b)、tab(t)(制表符制表符)、换行符、换行符(n)及换页符。及换页符。空白符使代码错落有致、阅读方便。综合空

19、白符使代码错落有致、阅读方便。综合时,空白符被忽略。但是在字符串中空白和时,空白符被忽略。但是在字符串中空白和制表符会被认为是有意义的字符。制表符会被认为是有意义的字符。2024/8/2 P.29Verilog程序可以不分行:程序可以不分行:initial begin ina=3b001;inb=3b011; end也可以加入空白符采用多行编写:也可以加入空白符采用多行编写:initial begin ina=3b001; inb=3b011; end2024/8/2 P.302.注释注释有两种注释形式:有两种注释形式:单行注释:以单行注释:以/开始到本行结束。开始到本行结束。多行注释:以多行

20、注释:以/*开始到开始到*/结束。结束。/*举例说明举例说明*/module addbit(a,b,ci,sum,co);/输入端口输入端口input a;input b;.2024/8/2 P.313. 数字与字符串数字与字符串Verilog HDL有下面有下面4种基本逻辑状态:种基本逻辑状态:0低电平、逻辑低电平、逻辑0或或“假假”1高电平、逻辑高电平、逻辑1或或“真真”X未知状态未知状态Z高阻态高阻态X、Z不分不分大小写大小写常数按照其数值类型可以划分为整常数按照其数值类型可以划分为整数和实数两种数和实数两种2024/8/2 P.321)整数)整数有有4种进制表示形式:种进制表示形式:

21、二进制整数(二进制整数(b或或B) 十进制整数(十进制整数(d或或D) 十六进制整数(十六进制整数(h或或H) 八进制整数(八进制整数(o或或O)2024/8/2 P.33数字表达方式有以下数字表达方式有以下3种:种: 举例:举例:8b11000101 /位宽为位宽为8位的二进制数位的二进制数8hd5 /位宽为位宽为8位的十六进制数位的十六进制数d5H5o27 /位宽为位宽为5位的八进制数位的八进制数27O2024/8/2 P.344B1X_01/4位二进制数位二进制数1X015HX/5位十六进制数位十六进制数XX4hz/4位十六进制数位十六进制数z8h 2 A/位宽与字符间允许有空格位宽与字

22、符间允许有空格-8D5/代表代表5的补数的补数X可以用来定义十六进制数的可以用来定义十六进制数的4位二进制位二进制状态,八进制数的状态,八进制数的3位,二进制数的位,二进制数的1位。位。Z的表示方法同的表示方法同X类似。类似。2024/8/2 P.35数值常量中的下划线数值常量中的下划线“_”是为了增加可是为了增加可读读性,可以忽略。如性,可以忽略。如8b1100_0110表示表示8位二进制位二进制数。数。数值常量中的数值常量中的“?”表示高阻状态。表示高阻状态。例:例:2B1?表示?表示2位的二进制数其中的一位是高位的二进制数其中的一位是高 阻状态。阻状态。2024/8/2 P.36如果没有

23、定义一个整数型的长度,数的如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子:长度为相应值中定义的位数。下面是两个例子:o721 /9位位2进制位宽的八进制数进制位宽的八进制数hAF /8位位2进制位宽的十六进制数进制位宽的十六进制数如果定义的长度比为常量指定的长度长,如果定义的长度比为常量指定的长度长,通常在左边填通常在左边填0补位。但是如果数最左边一位补位。但是如果数最左边一位为为x或或z,就相应地用,就相应地用x或或z在左边补位。例如:在左边补位。例如:10b10 左边添左边添0占位占位, 0000000010 10bx0x1 左边添左边添x占位占位,xxxxxx

24、x0x12024/8/2 P.37如果定义的位宽比实际的位数小,那么最如果定义的位宽比实际的位数小,那么最左边的位相应地被截断:左边的位相应地被截断:3b1001_0011 /与与3b011相等相等5h0FFF /与与5h1F相等相等2024/8/2 P.382)实数)实数有两种表示方法:有两种表示方法: 十进制表示方法十进制表示方法 2.0 5.67 2. /非法:小数点两侧必须有数字非法:小数点两侧必须有数字 科学计数法科学计数法 43_5.1e2/43510.0(下划线忽略)(下划线忽略) 9.6E2/960.0 5E-4/0.00052024/8/2 P.39下面的几个例子是无效的格式

25、:下面的几个例子是无效的格式:.253.7.E3.8e-2实数可以转化为整数,根据实数可以转化为整数,根据四舍五入的原则,而不是截四舍五入的原则,而不是截断原则,当将实数赋给一个断原则,当将实数赋给一个整数时,这种转化会自行发整数时,这种转化会自行发生,例如:在转化成整数时,生,例如:在转化成整数时,实数实数25.5和和25.8都变成都变成26,而,而25.2则变成则变成25。2024/8/2 P.403)字符串)字符串字符串是双引号内的字符序列,不能分成字符串是双引号内的字符序列,不能分成多行书写。若字符串用做多行书写。若字符串用做Verilog HDL表达式表达式或赋值语句中的操作数,则字

26、符串被看作或赋值语句中的操作数,则字符串被看作8位位似的似的ASCII值序列,每一个字符对应值序列,每一个字符对应8位位ASCII值。值。2024/8/2 P.41例例1:字符串变量声明:字符串变量声明reg 8*12:1 stringvar;initial begin stringvar=“hello world!”; end2024/8/2 P.42转意符:转意符:特殊字符表示意义n换行符tTab键符号*符号*ddd3位八进制表示的ASCII值%符号%2024/8/2 P.434. 标识符标识符Verilog HDL中的标识符可以是任意一中的标识符可以是任意一组字母、数字以及符号组字母、数

27、字以及符号“$”和和“_ ”(下划(下划线)线)的组合,但是标识符的第一个字符必须是字的组合,但是标识符的第一个字符必须是字母或下划线。标识符是区分大小写的。母或下划线。标识符是区分大小写的。合法标识符:合法标识符:count_A1_d2COUNTR56_68非法标识符:非法标识符:30 count/标识符不允许以数字开头标识符不允许以数字开头out */标识符中不允许包含标识符中不允许包含*2024/8/2 P.445. 关键字关键字Verilog HDL内部已经使用的词称为内部已经使用的词称为关键关键字或保留字。字或保留字。这些关键字用户不能随便使用。这些关键字用户不能随便使用。在编写程序

28、时,变量的定义不要与这些关键词在编写程序时,变量的定义不要与这些关键词冲突。冲突。所有的关键字都是小写所有的关键字都是小写2024/8/2 P.45二二. 数据类型数据类型Verilog HDL中共有中共有19种数据类型。种数据类型。数据类数据类型是用来表示数字电路硬件中的数据储存和传型是用来表示数字电路硬件中的数据储存和传送元件的。送元件的。这里主要介绍这里主要介绍4种最基本的数据类型。种最基本的数据类型。1.连线型(连线型(Net Type)net type 相当于硬件电路中的各种物理连相当于硬件电路中的各种物理连线。线。2024/8/2 P.46Net Type的变量不能存储值,而且必须

29、受的变量不能存储值,而且必须受到驱动器的驱动。到驱动器的驱动。两种驱动方式:两种驱动方式:1)在结构描述中将它连接到一个逻辑门或模块)在结构描述中将它连接到一个逻辑门或模块的输出端。的输出端。2)用持续赋值语句)用持续赋值语句assign对其进行赋值。对其进行赋值。特点:特点:输出的值紧跟输入值的变化而变化。输出的值紧跟输入值的变化而变化。 当没有驱动源对其驱动时,它将保持高阻态。当没有驱动源对其驱动时,它将保持高阻态。2024/8/2 P.47为了能够精确地反映硬件电路中各种可为了能够精确地反映硬件电路中各种可能的物理信号连接特性,能的物理信号连接特性, Verilog HDL提供了提供了多

30、种连线型数据。常用的有多种连线型数据。常用的有wire型和型和tri型。这型。这两种变量都用于连接器件单元,它们具有相同两种变量都用于连接器件单元,它们具有相同的语法格式和功能。的语法格式和功能。wire型变量:通常用来表示单个门驱动或连续型变量:通常用来表示单个门驱动或连续 赋值语句驱动的连线型数据。赋值语句驱动的连线型数据。tri型变量:通常用来表示多驱动器驱动的连线型变量:通常用来表示多驱动器驱动的连线 型数据。型数据。2024/8/2 P.48wire型变量的格式:型变量的格式:wire n-1:0 数据名数据名1,数据名,数据名2,数据名,数据名n;wirewire型数据确认符;型数

31、据确认符;n-1:0代表该数据的位宽。缺省状态,位代表该数据的位宽。缺省状态,位 宽默认值为宽默认值为1。数据名数据名若一次定义多个数据,数据名之间若一次定义多个数据,数据名之间 用逗号隔开。用逗号隔开。声明语句的最后用分号表示语句的结束。声明语句的最后用分号表示语句的结束。2024/8/2 P.49例例1. 定义数据总线宽定义数据总线宽8位,地址总线宽位,地址总线宽20位。位。wire7:0 databus;/ databus宽宽8位位wire19:0 addrbus;/ addrbus宽宽20位位或:或:wire8:1 databus;wire20:1 addrbus;wire a;/定义

32、了一个定义了一个1位的位的wire型数据型数据2024/8/2 P.50例例2. 多位多位wire 型数据可按下面方法使用型数据可按下面方法使用wire7:0 in, out;/定义两个定义两个8位位wire型向量型向量assign out=in;例例3. 可只使用多位数据中的几位,但要注意可只使用多位数据中的几位,但要注意 位宽。位宽。wire7:0 out;wire3:0 in;assign out5:2=in;2024/8/2 P.51说明:说明:1) wire 型变量常用来表示以型变量常用来表示以assign语句赋值语句赋值的的组合逻辑组合逻辑信号。信号。2)输入)输入/输出信号缺省时

33、自动定义为输出信号缺省时自动定义为wire 型。型。3)对综合器而言,)对综合器而言, wire 型信号的每一位可以型信号的每一位可以取取0,1,X或或Z中的任意值。中的任意值。2024/8/2 P.522. 寄存器型(寄存器型(Register Type)寄存器是数据存储单元的抽象。寄存器型寄存器是数据存储单元的抽象。寄存器型数据对应的是具有状态保持作用的硬件电路,数据对应的是具有状态保持作用的硬件电路,如触发器、锁存器等。如触发器、锁存器等。寄存器型数据和连线型数据的区别:寄存器型数据和连线型数据的区别:寄存器型数据保持最后一次的赋值。而寄存器型数据保持最后一次的赋值。而连线型数据需有持续

34、的驱动。连线型数据需有持续的驱动。2024/8/2 P.53reg 常用的寄存器型变量常用的寄存器型变量reg型数据的格式:型数据的格式:reg n-1:0 数据名数据名1,数据名,数据名2,数据名数据名n;例例1. reg a, b; /定义了两个定义了两个reg型变量型变量reg 7:0 qout; /定义定义qout为为8位宽的位宽的reg 型变量型变量2024/8/2 P.54说明:说明:1) reg型数据常用来表示型数据常用来表示“always”模块内的模块内的指指定信号,常代表触发器。在定信号,常代表触发器。在“always”模块内模块内被被赋值的每一个信号都必须定义成赋值的每一个

35、信号都必须定义成reg型。型。2)对于)对于reg型数据,其赋值语句的作用就如同型数据,其赋值语句的作用就如同改变一组触发器的存储单元的值。改变一组触发器的存储单元的值。3)若)若reg型数据未初始化(即缺省),则初始型数据未初始化(即缺省),则初始值为不定状态。值为不定状态。2024/8/2 P.553. 参数型(参数型(parameter)在在Verilog HDL中,用中,用parameter来定义来定义常量,即用它来定义变量的位宽及延时等。常量,即用它来定义变量的位宽及延时等。格式:格式:parameter 参数名参数名1=表达式表达式1,参数名,参数名2=表达式表达式2,;param

36、eter常用来定义延迟时间和变量宽度。常用来定义延迟时间和变量宽度。2024/8/2 P.56例:例: parameter e=2,f=9;/定义两个常数参数定义两个常数参数parameter r=5.7; /定义定义r为一个实型参数为一个实型参数parameter a_delay=(r+f)/2;/用常数表达式赋值用常数表达式赋值2024/8/2 P.57三三. 寄存器和存储器寄存器和存储器用用reg类型变量可构成寄存器和存储器类型变量可构成寄存器和存储器1.寄存器寄存器reg 7:0 mybyte;A= mybyte6;/将将mybyte的第的第6位赋值给位赋值给AB= mybyte5:2

37、;/将将mybyte的第的第5,4,3,2 位赋值给位赋值给B2024/8/2 P.58例:例:reg 7:0 a,b;reg 3:0 c;reg d;d=a7&b7;/位选择位选择c=a7:4+b3:0;/域选择域选择寄存器可以寄存器可以取任意长度。取任意长度。寄存器中的寄存器中的值通常被解值通常被解释为无符号释为无符号数。数。2024/8/2 P.592. 存储器存储器 Verilog HDL通过对通过对reg型变量建立数组来型变量建立数组来对存储器建模,可以描述对存储器建模,可以描述RAM型存储器、型存储器、ROM存储器和存储器和reg 文件数组中的每一个单元通文件数组中的每一个单元通过

38、一个数组索引进行寻址。在过一个数组索引进行寻址。在Verilog语言中没语言中没有多维数组存在,有多维数组存在,memory型数据是通过扩展型数据是通过扩展reg型数据的地址范围来生成的。型数据的地址范围来生成的。2024/8/2 P.60格式:格式:reg n-1:0 存储器名存储器名m-1:0;或或reg n-1:0 存储器名存储器名m:1;reg n-1:0 :定义了存储器中每一个存储单元的:定义了存储器中每一个存储单元的大小。大小。m-1:0:定义了该存储器中有多少个这样的单:定义了该存储器中有多少个这样的单元。元。2024/8/2 P.61例例1. 定义一个存储器,定义一个存储器,1

39、024个字节,每个字节个字节,每个字节 8位。位。reg 7:0 mymem1023:0;例例2. 存储器与寄存器的区别存储器与寄存器的区别reg n-1:0 rega;/一个一个n位的寄存器位的寄存器reg meman-1:0; /n个一位寄存器组成的存个一位寄存器组成的存 储器组储器组reg 0:3 Amem0:63;2024/8/2 P.62说明:说明:1)数组的维数不能大于)数组的维数不能大于2。2)存储器属于寄存器数组类型。连线数据类)存储器属于寄存器数组类型。连线数据类 型没有相应的存储器类型。型没有相应的存储器类型。3)单个寄存器说明既能够用于说明寄存器类)单个寄存器说明既能够用

40、于说明寄存器类 型,也可以用于说明存储器类型。型,也可以用于说明存储器类型。2024/8/2 P.63例:例:parameter ADDR_SIZE = 16 , WORD_SIZE = 8;reg 1: WORD_SIZE RamPar ADDR_SIZE 1 : 0,DataReg;RamPar存储器,是存储器,是16个个8位寄存器数组;位寄存器数组;DataReg8位寄存器。位寄存器。2024/8/2 P.644)在赋值语句中需要注意如下区别:存储器)在赋值语句中需要注意如下区别:存储器 赋值不能在一条赋值语句中完成,但是寄赋值不能在一条赋值语句中完成,但是寄 存器可以。因此在存储器被赋

41、值时,需要定存器可以。因此在存储器被赋值时,需要定 义一个索引。下例说明它们之间的不同。义一个索引。下例说明它们之间的不同。reg 1:5 Dig; /Dig为为5位寄存器。位寄存器。. . .Dig = 5b11011;上述赋值是正确的上述赋值是正确的, 2024/8/2 P.65下列赋值不正确:下列赋值不正确:reg BOg1:5; /Bog为为5个个1位寄存器的存储器位寄存器的存储器Bog = 5b11011;有一种存储器赋值的方法是分别对存储有一种存储器赋值的方法是分别对存储器中的每个字赋值。例如:器中的每个字赋值。例如:reg 0:3 Xrom 1:4;Xrom1 = 4hA;Xro

42、m2 = 4h8;Xrom3 = 4hF;Xrom4 = 4h2;2024/8/2 P.66四四. 运算符运算符Verilog语言参考了语言参考了c语言中大多数运算语言中大多数运算符的语义和句法。但符的语义和句法。但Verilog中没有增中没有增1(i+)和减和减1 (i )运算符。运算符。1. 算术运算符算术运算符+(一元加和二元加)(一元加和二元加)(一元减和二元减)(一元减和二元减)*(乘)(乘) /(除)(除)%(取模)(取模)2024/8/2 P.67说明说明:1)两个整数相除,结果值要略去小数部分,只)两个整数相除,结果值要略去小数部分,只取整数部分;取整数部分;2)取模运算时,结

43、果的符号位采用模运算式里)取模运算时,结果的符号位采用模运算式里第一个操作数的符号位;第一个操作数的符号位;模运算表达式模运算表达式 结果结果说明说明10 % 42余数为余数为212 % 30整数整数-11 % 5-1余数为余数为2024/8/2 P.683)在进行算术运算操作时,如果某个操作数)在进行算术运算操作时,如果某个操作数有不确定的值有不确定的值X或或Z,那么整个结果为,那么整个结果为X。例:例:b10x1 + b01111 结果为不确定数结果为不确定数bxxxxx4)无符号数和有符号数)无符号数和有符号数*若操作数为寄存器型或连线型,或基数格若操作数为寄存器型或连线型,或基数格式表

44、示形式的整数则为无符号数;式表示形式的整数则为无符号数;*若为整型或实型,则可以是有符号数。若为整型或实型,则可以是有符号数。2024/8/2 P.69例:例:reg 0:5 Bar;integer Tab;. . .Bar = -6d12;/寄存器变量寄存器变量Bar的十进制数为的十进制数为 52,向量值为,向量值为110100。Tab = -6d12;/整数整数Tab的十进制数为的十进制数为-12,位,位 形式为形式为110100。 2024/8/2 P.705)算术操作结果的长度)算术操作结果的长度算术表达式结果的长度由最长的操作数决算术表达式结果的长度由最长的操作数决定。在赋值语句下,

45、算术操作结果的长度由操定。在赋值语句下,算术操作结果的长度由操作符左端目标长度决定。作符左端目标长度决定。reg 0:3 Arc, Bar, Crt;reg 0:5 Frx;. . . Arc = Bar + Crt;Frx = Bar + Crt;2024/8/2 P.71例:算术运算符应用的一个例子。例:算术运算符应用的一个例子。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 ;

46、reg 3:0 out1 ; reg 4:0 out3 ; reg 2:0 out2 , out4,out5 ;2024/8/2 P.72 always (a or b)begin out1=a+b ; out2=a-b ; out3=a*b ; out4=a/b ; out5=a%b ;endendmodule2024/8/2 P.732. 逻辑运算符逻辑运算符逻辑运算符有逻辑运算符有3种种:& (逻辑与逻辑与) | (逻辑或逻辑或) !(逻辑非逻辑非)说明:说明:1) & 和和| 为二目运算符,要求有两个操作数。为二目运算符,要求有两个操作数。例例(ab) & (bc) , a & b (

47、ab) |(bb) , ! a 3)在一个逻辑表达式中,如果包含多个逻辑)在一个逻辑表达式中,如果包含多个逻辑运算符,运算符,如:!如:!a&b|(xy)&c按以下优先次序:按以下优先次序:! & |逻辑运算符中,逻辑运算符中,“& ”和和“|”的优先级别低的优先级别低于于 关系运算符,关系运算符,“!”高于算术运算符。高于算术运算符。2024/8/2 P.753. 位运算位运算 按位取反;按位取反; |按位或;按位或; & 按位与;按位与; 按位异或;按位异或;在在Verilog语言中有语言中有7种位逻辑运算符:种位逻辑运算符:或或 按位异或非;按位异或非;&按位与非;按位与非;|按位或非;

48、按位或非;2024/8/2 P.76例:若例:若A=5b11001;B=5b10101,则:,则:A=5b00110A&B= 5b10001A|B= 5b11101AB= 5b01100说明:说明:1)按位运算符中,除了)按位运算符中,除了“”为单目运算符外,为单目运算符外,其其余均为双目运算符。余均为双目运算符。2024/8/2 P.772)对于双目运算符,如果操作数长度不相等)对于双目运算符,如果操作数长度不相等, 长度较小的操作数在最左侧添长度较小的操作数在最左侧添0补位。补位。3)无论单目按位运算符还是双目按位运算符,)无论单目按位运算符还是双目按位运算符,经过按位运算后,原来的操作数

49、有几位,所得经过按位运算后,原来的操作数有几位,所得结果仍为几位。结果仍为几位。4)不要将逻辑运算符和按位运算符相混淆。)不要将逻辑运算符和按位运算符相混淆。2024/8/2 P.784. 关系运算符关系运算符Verilog关系运算符有:关系运算符有:(大于)(大于)=(大于等于)(大于等于)=(小于等于)(小于等于)2024/8/2 P.79例:关系运算符应用的一个例子。例:关系运算符应用的一个例子。module relation (a,b,out1,out2,out3,out4) input 2:0 a ,b; output out1 ,out2,out3,out4 ; reg out1,

50、out2,out3,out4 ; always (a or b)begin out1=ab ; out2=ab ;2024/8/2 P.80if (a=b) out4=1else out4=0 endendmodule2024/8/2 P.81说明:说明:1)在进行关系运算时,若声明的关系为)在进行关系运算时,若声明的关系为“假假”,则返回值是则返回值是“0”;若声明的关系为;若声明的关系为“真真”,则,则返返回值是回值是“1”;2)若某个操作数的值不定,则关系是模糊的,)若某个操作数的值不定,则关系是模糊的,返回值是不定值。返回值是不定值。3)所有关系运算符有着相同的优先级别。关)所有关系运

51、算符有着相同的优先级别。关系运算符的优先级别低于算术运算符。系运算符的优先级别低于算术运算符。2024/8/2 P.825. 等式运算符等式运算符等式运算符有等式运算符有4种种= =(等于)(等于)!=(不等于)(不等于)= = =(全等)(全等)!= =(非全等)(非全等)两目运算符两目运算符,要求有两个要求有两个操作数,得到的结果是操作数,得到的结果是1位的位的逻辑值。逻辑值。声明的关系为真,结果为声明的关系为真,结果为1;声明的关系为假,结果为声明的关系为假,结果为0;2024/8/2 P.83“=”与与“=”的区别:的区别:= 0 1 x z01 0 x x10 1 x xxx x x

52、 xzx x x x=0 1 x z01 0 0 010 1 0 0x0 0 1 0z0 0 0 1相等运算符真值表相等运算符真值表全等运算符真值表全等运算符真值表2024/8/2 P.846. 缩位运算符(归约运算符)缩位运算符(归约运算符)单目运算符,也有与、或、非运算。包括单目运算符,也有与、或、非运算。包括下面几种:下面几种: &与与 &与非与非 | 或或 | 或非或非 异或异或 ,同或同或2024/8/2 P.85其与、或、非运算规则类似于位运算符的其与、或、非运算规则类似于位运算符的运算规则,但其运算过程不同。运算规则,但其运算过程不同。对操作数的相应位进行与、或、非运算,对操作数

53、的相应位进行与、或、非运算,操作数是几位数,则运算结果是几位。操作数是几位数,则运算结果是几位。位运算:位运算:缩位运算:缩位运算:对单个操作数进行与、或、非递推运算,对单个操作数进行与、或、非递推运算,最后的运算结果是最后的运算结果是1位的二进制数。位的二进制数。2024/8/2 P.86具体运算过程:具体运算过程:第一步:先将操作数的第第一步:先将操作数的第1位与第位与第2位进行与、位进行与、 或、非运算;或、非运算;第二步:将运算结果与第第二步:将运算结果与第3位进行与、或、非位进行与、或、非 运算,依次类推,直至最后一位。运算,依次类推,直至最后一位。例:例:reg3:0 a; b=&

54、a;若:若:A=5b11001则:则:&A=0; |A=1;2024/8/2 P.877. 移位运算符移位运算符 左移左移 n 或或 ana代表要进行移位的操作数;代表要进行移位的操作数;n 代表要移几位代表要移几位这两种移位运算都用这两种移位运算都用0来填补移出的空位来填补移出的空位2024/8/2 P.88module shift; reg3:0 start,result;initialbigin start=1; result= (start2););endendmodule2024/8/2 P.898. 条件运算符条件运算符?:?:条件运算符,有三个操作数,与条件运算符,有三个操作数,

55、与C 语言相同。语言相同。格式:格式:信号信号=条件条件 ? 表达式表达式1 : 表达式表达式2;当条件成立时,信号取表达式当条件成立时,信号取表达式1的值,反的值,反之取表达式之取表达式2的值。的值。2024/8/2 P.90 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; endmodule2024/8/2 P.919. 位拼接运算位拼接运算 这是一个特殊的运算符,这一运算符可以这

56、是一个特殊的运算符,这一运算符可以将两个或更多个信号的某些位并接起来进行运将两个或更多个信号的某些位并接起来进行运算操作。其使用方法是把某些信号的某些位详算操作。其使用方法是把某些信号的某些位详细地列出来,中间用逗号分开,最后用大括号细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。括起来表示一个整体信号。格式:格式:信号信号1的某几位,信号的某几位,信号2的某几位,的某几位,信号,信号n的某几位的某几位2024/8/2 P.92例:例:wire 7:0 Dbus; wire 11:0 Abus; assign Dbus 7:4 = Dbus 0, Dbus 1, Dbus2,

57、Dbus3;/以反转的顺序将低端以反转的顺序将低端4位赋位赋给高端给高端4位。位。 assign Dbus = Dbus 3:0, Dbus 7:4;/高高4位与低位与低4位交换。位交换。2024/8/2 P.93由于非定长常数的长度未知由于非定长常数的长度未知, 不允许连接不允许连接非定长常数。非定长常数。例如例如, 下列式子非法:下列式子非法:Dbus,5 /不允许连接操作非定长常数。不允许连接操作非定长常数。2024/8/2 P.94运算符优先级排序:运算符优先级排序:! * / %+ - = != = !=& |&|?:高优先级别高优先级别低优先级别低优先级别2024/8/2 P.95

58、4 Verilog HDL行为语句行为语句 内容简介内容简介v过程语句过程语句v块语句块语句v赋值语句赋值语句v条件语句条件语句v循环语句循环语句v编译向导语句编译向导语句2024/8/2 P.96Verilog HDL是由模块组成的是由模块组成的行为描述方式行为描述方式结构描述方式结构描述方式过程块过程块连续赋值语句连续赋值语句模块实例语句模块实例语句基本原语实例语句基本原语实例语句模块模块数据流描述方式数据流描述方式2024/8/2 P.97一一. 过程语句过程语句过程块过程块过程语句过程语句语句块语句块initialalways过程性赋值语句过程性赋值语句高级程序语句高级程序语句过程赋值

59、语句过程赋值语句过程连续过程连续赋值语句赋值语句条件分支语句条件分支语句循环控制语句循环控制语句2024/8/2 P.981. always过程语句过程语句格式格式:always (敏感信号表达式)(敏感信号表达式)begin/过程赋值过程赋值/if-else,case,casex,casez选择语句选择语句/while,repeat,for循环循环/task,function调用调用end过程块过程块可选项可选项2024/8/2 P.991)敏感信号)敏感信号只要表达式中某个信号发生只要表达式中某个信号发生 变化,就会引发块内语句的变化,就会引发块内语句的 执行。执行。 (a) /当信号当信

60、号a的值发生变化时的值发生变化时 (a or b) /当信号当信号a或或b的值发生变化时的值发生变化时 (posedge clock) /当当clock上升沿到来时上升沿到来时 (negedge clock) /当当clock下降沿到来时下降沿到来时 (posedge clk or negedge reset)/当当clk的上升沿或的上升沿或reset的下降沿到来时的下降沿到来时2024/8/2 P.100module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3 ;input 1:0 sel;reg out;

61、always (in0 or in1 or in2 or in3) case (sel)2b00:out=in0 ;2b01:out=in1 ;2024/8/2 P.1012b10:out=in2 ;2b11:out=in3 ; default :out=2bx ; endcaseendmodule敏感信号分类敏感信号分类边沿敏感型边沿敏感型电平敏感型电平敏感型wait语句语句2024/8/2 P.1022) posedge 与与 negedge 关键字关键字例例1:同步置数、同步清零的计数器:同步置数、同步清零的计数器module count(out,data,load,reset,clk)

62、;output7:0 out;input 7:0 data ;input load , clk , reset;reg 7:0 out;always (posedge clk) /clk上升沿触发上升沿触发begin2024/8/2 P.103if (!reset) out=8h00 ;/同步清零,低有效同步清零,低有效else if (load)out=data ;/同步预置同步预置else out=out+1 ;/记数记数endendmodule例例2:时钟信号为:时钟信号为clk,clear为异步清零信号为异步清零信号always (posedge clk or posedge clea

63、r)always (posedge clk or negedge clear)2024/8/2 P.104错误的描述错误的描述:always (posedge clk or negedge clear) begin if (clear)out=0;else out=in; end/应改为应改为if (!clear)2024/8/2 P.1053)用)用always过程块实现过程块实现组合逻辑组合逻辑功能功能v敏感信号表达式内不能包含敏感信号表达式内不能包含posedge 与与 negedge 关键字关键字v组合逻辑的所有输入信号都要作为组合逻辑的所有输入信号都要作为“信号名信号名” 出现在敏感

64、信号表达式中。出现在敏感信号表达式中。2024/8/2 P.106例例:有什么问题?有什么问题?module three_and(f,a,b,c);output f;input a,b,c ;reg f;always (a or b)begin f=a&b&c;endendmodule/应改为应改为 (a or b or c)2024/8/2 P.1074)用)用always过程块实现过程块实现时序逻辑时序逻辑功能功能v敏感信号表达式内可以有敏感信号表达式内可以有posedge 与与 negedge 关键字,也可以只有信号名;关键字,也可以只有信号名;v不要求所有输入信号都出现在敏感信号列表不

65、要求所有输入信号都出现在敏感信号列表 的的“信号名信号名”中。中。2024/8/2 P.108module D_FF(Q,D,CLK);output Q;input D,CLK;reg Q;always (posedge CLK) begin Q = D; endendmodule例:时钟下降沿触发的例:时钟下降沿触发的D触发器触发器2024/8/2 P.109说明:说明:1) always过程语句后面可以是一个敏感事件过程语句后面可以是一个敏感事件列表列表,该敏感事件列表的作用是用来激活该敏感事件列表的作用是用来激活always过程语句的执行;过程语句的执行;2)如果)如果always过程块

66、中的敏感事件列表缺省,过程块中的敏感事件列表缺省,则认为触发条件始终被满足,则认为触发条件始终被满足, always过程块将过程块将无条件地循环执行下去,直到遇到无条件地循环执行下去,直到遇到$finish或或$stop系统任务为止;系统任务为止;3)进行仿真时,)进行仿真时, always过程块是从模拟过程块是从模拟0开始开始执行的,且执行的,且always语句在仿真过程中是不断重语句在仿真过程中是不断重复执行的;复执行的;2024/8/2 P.1104)敏感事件列表由一个或多个)敏感事件列表由一个或多个“事件表达式事件表达式”构成,事件表达式说明了启动块内语句执行时构成,事件表达式说明了启

67、动块内语句执行时的触发条件,当存在多个事件表达式时要用关的触发条件,当存在多个事件表达式时要用关键词键词or将多个触发条件组合起来。将多个触发条件组合起来。Verilog规定:规定:只要这些事件表达式所代表的多个触发条件中只要这些事件表达式所代表的多个触发条件中有一个成立,就启动块内语句的执行。有一个成立,就启动块内语句的执行。5)切勿将变量引入敏感信号列表。)切勿将变量引入敏感信号列表。6)always过程块和过程块和initial过程块都不能嵌套使过程块都不能嵌套使用。用。2024/8/2 P.111例:不恰当使用例:不恰当使用always语句而产生仿真死锁的语句而产生仿真死锁的情况。情况

68、。alwaysbegin clk=clk;endalwaysbegin #50 clk=clk;end2024/8/2 P.1122. initial过程块过程块格式:格式:initial begin 语句语句1; 语句语句2; 语句语句n; end过程块过程块2024/8/2 P.113说明:说明:1) initial语句后面没有语句后面没有“敏感信号列表敏感信号列表”;2) initial过程块中的语句是从模拟过程块中的语句是从模拟0开始执开始执 行,它在仿真过程中只执行一次,在执行行,它在仿真过程中只执行一次,在执行 完后,该完后,该initial过程块就被挂起,不再执过程块就被挂起,不

69、再执 行;行;3) initial过程块的使用主要是面向功能模拟过程块的使用主要是面向功能模拟 的,通常的,通常不具综合性不具综合性。2024/8/2 P.114例例1:用:用initial过程语句对测试变量过程语句对测试变量A、B、C 赋值。赋值。 timescale 1ns/1ns module test; reg A,B,C; initialbeginA=0;B=1;C=0;#50 A=1;B=0;2024/8/2 P.115 #50 A= 0;C=1; #50 B=1; #50 B=0;C=0; #50 $finish; endendmodule2024/8/2 P.116例例2:in

70、itial过程块用于对变量和存储器进行初过程块用于对变量和存储器进行初始化。始化。module register_initialize(memory);inout areg;inout memory;parameter size=1024,bytesize=8 ;reg bytesize-1:0 memory size-1:0;2024/8/2 P.117initial begin:SEQ-BLK-A integer: index ; for(index=0;indexsize;index=index+1)memoryindex=0; areg=0; endendmodule2024/8/2

71、P.1183. 两类语句在模块中的使用两类语句在模块中的使用 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; endmodule2024/8/2 P.119二二. 块语句块语句在在Verilog HDL中有两类语句块:中有两类语句块:1. 串行块(串行块(begin-end)格式:格式:begin: 块内局部变量说明;块内局部变量说明;时间控制时间控制1行为语句行为语句1;时间控制时间控制n行为语句行为语句n;end2024/8/

72、2 P.120说明:说明:1)块内的语句按顺序方式执行;)块内的语句按顺序方式执行;2)每条语句中的时延值与其前一条语句执行的)每条语句中的时延值与其前一条语句执行的 仿真时间有关;仿真时间有关;3)一旦顺序语句块执行结束,跟随顺序语句块)一旦顺序语句块执行结束,跟随顺序语句块 过程的下一条语句继续执行。过程的下一条语句继续执行。2024/8/2 P.121例:用例:用begin-end串行块产生信号波形串行块产生信号波形timescale 10ns/1ns module wave1; reg wave ; parameter cycle=10 ; initialbegin wave=0 ;#

73、(cycle/2) wave=1 ;#(cycle/2) wave=0 ;2024/8/2 P.122#(cycle/2) wave=1 ;#(cycle/2) wave=0 ;#(cycle/2) wave=1 ;#(cycle/2) $finish ;end initial $monitor($time, “wave=%b”, wave); endmodule2024/8/2 P.1232. 并行块并行块(fork-join)格式:格式:fork: 块内局部变量说明;块内局部变量说明;时间控制时间控制1行为语句行为语句1;时间控制时间控制n行为语句行为语句n;join2024/8/2 P.

74、124说明:说明:1)块内语句是同时执行的,即程序流程控制)块内语句是同时执行的,即程序流程控制 一进入到该并行块,块内语句则开始同时一进入到该并行块,块内语句则开始同时 并行执行。并行执行。2)块内每条语句的延迟时间是相对于程序流)块内每条语句的延迟时间是相对于程序流 程控制进入到块内的仿真时间的。程控制进入到块内的仿真时间的。3)延迟时间用来给赋值语句提供执行时序。)延迟时间用来给赋值语句提供执行时序。4)当按时间时序排序在最后的语句执行完后,)当按时间时序排序在最后的语句执行完后, 程序流程控制跳出该程序块。程序流程控制跳出该程序块。2024/8/2 P.125例:用例:用fork-jo

75、in并行块产生信号波形并行块产生信号波形timescale 10ns/1ns module wave2; reg wave ; parameter cycle=5 ; initialfork wave=0 ;#(cycle) wave=1 ;/ 50ns延迟延迟#(2*cycle) wave=0 ;/2*5*1050ns延迟延迟2024/8/2 P.126#(3*cycle) wave=1 ;#(4*cycle) wave=0 ;#(5*cycle) wave=1 ;#(6*cycle) $finish ;join initial $monitor($time, “wave=%b”, wave

76、); endmodule2024/8/2 P.127三三.赋值语句赋值语句1. 持续赋值语句持续赋值语句(不能出现在过程块中)(不能出现在过程块中)持续赋值语句只能对连线型变量持续赋值语句只能对连线型变量wire进进行赋值,不能对寄存器型变量进行赋值。行赋值,不能对寄存器型变量进行赋值。格式:格式:连线型变量类型连线型变量类型 连线型变量位宽连线型变量位宽 连线型变量名连线型变量名assign #(延时量)(延时量) 连线型变量名连线型变量名=赋值表达式赋值表达式可选项可选项2024/8/2 P.128“延时量延时量”的基本格式:的基本格式:#(delay1, delay2, delay3)d

77、elay1上升延时;上升延时;delay2下降延时;下降延时;delay3转移到高阻态延时。转移到高阻态延时。如果如果“延时量延时量”这项缺省,默认为这项缺省,默认为0延时。延时。2024/8/2 P.129例:例: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=x&y;endmodule2024/8/2 P.1301)标量连线型)标量连线型 wire a,b; assign a=b;2)向量连线型)向量连线型 wire 7:0 a,b; assi

78、gn a=b;3)向量连线型变量中的某一位)向量连线型变量中的某一位 wire 7:0 a,b; assign a3=b3;2024/8/2 P.1314)向量连线型变量中的某几位)向量连线型变量中的某几位 wire 7:0 a,b; assign a3:2=b3:2;5)上面几种类型的任意拼接运算)上面几种类型的任意拼接运算 wire a, c; wire 2:1 b; assign a,c=b;2024/8/2 P.132说明:说明:1)持续赋值用来描述组合逻辑。)持续赋值用来描述组合逻辑。2)持续赋值语句驱动连线型变量,输入操作)持续赋值语句驱动连线型变量,输入操作 数的值一发生变化,就

79、重新计算并更新它数的值一发生变化,就重新计算并更新它 所驱动的变量。所驱动的变量。3)连线型变量没有数据保持能力。)连线型变量没有数据保持能力。4)若一个连线型变量没有得到任何连续驱动,)若一个连线型变量没有得到任何连续驱动, 则它的取值将为不定态则它的取值将为不定态“x”。2024/8/2 P.1335)在仿真时,只要右端赋值表达式内的任一)在仿真时,只要右端赋值表达式内的任一 操作数发生变化,就会立即触发对被赋值操作数发生变化,就会立即触发对被赋值 连线型变量的更新操作。连线型变量的更新操作。6)如果持续赋值语句带有延时,则在仿真时只)如果持续赋值语句带有延时,则在仿真时只 要右端赋值表达

80、式中的任一信号发生变化,要右端赋值表达式中的任一信号发生变化, 都将立即对赋值表达式进行重新计算,然后都将立即对赋值表达式进行重新计算,然后 进入延时等待状态,待指定延时过去后再进进入延时等待状态,待指定延时过去后再进 行赋值。行赋值。2024/8/2 P.134例:用持续赋值语句实现例:用持续赋值语句实现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;endmodule2024/8/2 P.1352. 过程赋值语句过程赋值

81、语句过程赋值是在过程赋值是在always和和initial语句内的赋语句内的赋值,它只能对寄存器数据类型的变量赋值。值,它只能对寄存器数据类型的变量赋值。过程赋值语句的分类过程赋值语句的分类阻塞型赋值阻塞型赋值非阻塞型赋值非阻塞型赋值2024/8/2 P.136格式:格式: = 阻塞型赋值阻塞型赋值 = 非阻塞型赋值非阻塞型赋值2024/8/2 P.1371)非阻塞型赋值方式(如)非阻塞型赋值方式(如b=a;)非阻塞赋值在整个过程块结束时才完成赋非阻塞赋值在整个过程块结束时才完成赋值操作,即值操作,即b的值并不是立即就改变的。的值并不是立即就改变的。2024/8/2 P.138module n

82、on_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmodule例例1:非阻塞赋值:非阻塞赋值2024/8/2 P.1392024/8/2 P.1402)阻塞赋值方式(如)阻塞赋值方式(如b=a;)阻塞赋值在该语句结束时就立即完成赋值阻塞赋值在该语句结束时就立即完成赋值操作,即操作,即b的值在该条语句结束后立即改变,如的值在该条语句结束后立即改变,如果在一个语句块中有多条阻塞赋值语句,则前果在一个语句块中有多条阻塞赋值语句,则前面赋值语句没有完成之前,后面赋值语句不能

83、面赋值语句没有完成之前,后面赋值语句不能被执行,仿佛被阻塞一样。被执行,仿佛被阻塞一样。2024/8/2 P.141module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmodule例例2:阻塞赋值:阻塞赋值2024/8/2 P.1422024/8/2 P.143四四.条件语句条件语句高级程序语句高级程序语句条件分支语句条件分支语句循环控制语句循环控制语句if-else条件分支条件分支case条件分支条件分支foreverrepeatwhilefor20

84、24/8/2 P.1441. if-elseVerilog HDL语言提供了语言提供了3种形式的种形式的if语句:语句:1) if(表达式)(表达式) 语句语句1;2) if(表达式)(表达式) 语句语句1; else 语句语句2;3)if(表达式(表达式1) 语句语句1; else if(表达式(表达式2) 语句语句2; else if(表达式(表达式3) 语句语句3; else if(表达式(表达式n) 语句语句n; else 语句语句n+1;2024/8/2 P.145说明:说明:1)3种形式的种形式的if语句在语句在if后面都有后面都有“表达式表达式”,一一般为逻辑表达式或关系表达式。

85、系统对表达式般为逻辑表达式或关系表达式。系统对表达式的值进行判断,若为的值进行判断,若为0,x,z,按,按“假假”处理;处理;若若为为1,按,按“真真”处理,执行指定语句。处理,执行指定语句。2)在)在if和和else后面可以包含单个或多个语句,后面可以包含单个或多个语句,多句时用多句时用“begin-end”块语句括起来。块语句括起来。3)在)在if语句嵌套使用时,要注意语句嵌套使用时,要注意if与与else的配对的配对关系。关系。2024/8/2 P.146例例1:module sel-from-three(q,sela,selb,a,b,c); input sela,selb,a,b,c

86、; output q; reg q; always (sela or selb or a or b or c); beginif(sela) q=a;else if(selb) q=b;else q=c; end endmodule2024/8/2 P.147例例2:module count60(qout,cout,data,load,cin, reset,clk);input 7:0 data;input load,cin, reset, clk;output 7:0 qout;output cout;reg 7:0 qout;always (posedge clk); beginif (r

87、eset) qout=0;else if (load) qout=data;2024/8/2 P.148else if (cin)begin if (qout3:0=9) begin qout3:0=0; if (qout7:4=5) qout7:4=0; else qout7:4=qout7:4+1; end else qout3:0200) disable FOREVER_PART; #25 clk=clk;end endendendmodule2024/8/2 P.1662. repeat语句语句功能:该循环语句内的循环体部分被重复执行功能:该循环语句内的循环体部分被重复执行 指定的次数

88、。指定的次数。 格式:格式: repeat (循环次数表达式)(循环次数表达式) 语句;语句;或或 repeat (循环次数表达式)(循环次数表达式) beginend2024/8/2 P.167例例1:用:用repeat循环语句来实现循环移位循环语句来实现循环移位module drift (data, num, ctrl);inout 16: 1 data;input 4: 1 num;input ctrl;reg 16: 1 data;reg tmp;always (ctrl)if (ctrl=1)2024/8/2 P.168repeat (num)begintmp=data16;data

89、=data1, tmp;endendmodule2024/8/2 P.169例例2:用:用repeat实现实现8位二进制数的乘法位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 temp_a,outcome;regsize:1 temp_b;always (a or b)beginoutcome=0;2024/8/2 P.170temp_a=a;temp_b=b;repeat(size)/ size为循环次数为循环次数 begin

90、 if(temp_b1) outcome=outcome+temp_a; temp_a=temp_a1;/操作数操作数b右移一位右移一位 endendendmodule2024/8/2 P.1713. while语句语句功能:条件循环。功能:条件循环。格式:格式: while (循环执行条件表达式)(循环执行条件表达式) 语句;语句;或或 while (循环执行条件表达式)(循环执行条件表达式) beginend2024/8/2 P.172例例1:用:用while实现显示一个实现显示一个32位整数的循环位整数的循环module loop2;integer i;initial begini=0;

91、while(i4) begin$display (i=%h,i);i=i+1; endendendmodule2024/8/2 P.1734. for语句语句功能:条件循环。只有在指定的条件表达式成立功能:条件循环。只有在指定的条件表达式成立 时才进行循环。时才进行循环。格式:格式:for(循环变量赋初值;循环条件结束;循环变量增值)(循环变量赋初值;循环条件结束;循环变量增值)执行语句执行语句;2024/8/2 P.174begin语句语句1;while(条件表达式)(条件表达式)begin循环体语句或语句块;循环体语句或语句块;语句语句2;endendfor (语句(语句1,条件表达式,语

92、句,条件表达式,语句2)循环体语句或语句块;循环体语句或语句块;2024/8/2 P.175例例1:用:用for实现显示一个实现显示一个32位整数的循环位整数的循环module loop1;integer i;initialfor(i=0;i4;i=i+1)begin$display(i=%h,i);endendmodule2024/8/2 P.1765 进程、任务与函数进程、任务与函数进程进程任务任务函数函数任务与函数的区别任务与函数的区别2024/8/2 P.177一一. 进程进程 表示进程的方法:表示进程的方法: always过程块过程块 initial过程过程 assign赋值语句赋值

93、语句元件例化元件例化2024/8/2 P.1781. 进程的特点进程的特点1)进程只有两种状态:执行、等待。进程只有两种状态:执行、等待。2)进程一般由敏感信号的变化来启动。进程一般由敏感信号的变化来启动。3)进程内部的语句是顺序执行的。进程内部的语句是顺序执行的。4)多进程之间是并行执行的,与进程在程序多进程之间是并行执行的,与进程在程序中的位置无关。中的位置无关。5)进程之间的通信是由信号来传递的。进程之间的通信是由信号来传递的。2024/8/2 P.1792. 举例:加法计数器中的进程举例:加法计数器中的进程module count(data,clk,reset,load,cout,qo

94、ut);output cout;output3:0 qout;reg3:0 qout;input3:0 data;input clk,reset,load;2024/8/2 P.180always (posedge clk)begin if (!reset) qout= 4h00; else if (load) qout= data; else qout=qout + 1;endassign cout=(qout=4hf)?1:0;endmodule2024/8/2 P.181二二. 任务任务行为描述模块内可以包含任务和函数定义,行为描述模块内可以包含任务和函数定义,这两部分在行为描述模块中都

95、是可选的,类似这两部分在行为描述模块中都是可选的,类似于一种子程序结构。于一种子程序结构。引入任务和函数的目的:引入任务和函数的目的:将一个很大的程序模块分解成许多较小任将一个很大的程序模块分解成许多较小任务和函数,便于理解和调试。务和函数,便于理解和调试。2024/8/2 P.1821. 任务的定义任务的定义task ;/注意无端口列表注意无端口列表端口及数据类型声明语句;端口及数据类型声明语句;局部变量说明;局部变量说明;语句语句1;语句语句nendtask2024/8/2 P.183说明:说明:1)端口及数据类型声明语句)端口及数据类型声明语句 用于对任务各个端口的宽度和类型进行说明。用

96、于对任务各个端口的宽度和类型进行说明。2)局部变量说明)局部变量说明 用来对任务内用到的局部变量进行宽度和类型说明。用来对任务内用到的局部变量进行宽度和类型说明。3)语句)语句1语句语句n 行为语句,指明了任务被调用时需要进行的操作。行为语句,指明了任务被调用时需要进行的操作。4)任务定义与)任务定义与“过程块过程块”、“连续赋值语句连续赋值语句”及及“函函数定数定 义义”以并列的方式存在于行为描述中,以并列的方式存在于行为描述中,“任务定义任务定义” 不能出现在任何过程块的内部。不能出现在任何过程块的内部。2024/8/2 P.184任务定义举例:任务定义举例:task read_mem;i

97、nput 15: 0 address;output 31: 0 data;reg 3: 0 counter;reg 7: 0 temp 1: 4;begin for (counter=1; counter=4; counter=counter+1) tempcounter=memaddress+counter-1; data=temp1,temp2,temp3,temp4;endendtask2024/8/2 P.1852. 任务的调用任务的调用格式:格式: (端口(端口1,端口,端口2,端口,端口n););说明:说明:1)任务调用语句只能出现在过程块中。)任务调用语句只能出现在过程块中。2)

98、当被调用的任务具有输入、输出端口时,任务)当被调用的任务具有输入、输出端口时,任务调用语句必须包含端口列表,其列表内各端口名出调用语句必须包含端口列表,其列表内各端口名出现的顺序和类型必须与任务定义结构中端口说明部现的顺序和类型必须与任务定义结构中端口说明部分的端口顺序和类型一致。分的端口顺序和类型一致。3)只有寄存器类的变量才能与任务的输出端口相)只有寄存器类的变量才能与任务的输出端口相对应。对应。2024/8/2 P.186对任务对任务“read_mem”进行调用进行调用module demo_task_invo;reg 7: 0 mem128: 0;reg 15: 0 a;reg 31:

99、 0 b;initial begina=0;2024/8/2 P.187read_mem(a, b);#10a=64;read_mem(a, b); endendmodule2024/8/2 P.188三三.函数函数1. 函数的定义函数的定义function 函数名函数名;输入端口声明;输入端口声明;局部变量定义;局部变量定义;begin 行为语句行为语句1;行为语句行为语句nendendfunction 2024/8/2 P.189function 7: 0 get0;input 7: 0 x;reg 7: 0 count;integer i; begincount=0;for (i=0;

100、i=7; i=i+1)if (xi=1b0) count=count+1;get0=count; endendfunction定定义义函函数数举举例例2024/8/2 P.1902. 函数的调用函数的调用格式格式: (,););说明:说明:1)函数的调用不能单独作为一条语句出现,)函数的调用不能单独作为一条语句出现,只能作为操作数出现在调用语句内。只能作为操作数出现在调用语句内。2024/8/2 P.191例例1:用函数和:用函数和case语句描述的编码器(不含优先顺序)语句描述的编码器(不含优先顺序)module code_83(din,dout);input7:0 din;output2:

101、0 dout;function2:0 code;input7:0 din;casex (din)8b1xxx_xxxx : code = 3h7;8b01xx_xxxx : code = 3h6;8b001x_xxxx : code = 3h5;2024/8/2 P.1928b0001_xxxx : code = 3h4;8b0000_1xxx : code = 3h3;8b0000_01xx : code = 3h2;8b0000_001x : code = 3h1;8b0000_000x : code = 3h0;default: code = 3hx;endcaseendfunction

102、assign dout = code(din) ;endmodule2024/8/2 P.1932)函数调用既能出现在过程块中,也能出现在)函数调用既能出现在过程块中,也能出现在 assign连续赋值语句中。连续赋值语句中。3)定义函数时,没有端口列表名,但调用函数时,)定义函数时,没有端口列表名,但调用函数时, 需列出端口列表名,端口名的排序和类型必须与需列出端口列表名,端口名的排序和类型必须与 定义时的相一致。定义时的相一致。4)函数不能调用任务,但任务可以调用别的任务和)函数不能调用任务,但任务可以调用别的任务和 函数,且调用个数不限。函数,且调用个数不限。5)函数的调用与定义必须在一个

103、)函数的调用与定义必须在一个module模块内。模块内。2024/8/2 P.1943. 任务与函数的区别任务与函数的区别1)输入与输出)输入与输出任务:可有任意个各种类型的参数。任务:可有任意个各种类型的参数。函数:至少有一个输入,不能将函数:至少有一个输入,不能将inout类型作为类型作为输出。输出。2)调用)调用任务:只可在过程语句中调用,不能在任务:只可在过程语句中调用,不能在assign中中调用。调用。3)定时和事件控制()定时和事件控制(, #和和wait)任务:可包含定时和事件控制语句。任务:可包含定时和事件控制语句。函数:不可包含定时和事件控制语句。函数:不可包含定时和事件控制

104、语句。2024/8/2 P.1954)调用其它任务和函数)调用其它任务和函数任务:可调用其它任务和函数。任务:可调用其它任务和函数。函数:可调用其它函数,但不可调用其它任函数:可调用其它函数,但不可调用其它任务。务。5)返回值)返回值任务:不向表达式返回值。任务:不向表达式返回值。函数:向调用它的表达式返回一个值。函数:向调用它的表达式返回一个值。2024/8/2 P.196结构描述结构描述行为描述行为描述数据流描述数据流描述6 Verilog HDL的描述风格的描述风格2024/8/2 P.197一一. 结构描述结构描述结构描述方式是将硬件电路描述成一个分结构描述方式是将硬件电路描述成一个分

105、级子模块系统的一种描述方式。在这种描述方级子模块系统的一种描述方式。在这种描述方式下,组成硬件电路的各个子模块之间的相互式下,组成硬件电路的各个子模块之间的相互层次关系及相互连接关系都需要得到说明。层次关系及相互连接关系都需要得到说明。可通过如下方式来描述电路的结构:可通过如下方式来描述电路的结构:1)调用)调用Verilog内置门元件(门级结构描述)内置门元件(门级结构描述)2)调用开关级元件(开关级结构描述)调用开关级元件(开关级结构描述)3)用户自定义元件)用户自定义元件UDP(门级)(门级)2024/8/2 P.1981. Verilog内置门元件内置门元件共内置共内置26个基本元件,

106、其中个基本元件,其中14个是门级元个是门级元件,件,12个为开关级元件。个为开关级元件。and与门;与门; xor异或门;异或门; nand与非门;与非门; xor异或非门;异或非门;nor或非门;或非门; buf缓冲器;缓冲器;or或门;或门; not非门。非门。2024/8/2 P.1992. 门元件的调用门元件的调用格式:格式:门元件名字门元件名字 例化的门名字例化的门名字 (端口列表)(端口列表)其中:其中:1)普通门的端口列表按下面的顺序列出:)普通门的端口列表按下面的顺序列出:(输出,输入(输出,输入1,输入,输入2,););例:例:/*三输入与门,名字为三输入与门,名字为a1*/

107、and a1(out, in1, in2, in3); 2024/8/2 P.2002)对三态门,按如下顺序列出输入、输出端口:)对三态门,按如下顺序列出输入、输出端口:(输出,输入,使能控制端);(输出,输入,使能控制端);例:例:/*高电平使能的三态门高电平使能的三态门*/ bufif1 mytri1(out, in, enable);3)对)对buf和和not两种元件的调用,允许有多个输两种元件的调用,允许有多个输 出,但只能有一个输入。出,但只能有一个输入。例:例:/*1个输入个输入in ,2个输出个输出out1, out2 */not n1(out1, out2, in);2024/

108、8/2 P.201例:调用门元件实现例:调用门元件实现4选一数据选择器。选一数据选择器。module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not (notcntrl1,cntrl2), (notcntrl2,cntrl2);2024/8/2 P.202and (w,in1,notcntrl1,notcntrl2), (x,in2,notcntrl1,cntrl2), (y,in3,cnt

109、rl1,notcntrl2), (z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodule2024/8/2 P.203二二. 行为描述行为描述行为描述的目标不是对电路的具体硬件行为描述的目标不是对电路的具体硬件结构进行说明,仅从电路的行为和功能的角结构进行说明,仅从电路的行为和功能的角度来描述某一电路模块。度来描述某一电路模块。结构级描述在进行仿真时优于行为描述;结构级描述在进行仿真时优于行为描述;行为描述在综合时更优越;行为描述在综合时更优越;对设计者来说,采用的描述级别越高,对设计者来说,采用的描述级别越高,设计越容易。所以在电路设计中,除非一些设计越

110、容易。所以在电路设计中,除非一些关键路径的设计采用结构描述外,一般更多关键路径的设计采用结构描述外,一般更多地采用行为描述方式。地采用行为描述方式。2024/8/2 P.204例:用例:用case语句实现语句实现4选一数据选择器。选一数据选择器。module mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always(in1 or in2 or in3 or in4 or cntrl1 or cntrl2)2024/8/2 P.205case(c

111、ntrl1,cntrl2)2b00:out=in1;2b01:out=in2;2b10:out=in3;2b11:out=in4;default:out=2bx;endcaseendmodule2024/8/2 P.206三三. 数据流描述数据流描述例:数据流方式描述的例:数据流方式描述的4选一数据选择器选一数据选择器module mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=(in1 & cntrl1 & cntrl2)|(in2 & c

112、ntrl1 & cntrl2)|(in3 & cntrl1 &cntrl2)|(in4 & cntrl1 & cntrl2); endmodule数据流描述方式与布尔表达式比较类似数据流描述方式与布尔表达式比较类似 2024/8/2 P.2077 Verilog HDL设计进阶设计进阶组合逻辑电路设计进阶组合逻辑电路设计进阶2024/8/2 P.208组合逻辑电路举例组合逻辑电路举例组合电路组合电路Preset when counter valueis H”7”2024/8/2 P.209仿真结果分析Error理论结果理论结果理论结果理论结果实际结果实际结果实际结果实际结果2024/8/2 P

113、.210可编程器件有问题可编程器件有问题我再也不用它了我再也不用它了No, no, no.这这不是不是可编程可编程器件的问题器件的问题OK ! I can prove it to youHow ?2024/8/2 P.211一个最简单的组合逻辑电路一个最简单的组合逻辑电路!但可编程器件对这么简单的电路的处理也但可编程器件对这么简单的电路的处理也但可编程器件对这么简单的电路的处理也但可编程器件对这么简单的电路的处理也会出错会出错会出错会出错一个两输入的与门或者两输入的或门是最简单的一个两输入的与门或者两输入的或门是最简单的电路电路2024/8/2 P.212两输入与门的仿真结果两输入与门的仿真结

114、果输入波形输出波形这部分有问题这一定是器件器件的原因但问题真的是这么简单?但问题真的是这么简单?2024/8/2 P.213再进一步分析再进一步分析这代表什么意思呢?这代表什么意思呢?假设与门的内部延假设与门的内部延时是时是0.2nS对信号B进行简单计算:(Trace delay of b) + AND gate internal delay = 8.1ns(Trace delay of b) + 0.2ns = 8.1ns(Trace delay of b) = 7.9ns对信号A进行简单计算:(Trace delay of a) + AND gate internal delay = 11

115、.1ns(Trace delay of a) + 0.2ns = 11.1ns(Trace delay of a) = 10.9ns2024/8/2 P.214结果再分析Time : 0ns1-00-1001(Trace delay of b) = 7.9ns(Trace delay of a) = 10.9nsTime : 7.9ns01011Time : 8.1ns01111Time : 10.9ns01110Time : 11.1ns01010Output C change from “0” to “1” at 8.1nsA 3 ns Pulse generate (10.9-7.9 =

116、 3ns)Output C change back from “1” to “0” as the final result2024/8/2 P.215总 结设计一个设计一个 2输入的与门也不是象输入的与门也不是象1+1=2那么简那么简单单在组合逻辑设计中我们需要考虑在组合逻辑设计中我们需要考虑 Trace Delay and Gate Delay 函数函数 : C的输出为的输出为 “0”时序时序 : C的输出有一个的输出有一个3ns宽的毛刺宽的毛刺这这3ns的毛刺主要是由的毛刺主要是由 Trace Delay造成的造成的组合电路工作时不仅和逻辑函数相关还和时组合电路工作时不仅和逻辑函数相关还和

117、时序相关序相关2024/8/2 P.216深入总结当某一时刻同时有一个以上的信号发生变化当某一时刻同时有一个以上的信号发生变化时容易产生毛刺时容易产生毛刺组合逻辑电路是会产生毛刺的组合逻辑电路是会产生毛刺的 2024/8/2 P.217This is not Device ProblemThis is Design ProblemIf you want your cirucit work RELIABLE, you need to consider TIMING FACTOR2024/8/2 P.218再讨论第一个例子再讨论第一个例子这两个点之间的延时这两个点之间的延时是什么样的呢?是什么样的

118、呢?2024/8/2 P.219分 析q2 q1 q00 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1毛刺毛刺 ?No毛刺毛刺?No毛刺毛刺?No毛刺毛刺?0 1 11 0 0Yes毛刺毛刺?No毛刺毛刺?1 0 11 1 0Yes毛刺毛刺?No2024/8/2 P.220仿真结果分析仿真结果分析从从 “3”变到变到 “4”的的时候产生毛刺时候产生毛刺从从 “5”变到变到 “6”的的时候产生毛刺时候产生毛刺两个不希望看到的毛刺两个不希望看到的毛刺仿真结果正确,可编程器件没有问题仿真结果正确,可编程器件没有问题仿真结果正确,可编程器件没有问题仿真结果正确,可编程器

119、件没有问题2024/8/2 P.221毛刺的宽度毛刺的宽度“3” to “4”“3” to “4”011 - 100011 - 100“5” to “5” to “6”“6”101 - 101 - 1101102024/8/2 P.222结结 论论如果我们知道毛刺是什么产生的如果我们知道毛刺是什么产生的我们可以计算出毛刺出现的具体时间我们可以计算出毛刺的脉冲宽度当组合逻辑输出用做以下功能时必须加以注意当组合逻辑输出用做以下功能时必须加以注意 触发器的CLEAR端触发器的PRESET 端触发器的CLOCK 端锁存器的控制端其他其他 .2024/8/2 P.223消除毛刺的方法消除毛刺的方法(一一

120、)重新设计结构重新设计结构2024/8/2 P.224格雷码(相邻码只有一位改变)格雷码(相邻码只有一位改变)000008110010001911012001110111130010111110401101210105011113101160101141001701001510002024/8/2 P.225消除毛刺的方法消除毛刺的方法(二二)有毛刺的程序:有毛刺的程序:module longframe1(clk,strb);parameter delay=8;input clk;output strb;reg strb;reg7:0 counter;2024/8/2 P.226always(

121、posedge clk)begin if(counter=255) counter=0; else counter=counter+1; endalways(counter) begin if(counter=(delay-1) strb=1; else strb=0;endendmodule2024/8/2 P.227输出端加输出端加 D 触发器后消除毛刺的程序:触发器后消除毛刺的程序:module longframe2(clk,strb);parameter delay=8; input clk;output strb;reg7:0 counter;reg temp;reg strb;20

122、24/8/2 P.228always(posedge clk) begin if(counter=255) counter=0; else counter=counter+1; endalways(posedge clk) begin strb=temp;/引入一个触发器引入一个触发器 end2024/8/2 P.229always(counter) begin if(counter=(delay-1) temp=1; else temp=0;endendmodule2024/8/2 P.230组合逻辑电路举例组合逻辑电路举例:1. 三态门三态门module tri_1(in,en,out);

123、input in,en;output out;tri out;bufif1 b1(out,in,en); /注意三态门端口的排列顺序注意三态门端口的排列顺序endmodule2024/8/2 P.231用数据流方式描述的三态门:用数据流方式描述的三态门:module tri_2(out,in,en);output out;input in,en;assign out = en ? in : bz;endmodule2024/8/2 P.2322. 译码器译码器module decoder_38(out,in);output7:0 out;input2:0 in;reg7:0 out;alway

124、s (in)begin2024/8/2 P.233 case(in)3d0: out=8b11111110;3d1: out=8b11111101;3d2: out=8b11111011;3d3: out=8b11110111;3d4: out=8b11101111;3d5: out=8b11011111;3d6: out=8b10111111;3d7: out=8b01111111; endcaseendendmodule2024/8/2 P.2343. 8-3优先编码器优先编码器module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h);outpu

125、t none_on;output2:0 outcode;input a,b,c,d,e,f,g,h;reg3:0 outtemp;assign none_on,outcode=outtemp;always (a or b or c or d or e or f or g or h)begin2024/8/2 P.235if(h) outtemp=4b0111;else if(g) outtemp=4b0110;else if(f) outtemp=4b0101;else if(e) outtemp=4b0100;else if(d) outtemp=4b0011;else if(c) outt

126、emp=4b0010;else if(b) outtemp=4b0001;else if(a) outtemp=4b0000; else outtemp=4b1000; endendmodule2024/8/2 P.236时序逻辑电路举例时序逻辑电路举例:1. 基本基本D触发器触发器module DFF(Q,D,CLK);output Q;input D,CLK;reg Q;always (posedge CLK)beginQ = D;endendmodule2024/8/2 P.2372. 带异步清带异步清0、置、置1的的D触发器触发器module DFF1(q,qn,d,clk,set,r

127、eset);input d,clk,set,reset;output q,qn;reg q,qn;always (posedge clk or negedge set or negedge reset)beginif (!reset)begin q = 0; qn = 1; end2024/8/2 P.238else if (!set) begin q = 1; qn = 0; endelse begin q = d; qn = d; end endendmodule2024/8/2 P.2393. 带异步清带异步清0、置、置1的的JK触发器触发器module JK_FF(CLK,J,K,Q,

128、RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always (posedge CLK or negedge RS or negedge SET)beginif(!RS) Q = 1b0;else if(!SET) Q = 1b1;else2024/8/2 P.240case(J,K)2b00 : Q = Q;2b01 : Q = 1b0;2b10 : Q = 1b1;2b11 : Q = Q;default: Q= 1bx; endcaseendendmodule2024/8/2 P.2414. 8位数据锁存器位数据锁存器module latch_8(

129、qout,data,clk);output7:0 qout;input7:0 data;input clk;reg7:0 qout;always (clk or data)beginif (clk) qout=data;endendmodule2024/8/2 P.2425. 8位移位寄存器位移位寄存器module shifter(din,clk,clr,dout);input din,clk,clr;output7:0 dout;reg7:0 dout;always (posedge clk)beginif (clr) dout= 8b0;2024/8/2 P.243else begin dout = dout 1; dout0 = din; endendendmodule2024/8/2 P.244层次化设计方法分层原则层次化设计方法分层原则将所有的算术运算安排在同一层中,状态机、将所有的算术运算安排在同一层中,状态机、随机逻辑、数据路径等逻辑类型作为独立的模随机逻辑、数据路径等逻辑类型作为独立的模块设计块设计模块的输入尽量不要悬空,输出应尽量寄存。模块的输入尽量不要悬空,输出应尽量寄存。单个功能块应保持在单个功能块应保持在30006000门之间,门之间,HDL语言的行数不超过语言的行数不超过400行行尽量采用专用的尽量采用专用的IP核进行设计核进行设计

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号