硬件描述语言Verilog-HDL.ppt

上传人:牧羊曲112 文档编号:5806765 上传时间:2023-08-21 格式:PPT 页数:85 大小:1.04MB
返回 下载 相关 举报
硬件描述语言Verilog-HDL.ppt_第1页
第1页 / 共85页
硬件描述语言Verilog-HDL.ppt_第2页
第2页 / 共85页
硬件描述语言Verilog-HDL.ppt_第3页
第3页 / 共85页
硬件描述语言Verilog-HDL.ppt_第4页
第4页 / 共85页
硬件描述语言Verilog-HDL.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《硬件描述语言Verilog-HDL.ppt》由会员分享,可在线阅读,更多相关《硬件描述语言Verilog-HDL.ppt(85页珍藏版)》请在三一办公上搜索。

1、1,9.1 硬件描述语言概述9.2 Verilog HDL简介 9.2.1 基本程序结构 9.2.2 词法构成 补充:常用语句 9.2.3 模块的描述方式9.3 用Verilog HDL描述逻辑电路的实例 组合逻辑电路的Verilog HDL描述 时序逻辑电路的Verilog HDL描述,第九章 硬件描述语言简介,2,9.1 硬件描述语言概述,可编程逻辑器件、电子设计自动化(EDA)与硬件描述语言,可编程逻辑器件是一种功能可变的集成器件,可通过编程的方法设计其完成不同的逻辑功能,设计需借助软件工具,即采用电子设计自动化的方式,设计形式有原理图和硬件描述语言两种,硬件描述语言是用来描述数字电路系

2、统的一种语言,3,9.1 硬件描述语言概述,硬件描述语言HDL(Hardware Description Language)是一种高级程序语言,用来描述数字电路和数字逻辑系统。数字逻辑电路设计者可利用这种语言来编写设计文件描述自己的设计思想,在EDA工具中建立电路模型。通过对电路结构或功能行为的描述,可以在不同的抽象层次对电路进行逐层描述,然后利用EDA工具进行仿真验证,再自动综合到门级电路,最后用ASIC或FPGA实现其功能。,4,9.1 硬件描述语言概述,目前常用的硬件描述语言有两种,VHDL,Verilog HDL,Very High Speed Integrated Circuit H

3、ardware Description Language超高速集成电路硬件描述语言,Verilog Hardware Description LanguageVerilog硬件描述语言,分别在1987年和1995年被采纳为IEEE国际标准,广泛用于 数字集成电路的设计和验证领域。从使用者数量来看,目前两种语言平分秋色。两种语言相似的地方很多,学会一种可自学另一种。,5,Verilog HDL国际标准,9.2 Verilog HDL简介,6,Verilog HDL在数字集成电路设计流程中的作用,9.2 Verilog HDL简介,7,章节目录,9.1 硬件描述语言概述9.2 Verilog HD

4、L简介 9.2.1 基本程序结构 9.2.2 词法构成 补充:常用语句 9.2.3 模块的描述方式9.3 用Verilog HDL描述逻辑电路的实例 组合逻辑电路的Verilog HDL描述 时序逻辑电路的Verilog HDL描述,9.2.1 Verilog HDL的基本程序结构Verilog HDL程序设计由模块(module)构成的,以模块集合的形式来描述数字电路系统。模块(module)是Verilog HDL语言中描述电路的基本单元。模块对应硬件上的逻辑实体,描述这个实体的功能或结构,以及它与其他模块的接口。所描述的可以是简单的逻辑门,也可以是功能复杂的系统。模块在概念上可等同一个器

5、件,就如我们调用通用器件(与门、三态门等)或通用宏单元(译码器、计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用。一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模(描述)方式。,8,9,一、模块端口的定义模块端口定义用来声明电路设计模块 的输入/输出端口,端口定义格式如下:module 模块名(端口1,端口2,端口3,);在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模

6、块的端口定义为module adder1(A,B,CI,S,CO);module BCD_adder(A,B,CIN,SUM,COUT);,9,模块(module)的基本语法结构,module();endmodule,二、模块内容 模块内容包括I/O声明、信号类型声明和功能描述。(1)模块的I/O声明 模块的I/O声明用来声明模块端口定义中各端口数据流动方向,包括输入(input)、输出(output)和双向(inout)。I/O声明格式如下:input msb:lsb 端口1,端口2,端口3,;/声明输入端口 output msb:lsb 端口1,端口2,端口3,;/声明输出端口例如,1位全

7、加器的I/O声明为 input A,B,CI;output S,CO;,10,input 3:0 A,B;output 3:0 SUM;input CIN;output COUT;,(2)信号类型声明信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。信号声明格式如下:wire msb:lsb 端口1,端口2,端口3,;reg msb:lsb 端口1,端口2,端口3,;(3)功能描述功能描述是Verilog HDL程序设计中最主要的部分,用来描述设计模块的内部结

8、构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)语句、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。,11,用assign语句建模 用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式。assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。例1 一位全加器的设计1位全加器的逻辑符号:S是全加器的和输出端,CO是进位输出端,A和B是两个加数输入端,CI是低位进位输入端。,12,全加器的Verilog HDL源程序如下:module adder1

9、(A,B,CI,S,CO);input A,B,CI;output S,CO;wire S,CO,A,B,CI;assign CO,S=A+B+CI;endmodule“assign CO,S=A+B+CI;”语句实现1位全加器的进位输出CO与和输出S的建模。在语句表达式中,用拼接运算符“”将CO、S这两个1位操作数拼接为一个2位操作数。,13,用元件例化(instantiate)语句建模元件例化语句建模是利用Verilog HDL提供的元件库实现的。例如,用与门例化元件定义一个三输入端与门可以写为and myand3(y,a,b,c);and是Verilog HDL元件库中与门元件名,mya

10、nd3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。用always块语句建模always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。,14,例2 8位二进制加法计数器的设计8位二进制加法计数器的逻辑符号如图OUT是8位二进制计数器的输出端(8位向量);COUT是进位输出端(1位);D是并行数据输入端(8位向量);LOAD是计数器的预置控制输入端,当LOAD=1时,OUT=D;CLK是时钟控制输入端,上升沿为有效边沿;CLR是同步复位输入端,当CLK

11、的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。,(逻辑符号图是由计算机对计数器电路的Verilog HDL源代码编译后产生的元件符号,图中的输入/输出标识符自动被改为大写,而源程序中的标识符都是小写。),15,8位二进制加法计数器的Verilog HDL 源程序如下:module cnt8(d,load,cin,clk,clr,cout,out);input 7:0 d;input load,cin,clk,clr output 7:0 out;output cout;reg 7:0 out;always(posedge clk)begin if(load)out=d;

12、else if(clr)out=b00000000;else out=out+1;end assign cout=”语句产生进位输出cout,在语句中“&out”是与的归约运算式,只有out中数字全为1时,结果才为1。,16,用initial块语句建模Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。Initial块语句的使用格式:Initial Begin 语句1;语句2;:end例3 用Initial过程语句对测试变量赋值 initial begin for(addr=0;addrsize;addr=addr+1)memoryaddr=0;/对memory存储器

13、进行初始化 end,17,从以上例子中可以看出 Verilog HDL程序设计模块的基本结构:Verilog HDL程序是由模块(module)构成的。每个模块的内容都是嵌套在module和endmodule两语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。每个模块首先要进行端口定义,并进行I/O声明和信号类型声明,然后对模块的功能进行逻辑描述。Verilog HDL程序的书写格式自由,一行可以有一条或多条语句,一条语句也可以分为多行写。除了end或以end开头的关键字(如endmodule)语句外,每条语句后必须要有分号“;”。可以用/*/或/对Verilog HDL程序的任何部

14、分注释。一个完整的源程序都应当加上必要的注释,以加强程序的可读性。,18,19,章节目录,9.1 硬件描述语言概述9.2 Verilog HDL简介 9.2.1 基本程序结构 9.2.2 词法构成 补充:常用语句 9.2.3 模块的描述方式9.3 用Verilog HDL描述逻辑电路的实例 组合逻辑电路的Verilog HDL描述 时序逻辑电路的Verilog HDL描述,9.2.2 Verilog HDL的词法构成Verilog HDL源程序一般包括:间隔符与注释符、操作符、数值常量、字符串、标识符和关键字等语法元素。(1)间隔符与注释符间隔符又称空白符,包括空格符、tab符号、换行符及换页

15、符等。它们的作用是分隔其他词法标识符。在必要的地方插入间隔符可以增强源文件的可读性。但在字符串中空格符和tab符号(制表符)是有意义的字符。Verilog HDL 有单行注释和多行段注释两种注释形式。单行注释以字符“/”起始,到本行结束;而段注释则以“/*”起始以“*/”结束,在段注释中不允许嵌套,段注释中单行注释标识符“/”没有任何特殊意义。(2)操作符Verilog HDL 中定义了操作符,又称运算符,按照操作数的个数,可以分为一元、二元和三元操作符;按功能可以大致分为算术操作符、逻辑操作符、比较操作符等几大类。,20,P446 表9.2.1 Verilog HDL 的操作符及简要说明,2

16、1,22,23,同其他高级语言类似,各类操作符号之间有优先级之分,如下表:,列表顶部是最高优先级,底部是最低优先级。列在同一行中的操作符具有相同的优先级。所有操作符(?:除外)在表达式中都是从左向右结合的。圆括号()用于改变优先级或使得表达式中运算顺序更加清晰,提高源文件的可读性。,24,(3)数值常量 Verilog HDL中的数值常量有整型和实型两大类,分为十进制、十六进制、八进制或二进制。若在前面加上一个正“+”或负“”号就表示有符号数,否则所代表的就是无符号数。在数值常量的任意位置可以随意插入下划线“_”以提高可读性。常量定义格式为:parameter 常量名1=表达式,常量名2=表达

17、式,常量名n=表达式;parameter是常量定义关键字,常量名是用户定义的标识符,表达式为常量赋值。例如 parameter Vcc=5,fbus=8b11010001;Verilog HDL中的整型数值常量就是整数,有两种书写格式:第一种是无位宽的十进制表示法,如-132。第二种是定义位宽和进制的表示法,这种表示方法通常是无符号数。常数书写格式是:sizebase value 其中size是位宽,定义了数值常量的位数(长度);base 代表这个数据的进制,取值范围和相应的进制如下表;value是一个数值常量的值,书写格式与进制base相对应。例如 16h6a8c,表示一个4位十六进制数。8

18、hf5 等于8b11110101;8b1111xxxx 等价8hfx;8b1101zzzz 等价8hdz。,25,P448 表9.2.2 Verilog HDL中的进制,Verilog HDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。Verilog HDL的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有0(低电平)和1(高电平),还有可能是X(未知状态)和Z(高阻态),因此Verilog HDL数值集合有四个基本值:0:逻辑0或假状态;1:逻辑1或真状态;X:逻辑不确定;Z:高阻态。,26,(4)字

19、符串字符串是双引号“”括起来的字符序列,必须包含在同 一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。(5)标识符标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$符和下划线“_”字符的任意组合序列。定义标识符规则:首字符不能是数字,必须以字母或下划线“_”开头。字符数不能多于1024。标识符区分大小写。不要与关键字同名。例如 ina、inb、adder、adder8、name_adder是正确的,而1a?b是错误的。(6)关键字关键

20、字是Verilog HDL预先定义的专用词。在IEEE标准Verilog HDL 1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。,27,P449 表9.2.3 关键字,28,(7)变量变量是在程序运行时其值可以改变的量。在Verilog HDL中,变量分为网络型(nets type)和寄存器型(register type)两种。网络型变量nets型变量是输出值始终根据输入变化而更新的变量,一般用来定义硬件电路中的各种物理连线。Verilog HDL提供了多种nets型变量。常见的nets型变量及说明,29,寄存器型变量re

21、gister型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。register型变量与wire型变量的区别在于:register型变量需要被明确的赋值,并且在重新赋值前一直保持原值。register型变量是在always、initial等过程语句中定义,并通过过程语句赋值。常见的register型变量及说明,30,31,章节目录,9.1 硬件描述语言概述9.2 Verilog HDL简介 9.2.1 基本程序结构 9.2.2 词法构成 补充:常用语句 9.2.3 模块的描述方式9.3 用Ve

22、rilog HDL描述逻辑电路的实例 组合逻辑电路的Verilog HDL描述 时序逻辑电路的Verilog HDL描述,补充:Verilog HDL的常用语句Verilog HDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。(1)赋值语句在Verilog HDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。Verilog HDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。门基元赋值语句门基元赋值语句的格式为:基本逻辑门关键字

23、(门输出,门输入1,门输入2,门输入n);例如 4输入与非门的门基元赋值语句为 nand(y,a,b,c,d);/与语句assign y=(a&b&c&d)等效,32,连续赋值语句连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为:assign 赋值变量=表达式;例如 assign y=(a/#1表示输出与输入信号之间具有1个单位的时间延迟 endmodule,33,过程赋值语句过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为:赋值变量=表达式;过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在该语句结束时即可得到。如果一

24、个块语句中包含若干条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。因此,过程赋值语句也称为阻塞赋值语句。,34,非阻塞赋值语句非阻塞赋值语句也是出现在initial和always块语句中,赋值符号是“=”,语句格式为:赋值变量=表达式;非阻塞赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在块语句结束时才可得到,与过程赋值语句不同。例如 下面的块语句包含4条赋值语句 always(posedge clock)begin m=3;n=75;n=m;r=n;end语句执行结束后,r的值是75,而不是3,因为第3行是非阻塞赋值语句“n=m”,该语句要等到本块

25、语句结束时,n的值才能改变。块语句的“(posedge clock)”是定时控制敏感函数,表示时钟信号clock的上升沿到来的敏感时刻。例2 上升沿触发的D触发器的Verilog HDL源程序 module D_FF(q,d,clock);input d,clock;/属于wire型变量 output q;/属于reg型变量 reg q;always(posedge clock)q=d;endmodule,35,(2)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。if语句完整的Verilog HDL的if语句结构如下:if(表达式)begin 语句;en

26、d else if(表达式)begin 语句;end else begin 语句;end在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为1位的变量。系统对表达式的值进行判断,若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。,36,例3 8线-3线优先编码器的设计8线-3线优先编码器的功能表 module code(y,a);input 7:0 a;output 2:0 y;reg 2:0 y;always(a)begin if(a7)y=3b111;else if(a6)y=3b110;else if(a5)y=3b101;else if(a4)y=3b100

27、;else if(a3)y=3b011;else if(a2)y=3b010;else if(a1)y=3b001;else y=3b000;end endmodule,37,case语句case语句是一种多分支的条件语句,case语句的格式为:case(表达式)选择值1:语句1;选择值2:语句2;选择值n:语句n;default:语句n+1 endcase执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。default可以省略。case语句多用于数字系统中的译码器、数据选择器、状态机

28、及微处理器的指令译码器等电路的描述。,38,例4:用case语句描述4选1数据选择器控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。4选1数据选择器Verilog HDL的描述如下:module mux_4_1(z,a,b,c,d,s1,s2);input s1,s2;input a,b,c,d;output z;reg z;always(a,b,c,d,s1,s2)begin case(s1,s2)2b00:z=a;2b01:z=b;2b10:z=c;2b11:z=d;endcase end endmodulecase语句还有两种变体形式,casez和casex语句。

29、与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。,4选1数据选择器功能表,39,(3)循环语句循环语句包含for语句、repeat语句、while语句和forever语句4种。for语句for语句的格式为:for(循环指针=初值;循环指针 终值;循环指针=循环指针+步长值)begin 语句;endfor语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即 循环重复次数=(终值-初值)/步长值,40,例5:8位奇偶校验器的描述用a表示输入信号,长度为8位的向量。在程序中,用for语句对a的值,逐位进行模2加运

30、算(即异或XOR),循环指针变量n控制模2加的次数。11100110 奇数个1循环变量的初值为0,终值为8,因此,控制循环共执行了8次。例5 用Verilog HDL对8位奇偶校验器的描述如下:module test8(a,out);input7:0 a;output out;reg out;integer n;always(a)begin out=0;for(n=0;n8;n=n+1)out=outan;/异或 end endmodule,41,repeat语句repeat语句的语法格式为:repeat(循环次数表达式)语句;例6 用repeat语句实现8位奇偶校验器的描述如下:module

31、 test8_1(a,out);parameter size=7;input7:0 a;output out;reg out;integer n;always(a)begin out=0;n=0;repeat(size)begin out=outan;n=n+1;end end endmodule/Quartus II软件不支持repeat语句,但synplify软件支持。,42,while语句while语句的语法格式为:while(循环执行条件表达式)begin 重复执行语句;修改循环条件语句;endwhile语句在执行时,首先判断循环执行条件表达式是否为真。若为真,则执行其后面的语句;若为

32、假,则不执行,表示循环结束。为了使语句能够结束,在循环执行的语句中必须包含一条能改变循环条件的语句。forever语句forever语句的语法格式为:forever begin 语句;endforever是一种无穷循环控制语句,它不断地执行其后的语句或语句块,永远不会结束。forever语句常用来产生周期性的波形,作为仿真激励信号。例如产生时钟clk的语句为:#10 forever#10 clk=!clk;/#10表示输出与输入信号之间具有10个单位的时间延迟,!clk取非,43,(4)结构声明语句Verilog HDL的任何过程模块都是放在结构声明语句中,结构声明语句包括always、ini

33、tial、task和function等4种结构。always块语句在一个Verilog HDL模块(module)中,always块语句的使用次数是不受限制的,块内的语句也是不断重复执行的。always块语句的语法结构为:always()begin/过程赋值语句;/if 语句,case语句;/for语句,while语句,repeat语句;/task语句、function语句;end在always块语句中,敏感信号表达式应该列出影响块内取值的所有信号(指设计电路的输入信号),多个信号之间用“or”连接。当表达式中任何信号发生变化时,就会执行一遍块内的语句。块内语句可以包括:过程赋值、if、cas

34、e、for、while、repeat、task和function等语句。在进行时序逻辑电路的描述中,敏感信号表达式中经常使用“posedge”和“negedge”这两个关键字来声明事件是由输入信号的正边沿(上升沿)或负边沿(下降沿)触发的。如“always(posedge clk)”表示模块的事件是由clk的上升沿触发的;而“always(negedge clk)”表示模块的事件是由clk的下降沿触发的。,44,initial语句initial语句的语法格式为:initial begin 语句1;语句2;endinitial语句的使用次数是不受限制的,但块内的语句仅执行一次,因此initial

35、语句常用于仿真中的初始化。,45,task语句在Verilog HDL模块中,task语句用来定义任务。任务类似高级语言中的子程序,用来单独完成某项具体任务,并可以被模块或其他任务调用。利用任务可以把一个大的程序模块分解成为若干小的任务,使程序清晰易懂。可以被调用的任务必须事先用task语句定义,定义格式如下:task 任务名;端口声明语句;类型声明语句;begin 语句 end endtask任务定义与模块(module)定义的格式相同,区别在于任务是用task-endtask语句来定义,而且没有端口名列表。例如,8位加法器的任务定义如下:task adder8 output7:0 sum;

36、output cout;input7:0 ina,inb;input cin;assigncout,sum=ina+inb+cin;endtask,46,任务调用的格式如下:任务名(端口名列表);例如 8位加法器任务调用 adder8(tsum,tcout,tina,tinb);使用任务时,需要注意几点:(1)任务的定义和调用必须在同一个module模块内。(2)定义任务时,没有端口名列表,但要进行端口和数据的 声明。(3)当任务调用时,任务被激活。任务调用与模块调用一样,通过任务名实现,调用时需列出端口名列表,端口名和 类型必须与任务定义的排序和类型一致。例如 8位加法器任务调用时的端口名列

37、表中的tsum、tcout、tina、tinb端口,与任务定义中的端口sum、cout、ina、inb排序和类型保持一致。(4)一个任务可以调用别的任务或函数,可调用的任务和函数 的个数不受限制。,47,function语句在Verilog HDL模块中,function语句用来定义函数。函数类似高级语言中的函数,用来单独完成某项具体操作,并可以作为表达式中的一个操作数,被模块或任务及其他函数调用,函数调用时返回一个用于表达式的值。可以被调用的函数必须事先定义,函数定义格式如下:functionmsb:lsb 函数名;端口声明语句;类型声明语句;begin 语句;end endfunction

38、在函数定义语句中,“msb:lsb”是函数调用返回值位宽或类型声明。,48,例8 求最大值的函数 function7:0 max;input7:0 a,b;begin if(a=b)max=a;else max=b;end endfunction函数调用的格式如下:函数名(关联参数表);函数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成某些数据的运算或转换。例如,调用上例中求最大值函数的语句为 z=max(x,y);其中,x和y是与函数定义的两个参数a、b相关联的关联参数。通过函数的调用,求出x和y中的最大值,并用函数名max返回。,49,函数和任务存在以下几处区别:(1)任务可

39、以有任意不同类型输入/输出参数,函数不能将inout类型作为输出。(2)任务只可以在过程语句中调用,不能在连续赋值语句assign中调用;函数可以作为表达式中的一个操作数,在过程赋值语句和连续赋值语句中均可调用。(3)任务可以调用其他任务或函数;函数可以调用其他函数,但不能调用任务。(4)任务不向表达式返回值,函数向调用它的表达式返回一个值。,50,(5)语句的顺序执行与并行执行Verilog HDL中有顺序执行语句和并行执行语句之分。always块语句中的语句是顺序语句,按照程序书写的顺序执行。always块本身却是并行语句,它与其他always语句及assign语句、元件例化语句的执行都是

40、同时(即并行)的。例9 同步清除十进制加法计数器的描述同步清0是在时钟信号作用下,计数器的状态被clr清0,清0信号clr高电平有效;时钟信号clk上升沿触发。计数器计数状态从4b0000到4b1001循环。,module cnt10(clr,clk,q,co);input clr,clk;output3:0 q;output co;reg 3:0 q;reg co;always(posedge clk)begin if(clr)begin co=0;q=4b0000;end else if(q=4b1001)begin q=4b0000;co=1;end else begin co=0;q=

41、q+1;end end endmodule,51,52,章节目录,9.1 硬件描述语言概述9.2 Verilog HDL简介 9.2.1 基本程序结构 9.2.2 词法构成 补充:常用语句 9.2.3 模块的描述方式9.3 用Verilog HDL描述逻辑电路的实例 组合逻辑电路的Verilog HDL描述 时序逻辑电路的Verilog HDL描述,9.2.3 Verilog HDL模块的描述方式(建模方法),系统级(system):用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic):用高级语言结构实现设计算法的模型。RTL级(Register Transfer Le

42、vel):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。,用Verilog HDL描述的电路就称为该设计电路的Verilog HDL模型,建模层次:不同抽象级别的Verilog HDL模型,53,Verilog HDL模块的描述方式1、结构描述:描述元器件间连接关系:主要采用元件例化语句instantiate;2、数据流描述:描述电路数据流的流向:主要采用连续赋值语句assign;3、行为描述:描述电路的功能和行为:主要采用always、

43、if、case、for、while等 高级语言;4、混合描述:Verilog HDL允许多种描述方式共存于 同一模块;,一、结构描述,1、基于库元件的结构描述,门类型关键字();,门级描述即直接调用门基元进行逻辑的结构描述。以门级为基础的结构描述所建立的硬件模型不仅是可仿真的,也是可综合的;一个逻辑网络由许多逻辑门和开关组成,用逻辑门的模型来描述逻辑网络最直观!门类型的关键字有26个,常用的有9个:not,and,nand,or,nor,xor,xnor,buf,bufif1,bufif0,notif1,notif0(各种三态门)调用门基元的句法:,注1:在 端口列表中输出信号列在最前面;注2

44、:门级描述不适于描述复杂的系统!,门级描述,可省略!,例:采用结构描述方式描述以下硬件电路module example2(y,a,b,c);input a,b,c;output y;wire s1,s2,s3;not(s1,a);nand(s2,c,s1);nand(s3,a,b);nand(y,s2,s3);endmodule,2、基于设计模块的结构描述任何用Verilog HDL描述的电路设计模块(module),均可用模块例化语句,例化一个元件,来实现电路系统的设计。模块例化语句格式与逻辑门例化语句格式相同。模块例化语句具体格式:设计模块名(端口列表);其中,“例化电路名”是用户为系统设

45、计定义的标识符,相当于系统电路板上为插入设计模块元件的插座,而端口列表相当于插座上引脚名表,应与设计模块的输入/输出端口一一对应。用模块例化方式设计1位全加器。在1位全加器设计中,需要事先设计一个半加器,然后用例化方式将两个半加器和一个或门连接成全加器。,使用两个半加器模块构造全加器module HA(A,B,S,C);input A,B;output S,C;assign S=A B;assign C=A/或门实例语句endmodule,模块例化端口列表小结:端口列表是把例化元件端口与连接实体端口连接起来。端口列表的方法有两种:,位置关联法:位置关联法要求端口列表中的引脚名称与设计模块的输入

46、、输出端口一一对应。名称关联法:名称关联法的格式如下:(.设计模块端口名(连接实体端口名),);此时端口列表中的位置可以是任意的。,例:用模块例化方式设计8位计数译码器电路系统。在8位计数译码系统电路设计中,需要事先设计一个4位二进制加法计数器cnt4e模块和一个七段数码显示器的译码器Dec7s模块,然后用例化方式将这两种模块组成计数译码系统电路。,4位二进制加法计数器的设计4位二进制加法计数器的符号如图,CLK是时钟输入端;CLR复位控制输入端,当CLR=1时计数器被复位,输出Q3.0=0000;ENA 是使能控制输入端,当ENA=1时,计数器才能工作;COUT是进位输出端,当输出Q3.0=

47、1111时,COUT=1。module cnt4e(clk,clr,ena,cout,q);input clk,clr,ena;output 3:0 q;output cout;reg 3:0 q;always(posedge clr or posedge clk)begin if(clr)q=b0000;else if(ena)q=q+1;end assign cout=endmodule,七段数码显示器的译码器的设计 Dec7s的元件符号如图A3.0是4数据输入端,将接至cnt4e的输出端Q3.0;Q7.0是译码器的输出端,提供七段数码显示数据。module Dec7s(a,q);outp

48、ut7:0 q;input3:0 a;reg7:0 q;always(a),begin case(a)0:q=8b00111111;1:q=8b00000110;2:q=8b01011011;3:q=8b01001111;4:q=8b01100110;5:q=8b01101101;6:q=8b01111101;7:q=8b00000111;8:q=8b01111111;9:q=8b01101111;10:q=8b01110111;11:q=8b01111100;12:q=8b00111001;13:q=8b01011110;14:q=8b01111001;15:q=8b01110001;end

49、case endendmodule,计数译码系统电路的设计计数译码系统电路是用Quartus II的图形编辑方式设计出来的。,用模块例化方式将cnt4e和dec7s两种模块组成计数译码系统电路cnt_dec7s的源程序:module cnt_Dec_v(clk,clr,ena,cout,q);input clk,clr,ena;output 15:0 q;output cout;reg 15:0 q;wire 3:0 q1,q2;wire x;cnt4e u1(clk,clr,ena,x,q1);cnt4e u2(clk,clr,x,cout,q2);dec7s u3(q1,q7:0);dec

50、7s u4(q2,q15:8);endmodule,二、数据流建模,例:数据流描述的一位全加器module FA_Df(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;assign Sum=AB Cin;assign Cout=(A,数据流建模的时延assign#2 Sum=A B Cin;#2表示右侧表达式的值延迟两个时间单位赋给Sum;时间单位是多少?由谁来决定?timescale 1ns/100psFPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。,二、数据流建模,数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号