




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 Verilog HDL语言5.1 Verilog HDL设计模块的基本结构5.2 Verilog HDL词法构成5.3 Verilog HDL的语句5.4.Verilog HDL描述方式5.5 Verilog HDL设计流程5.6 用Verilog HDL描述数字电路的实例1数字集成电路的发展和设计方法的演变数字集成电路复杂度趋势数字集成电路设计方法的演变2以单元为基础以RTL综合为基础以IP为基础70年代单片系统80年代90年代当前多块印刷版系片上系统以元件为基础集成电路的发展经过了三个主要阶段第一次变革是在上世纪70年代:以加工制造为主导的IC(Integrated Circuit
2、)产业发展的初级阶段,主流产品是简单微处理器(Micro Processor Unit, MPU)、存储器以及标准通用逻辑电路。第二次变革是在上世纪80年代:是标准工艺加工线(Foundry)公司与IC设计公司共同发展的阶段,主流产品是MPU、微控制器(Micro Control Unit, MCU)及专用IC(Application-Specific IC, ASIC)。第三次变革是在上世纪90年代:IC产业的“四业”开始分离,功能强大的通用型中央处理器(Central Processing Unit,CPU)和信号处理器(Digital Signal Processing,DSP)成为产业
3、新的增长点。第四次变革正在进行:IC产业开始以Fundry为主导,IP的使用广泛。3硬件描述语言(HDL)产生基础:C、FORTRAN、Pascal等程序化设计语言,极大提高了计算机软件程序设计的效率和可靠性;硬件描述语言HDL(Hardware Description Language,HDL):它是一种高级程序语言,通过对数字电路和系统的语言描述,可以对数字集成电路进行设计和验证;主要功能:数字集成电路设计工程师可以根据电路结构的特点,采用层次化的设计结构,将抽象的逻辑功能用电路的方式进行实现。4主要硬件描述语言主要HDL语言:Gateway Design Automation公司的Ver
4、ilog HDL;美国国防高级计划研究局(DARPA)设计的VHDL,美国国防部的基于面向对象的OO VHDL,美国杜克大学的DE VHDL,美国电气和电子工程师协会支持的VITAL等。目前Verilog HDL和VHDL语言是目前主要的两种HDL语言,并分别在1995年和1987年被采纳为IEEE国际标准,广泛用于数字集成电路的设计和验证领域5 Verilog HDL发展6有关Verilog HDL的全部权利移交OVI(Open Verilog International)Verilog HDL公开发表Cadence公司购买Verilog版权System Verilog IEEE1800-2
5、005标准公开发表Verilog IEEE 1364-2001标准公开发表模拟和数字都适用的Verilog标准公开发表VerilogIEEE1364-1995标准公开发表Verilog-XL诞 生19891990199080年代2005200119991995OVI提出了用来描述模拟电路的硬件描述语言Verilog-A1996 Verilog HDL国际标准7名称时间备注VerilogIEEE1364-19951995年12月基于Verilog HDL的优越性,IEEE制定了Verilog HDL的IEEE标准,即Verilog HDL 1364-1995Verilog-A1996年Veril
6、og-A是由OVI提出的一种硬件描述语言。是模拟电路行业的标准建模语言,来源于IEEE1364 Verilog规范1999年模拟和数字都适用的Verilog标准公开发表VerilogIEEE1364-20012001年IEEE制定了Verilog IEEE1364-2001标准,并公开发表;其中HDL部分相对于1995标准有较大增强,PLI部分变化不大SystemVerilog IEEE1800-20052005年此标准是继VHDL和Verilog HDL之后,仿真工具支持的语言,它建立在Verilog HDL语言的基础上,是 IEEE 1364 Verilog-2001 标准的扩展增强,兼容
7、Verilog-2001,并将成为下一代硬件设计和验证的语言Verilog HDL在数字集成电路设计中的优点例1: 8(a)4位总线与逻辑(b)32位总线与逻辑module aand4(a,b,c); input 3:0a,b; output 3:0c; reg 3:0 c; always (a or b) c=a&b;endmodulemodule aand32(a,b,c); input 31:0a,b; output 31:0c; reg 31:0 c; always (a or b) c=a&b;endmodule原理图方式Verilog HDL描述方式Verilog HDL在数字集成
8、电路设计中的优点9例2: 4位移位寄存器module shiftregist4 (clk,din,Reset, qout);input clk,Reset,din;output 3:0 qout;reg 3:0 qout;always (posedge clk or posedge Reset )beginif(Reset) qout=4b0000;elsebeginqout3=qout2;qout2=qout1;qout1=qout0;qout0=din;endendendmoduleVerilog HDL在数字集成电路设计中的优点10例2: 8位移位寄存器module shiftregis
9、t8 (clk,din, Reset,qout);input clk,Reset,din;output 7:0 qout;reg 7:0 qout;always (posedge clk or posedge Reset )beginif(Reset) qout=8b00000000;elsebeginqout7:1=qout6:0;qout0=din;endendendmodule功能模块的可重用性11由于模块的可重用性对于硬件电路开发效率的提高至关重要。因此业界提出了数字集成电路的软核、硬核和固核的概念。.(1)“软核”(Soft Core)一般是指经过功能验证、5000门以上的可综合Ve
10、rilog HDL或VHDL 模型;(2) “固核”(Firm Core)通常是指在ASIC和FPGA器件上,经过综合验证、大于5000门以上的电路网表文件;(3) “硬核”(Hard Core)通常是指在ASIC器件上,经过验证正确的、大于5000门以上的电路结构版图掩模。Verilog HDL数字集成电路设计流程中作用125.1 Verilog HDL设计模块的基本结构Verilog HDL程序设计由模块(module)构成的, 设计模块的基本结构如图,一个完整的Verilog HDL设计模块包括端口定义、I/O声明、信号类型声明和功能描述4个部分。 一、模块端口的定义模块端口定义用来声明
11、电路设计模块 的输入/输出端口,端口定义格式如下: module 模块名 (端口1,端口2,端口3,);在端口定义的括号中,是设计电路模块与外界联系的全部输入/输出端口信号或引脚,是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口之间用“,”分隔。例如1位全加器adder模块的端口定义为module adder (S, CO, A, B, CI); 模块名adder13 二、模块内容 模块内容包括I/O声明、信号类型声明和功能描述。 (1)模块的I/O声明 模块的I/O声明用来声明模块端口定义中各端口数据流动方向,包括输入(input)、输出(output)和双
12、向(inout)。I/O声明格式如下: input msb:lsb 端口1,端口2,端口3,; /声明输入端口 output msb:lsb 端口1,端口2,端口3,;/声明输出端口例如,1位全加器的I/O声明为 input A, B, CI; output S, CO; 14 (2)信号类型声明信号类型声明是声明设计电路的功能描述中所用的信号的数据类型和函数。信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)、和时间(time)等。 信号声明格式如下: wire msb:lsb 端口1,端口2,端口3,; reg msb:lsb 端口1,端口2,
13、端口3,; (3)功能描述 功能描述是Verilog HDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(instantiate)方式、always块语句、initial块语句等方法来实现,通常将设计模块描述的方法称为建模。15 用assign语句建模 用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式。assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。例1 一位全加器的设计1位全加器的逻辑符号:S是全加器的和输出端,CO是进位输出端,A和B是两个加数
14、输入端,CI是低位进位输入端。16全加器的Verilog HDL源程序如下: module adder1 (S, CO, A, B, CI); 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位操作数。17 用元件例化(instantiate)方式建模元件例化方式建模是利用Verilog HDL提供的元件库实
15、现的。例如,用与门例化元件定义一个三输入端与门可以写为and myand3(y,a,b,c); and是Verilog HDL元件库中与门元件名,myand3是例化出的三输入端与门名,y是与门输出端,a、b、c是输入端。 用always块语句建模 always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。一个程序设计模块中,可以包含一个或多个always语句。程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。18 例2 8位二进制加法计数器的设计8位二进制加法计数器的逻辑符号如图。OUT是8位二进制计数器的输出端(8位向量);COUT是进位输出端(1位);DATA是并行
16、数据输入端(8位向量);LOAD是计数器的预置控制输入端,当LOAD=1时,OUT=DATA;CLK是时钟控制输入端,上升沿为有效边沿;CLR是同步复位输入端,当CLK的上升沿到来时且CLR=1,则计数器被复位,OUT=00000000。(逻辑符号图是由计算机对计数器电路的Verilog HDL源代码编译后产生的元件符号,图中的输入/输出标识符自动被改为大写,而源程序中的标识符都是小写。)19 8位二进制加法计数器的Verilog HDL 源程序如下: module cnt8 (out, cout,data,load,cin,clk, clr); input 7:0 data; input l
17、oad, cin, clk, clr output 7:0 out; output cout; reg 7:0 out; always (posedge clk) begin if (load) out=data; else if(clr) out=b00000000; else out=out+1; end assign cout = &out; endmodule用always块语句实现8位二进制加法计数器的建模。(posedge clk)是时间控制敏感函数,表示clk上升沿到来的敏感时刻。每当clk的上升沿到来时,always块语句中的全部语句就执行一遍。“assign cout = &
18、out;”语句产生进位输出cout,在语句中“&out”是与的缩减运算式,只有out中数字全为1时,结果才为1。20 用initial块语句建模Initial块语句与always语句类似,不过在程序中它只执行1次就结束了。Initial块语句的使用格式 : Initial Begin 语句1; 语句2; : end例3 用Initial过程语句对测试变量赋值 initial begin for(addr=0; addr 大于= 大于等于 右移4 结果A=8b00001101而A4 结果A=8b00010000。条件操作符 ?: 操作数=条件?表达式1:表达式2;当条件为真(值为1)时,操作数=
19、表达式1;为假(值为0)时,操作数=表达式2。 三元操作符,即条件操作符有三个操作数。例如 a?b:c若条件操作数a是逻辑1,则算子返回表达式1操作数b;若a是逻辑0,则算子返回表达式2操作数c。 并接操作符 , 例如 a,2a,b 等价于a,a,b,a,b。 将1位全加器的进位cout和sum并接,表达式为将两个或两个以上用逗号分隔的表达式按位连接在一起。还可以用常数来指定重复的次数。cout,sum=ina+inb+cin; 26同其他高级语言类似,各类操作符号之间有优先级之分,如下表:优先级序号操作符操作符名称! 、 逻辑非、按位取反*、/、%乘、除、求余+、-加、减左移、右移、 、=小
20、于、小于等于、大于、大于等于=、!=、=、!=等于、不等于、全等、不全等&、& 缩减与、缩减与非 、缩减异或、缩减同或|、 |缩减或、缩减或非&逻辑与|逻辑或?: 条件操作符列表顶部是最高优先级,底部是最低优先级。列在同一行中的操作符具有相同的优先级。所有操作符(?:除外)在表达式中都是从左向右结合的。圆括号()用于改变优先级或使得表达式中运算顺序更加清晰,提高源文件的可读性。27 (3)数值常量 Verilog HDL中的数值常量有整型和实型两大类,分为十进制、十六进制、八进制或二进制。若在前面加上一个正“+”或负“”号就表示有符号数,否则所代表的就是无符号数。在数值常量的任意位置可以随意插
21、入下划线“_”以提高可读性。常量定义格式为:parameter 常量名1=表达式,常量名2=表达式,常量名n=表达式;parameter是常量定义关键字,常量名是用户定义的标识符,表达式为常量赋值。例如 parameter Vcc=5, fbus=8b11010001;Verilog HDL中的整型数值常量就是整数,有两种书写格式:一种是无位宽的十进制表示法,如-132。第二种是定义位宽和进制的表示法,这种表示方法通常是无符号数。常数书写格式是: sizebase value 其中size是位宽,定义了数值常量的位数(长度);base 代表这个数据的进制,取值范围和相应的进制如下表;value
22、是一个数值常量的值,书写格式与进制base相对应。 例如 16h6a8c,表示一个4位十六进制数。 8hf5 等于8b11110101; 8b1111xxxx 等价2hfx; 8b1101zzzz 等价8hdz。28Verilog HDL中的进制base进制代码取值对应的进制b或B二进制o或O八进制d或D十进制h或H十六进制 Verilog HDL中的实型数值常量就是浮点数,可以用十进制与科学计数法两种形式书写。如果采用十进制格式,小数点两边必须都有数字。 Verilog HDL的编程最终是与硬件相对应的。由于硬件电路中信号的逻辑状态具有特殊性,即不仅有0(低电平)和1(高电平),还有可能是X
23、(未知状态)和Z(高阻态),因此Verilog HDL数值集合有四个基本值:0:逻辑0或假状态;1:逻辑1或真状态;X:逻辑不确定;Z:高阻态。29(4)字符串字符串是双引号“”括起来的字符序列,必须包含在同 一行中,不能多行书写。在表达式或赋值语句中作为操作数的字符串被看作ASCII值序列,即一个字符串中的每一个字符对应一个8位ASCII值。(5)标识符标识符是模块、寄存器、端口、连线、示例和begin-end块等元素的名称,是赋给对象的唯一的名称。标识符可以是字母、数字、$符和下划线“_”字符的任意组合序列。定义标识符规则:首字符不能是数字,必须以字母或下划线“_”开头。字符数不能多于10
24、24。标识符区分大小写。不要与关键字同名。例如 ina、inb、adder、adder8、name_adder是正确的,而1a ?b是错误的。(6)关键字关键字是Verilog HDL预先定义的专用词。在IEEE标准Verilog HDL 1364-1995中规定了102个关键词,都采用小写形式。关键词有其特定和专有的语法作用,用户不能再对它们做新的定义。30关键字AlwaysandAssignattributeBeginBufBufif0Bufif1CaseCasexCasezCmosDeassignDefaultdefparamDisableedgeelseendendattributee
25、ndcaseendfunctionendmoduleendprimitiveendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0 highzlifinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenmosnornotnotif0 notifloroutputparameterpmosposedgeprimitivepull0pull1pulldownpulluprcmosrealrealtimeregreleaserepeat rtran
26、iflscalaredsignedsmallspecifyspecpramstrengthstrong0strong1supply0supply1tabletasktimetrantranif0tranif1 tritri0tri1triandtriortritegunsignedvectoredwaitwandweak0weak1whilewireworxnorxor 31 (7)变量变量是在程序运行时其值可以改变的量。在Verilog HDL中,变量分为网络型(nets type)和寄存器型(register type)两种。 网络型变量nets型变量是输出值始终根据输入变化而更新的变量,
27、一般用来定义硬件电路中的各种物理连线。Verilog HDL提供了多种nets型变量。常见的nets型变量及说明类型功能说明wire、 tri连线类型(两者功能完全相同)wor、 trior具有线或特性的连线(两者功能一致)wand、 triand具有线与特性的连线(两者功能一致)tri1、 tri0分别为上拉电阻和下拉电阻supply1、 supply0分别为电源(逻辑1)和地(逻辑0)32 寄存器型变量register型变量是用来描述硬件系统的基本数据对象。作为一种数值容器,可以容纳当前值,也可以保持历史值。与寄存器的记忆功能相对应,可以作为模块各器件间的信息传递通道。register型变
28、量与wire型变量的区别在于register型变量需要被明确的赋值, 并且在重新赋值前一直保持原值。register型变量是在always、initial等过程语句种定义,并通过过程语句赋值。常见的register型变量及说明类型功能说明reg常用的寄存器型变量integer32位带符号整数型变量real64位带符号实数型变量time无符号时间型变量335.3 Verilog HDL的语句Verilog HDL的语句包括赋值语句、条件语句、循环语句、结构声明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。(1)赋值语
29、句在Verilog HDL中,赋值语句常用于描述硬件设计电路输出与输入之间的信息传送,改变输出结果。Verilog HDL有4种赋值方法:门基元、连续赋值、过程赋值和非阻塞赋值。门基元赋值语句门基元赋值语句的格式为:基本逻辑门关键字 (门输出,门输入1,门输入2,门输入n);例如 4输入与非门的门基元赋值语句为 nand (y,a,b,c,d); /与语句assign y=(a&b&c&d)等效34 连续赋值语句连续赋值语句的关键字assign,赋值符号是“=”,赋值语句的格式为 assign 赋值变量=表达式;例如 assign y=(a&b&c&d);连续赋值语句的“=”两边的变量都应该是
30、wire型变量。在执行中,输出y的变化跟随输入a、b、c、d的变化而变化,反映了信息传送的连续性。连续赋值语句用于逻辑门和组合逻辑电路的描述。例1 四输入端与非门的Verilog HDL源程序 module example1(y,a,b,c,d); output y; input a,b,c,d; assign #1 y=(a&b&c&d); /#1表示输出与输入信号之间具有1个单位的时间延迟 endmodule35 过程赋值语句过程赋值语句出现在initial和always块语句中,赋值符号是“=”,语句格式为: 赋值变量=表达式;过程赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量
31、,其值在该语句结束时即可得到。如果一个块语句中包含若干条过程赋值语句,按顺序一条一条执行,前面的语句没完成,后面的语句就不能执行。因此,过程赋值语句也称为阻塞赋值语句。36 非阻塞赋值语句非阻塞赋值语句也是出现在initial和always块语句中,赋值符号是“=”,语句格式为: 赋值变量=表达式;非阻塞赋值语句“=”左边的赋值变量必须是(寄存器)reg型变量,其值在块语句结束时才可得到,与过程赋值语句不同。例如 下面的块语句包含4条赋值语句 always (posedge clock) begin m=3; n=75; n=m; r=n; end语句执行结束后,r的值是75,而不是3,因为第
32、3行是非阻塞赋值语句“n=m”,该语句要等到本块语句结束时,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; endmodule37 (2)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。 if语句完整的Verilog
33、HDL的if语句结构如下: if(表达式) begin 语句; end else if(表达式) begin 语句; end else begin 语句; end在if语句中,“表达式”是逻辑表达式或关系表达式,也可以是位宽为1位的变量。系统对表达式的值进行判断, 若为0,x,z按“假”处理;若为1,按“真”处理,执行指定的语句。38 例3 8线-3线优先编码器的设计8线-3线优先编码器的功能表 module code(y,a); input7:0 a; output2:0 y; reg2:0 y; always (a) begin if(a7) y=3b111; else if(a6) y=
34、3b110; else if(a5) y=3b101; else if(a4) y=3b100; else if(a3) y=3b011; else if(a2) y=3b010; else if(a1) y=3b001; else y=3b000; end endmodule输入输出in0 in1 in2 in3 in4 in5 in6 in7out2 out1 out0 x x x x x x x 0 x x x x x x 0 1 x x x x x 0 1 1 x x x x 0 1 1 1 x x x 0 1 1 1 1 x x 0 1 1 1 1 1 x 0 1 1 1 1 1 1
35、 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 039 case语句case语句是一种多分支的条件语句,case语句的格式为: case(表达式) 选择值1: 语句1; 选择值2: 语句2; 选择值n: 语句n; default: 语句n+1 endcase执行case语句时,首先计算表达式的值,然后执行条件句中相应的“选择值”的语句。当所有的条件句的“选择值”与表达式的值不同时,则执行“default”后的语句。default可以省略。 case语句多用于数字系统中的译码器、数据选择器、状态机及微处理器的指令译码器
36、等电路的描述。40 例4:用case语句描述4选1数据选择器控制信号s1,s2有4种组合,控制a,b,c,d中的一个数据送到输出端。4选1数据选择器Verilog HDL的描述如下: module mux41(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
37、语句。与case语句的区别是不考虑语句中的高阻z和未知x的那些位,只关注其他位的比较结果。s1 s2z0 00 11 01 1abcd4选1数据选择器功能表41 (3)循环语句循环语句包含for语句、repeat语句、while语句和forever语句4种。 for语句for语句的格式为: for(循环指针=初值;循环指针 终值;循环指针=循环指针+步长值) begin 语句; endfor语句可以是一组语句重复执行,语句中的参数一般属于整型变量或常量。语句重复执行的次数由语句中的参数确定。即 循环重复次数=(终值-初值)/步长值42 例5:8位奇偶校验器的描述用a表示输入信号,长度为8位的向
38、量。在程序中,用for语句对a的值,逐位进行模2加运算(即异或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;n=b) max=a; else max=b; end endfunction函数调用的格式如下 函数名 (关联参数表);函数调用一般是出现在模块、任务或
39、函数语句中。通过函数的调用来完成摹写数据的运算或转换。例如,调用上例中求最大值函数的语句为 z=max(x, y);其中,x和y是与函数定义的两个参数a、b相关联的关联参数。通过函数的调用,求出x和y中的最大值,并用函数名max返回。51 函数和任务存在以下几处区别:(1)任务可以有任意不同类型输入/输出参数,函数不能将inout类型作为输出。(2)任务只可以在过程语句中调用,不能在连续赋值语句assign中调用;函数可以作为表达式中的一个操作数,在过程赋值语句和连续赋值语句中调用。(3)任务可以调用其他任务或函数;函数可以调用其他函数,但不能调用任务。(4)任务不向表达式返回值,函数向调用它
40、的表达式返回一个值。52(5)语句的顺序执行与并行执行Verilog HDL中有顺序执行语句和并行执行语句之分。always块语句中的语句是顺序语句,按照程序书写的顺序执行。always块本身确是并行语句,它与其他always语句及assign语句、元件例化语句的执行都是同时(即并行)的。例9 同步清除十进制加法计数器的描述同步清0是在时钟信号作用下,计数器的状态被clr清0,清0信号clr高电平有效;时钟信号clk上升沿触发。计数器计数状态从4b0000到4b1001循环。module cnt10(clr,clk,q,co); input clr,clk; output3:0 q; outp
41、ut 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=q+1;end end endmodule 535.4 Verilog HDL的描述方式(建模方法)系统级(system): 用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic): 用高级语言结构实现设计算法的模型。 RTL级(Register Transfer Level):
42、 描述数据在寄存器之间流动和如何处理这些数据的模型。 门级(gate-level): 描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level): 描述器件中三极管和储存节点以及它们之间连接的模型。 用Verilog HDL描述的电路就称为该设计电路的Verilog HDL模型建模层次:不同抽象级别的Verilog HDL模型54描述方式: 1、结构描述:描述元器件间连接关系:例化2、数据流描述:描述电路数据流行为:assign3、行为描述:描述功能:always4、混合描述:Verilog允许多描述方式共存于同一模块。5556一、结构描述1、 基于库元件的结构描述门类型关键字
43、( );门级描述即直接调用门原语进行逻辑的结构描述。 以门级为基础的结构描述所建立的硬件模型不仅是可仿真的,也是可综合的;一个逻辑网络由许多逻辑门和开关组成,用逻辑门的模型来描述逻辑网络最直观!门类型的关键字有26个,常用的有9个: not,and,nand,or,nor,xor,xnor,buf, bufif1,bufif0,notif1,notif0(各种三态门)调用门原语的句法:注1:在 端口列表中输出信号列在最前面;注2:门级描述不适于描述复杂的系统!门级描述可省略! 例:采用结构描述方式描述硬件电路module example_4_11(y,a,b,c); input a,b,c;
44、output y; wire s1,s2,s3; not (s1,a); nand (s2,c,s1); nand (s3,a,b); nand (y,s2,s3);endmodule 572、基于设计模块的结构描述任何用Verilog HDL描述的电路设计模块(module),均可用模块例化语句,例化一个元件,来实现电路系统的设计。模块例化语句格式与逻辑门例化语句格式相同,具体格式: 设计模块名 (端口列表); 其中,“例化电路名”是用户为系统设计定义的标识符,相当于系统电路板上为插入设计模块元件的插座,而端口列表相当于插座上引脚名表,应与设计模块的输入/输出端口一一对应。用模块例化方式设计
45、1位全加器。在1位全加器设计中,需要事先设计一个半加器,然后用例化方式将两个半加器和一个或门连接成全加器。58使用两个半加器模块构造全加器module HA (A , B , S , C);input A , B;output S, C;assign S = A B;assign C = A & B;endmodulemodule FA (P, Q, Cin, Sum, Cout) ;input P, Q, Cin;output Sum, Cout;wire S1, C1, C2;HA h1 (P, Q, S1, C1); /通过位置关联。HA h2 (.A(Cin), .S(Sum), .B
46、(S1), .C(C2); /通过端口与信号的名字关联。or O1 (Cout, C1, C2) ; /或门实例语句endmodule59端口列表小结:端口列表是把例化元件端口与连接实体端口连接起来。 端口列表的方法有两种: 位置关联法:位置关联法要求端口列表中的引脚明称与设计模块的输入、输出端口一一对应。名称关联法:名称关联法的格式如下:(.设计模块端口名(连接实体端口名),);端口列表中的位置可以是任意的。60例:用模块例化方式设计8位计数译码器电路系统。在8位计数译码系统电路设计中,需要事先设计一个4位二进制加法计数器cnt4e模块和一个七段数码显示器的译码器Dec7s模块,然后用例化方
47、式将这两种模块组成计数译码系统电路。61 4位二进制加法计数器的设计4位二进制加法计数器的符号如图,CLK是时钟输入端;CLR复位控制输入端,当CLR=1时计数器被复位,输出Q3.0=0000;ENA 是使能控制输入端,当ENA=1时,计数器才能工作;COUT是进位输出端,当输出Q3.0=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)
48、 q= b0000; else if (ena) q=q+1; end assign cout=&q;endmodule62七段数码显示器的译码器 Dec7s的元件符号如图A3.0是4数据输入端,将接至cnt4e的输出端Q3.0;Q7.0是译码器的输出端,提供七段数码显示数据。module Dec7s(a,q); output7: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=8b0110011
49、0; 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; endcase endendmodule63计数译码系统电路的设计计数译码系统电路是用Quartus II的图形编辑方式设计出来的。64 用模块例化方式将cnt4e和dec7s两种模块组成计数译码系统电路cn
50、t_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); dec7s u4(q2,q15:8); endmodule65二、数据流建模例:数据流描述的一位全加器module FA_Df (A, B, Cin, Sum, Cout) ;i
51、nput A, B, Cin;output Sum, Cout ;assign Sum = AB Cin;assign Cout = (A & Cin) | (B & Cin) | (A & B) ;endmodule1)assign语句之间是并发的,与其书写的顺序无关;2)线网的赋值可以在声明时赋值,例如wire Sum = AB Cin;66数据流建模数据流建模的时延assign #2 Sum = A B Cin;#2表示右侧表达式的值延迟两个时间单位赋给Sum;时间单位是多少?由谁来决定?timescale 1ns/100psFPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。6
52、7数据流建模数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)数据流建模没有存储功能,不能保存数据;3)wire型变量只能在声明时赋值或者assing语句赋值;4)assign语句并发执行,实际的延迟又物理芯片的布线结果决定。68 三、Verilog HDL行为描述Verilog HDL行为描述方式是通过行为语句来描述电路要实现的功能,表示输入输出间转换的行为,不涉及具体结构。行为建模是一种“高级”的描述方式。行为描述既可以描述简单的逻辑门,又可以描述复杂的数字系统,乃至微处理器。既可以描述组合逻辑电路,又可以描述时序逻辑电路。例11 2选1数据选择器,用Verilog HDL
53、对它做行为描述。 module mux_2_to_1 (a, b, out,outbar,sel); /这是一个2选1数据选择器,名为mux_2_to_1 input a, b, sel; /定义模块的输入端口为a, b和sel output out, outbar; /定义模块的输出端口为out和outbar assign out=sel? a:b; /如果sel=1,将a赋值给out /如果sel=0,将b赋值给out assign outbar =out; /将out取反后赋值给outbar endmodule /模块描述结束69 例 3线-8线译码器的Verilog HDL设计modu
54、le decode3_8 (a, b, c, y, en); /这是一个3线-8线译码器,名为decode3_8input a, b, c, en; /定义模块的输入端口output 7:0 y; /定义模块的输出端口为outreg7:0 y; always (en or a or b or c) begin if(en) y=8b11111111; else begin case(c, b, a) 3b000: y=8b11111110; 3b001: y=8b11111101; 3b010: y=8b11111011; 3b011: y=8b11110111; 3b100: y=8b111
55、01111; 3b101: y=8b11011111; 3b110: y=8b10111111; 3b111: yb01001) cout,sum=sum+4b0110; end endmodule75保存的文件名与设计模块名相同,扩展名为.v。完成BCD_adder的编译后,用Quartus II的File 菜单下“Create Default Symbol”命令,对BCD_adder编译生成元件图形符号。图中细的输入/输出线表示单信号线,粗的输入/输出线表示多信号总线。76编辑BCD_Dec7源程序如下:module BCD_Dec7(a,q); input 3:0 a; output 7
56、:0 q; reg7:0 q; always (a) begin case(a) 4b0000: q=8b00111111; 4b0001: q=8b00000110; 4b0010: q=8b01011011; 4b0011: q=8b01001111; 4b0100: q=8b01100110; 4b0101: q=8b01101101; 4b0110: q=8b01111101; 4b0111: q=8b00000111; 4b1000: q=8b01111111; 4b1001: q=8b01101111; 4b1010: q=8b01110111; 4b1011: q=8b01111
57、100; 4b1100: q=8b00111001; 4b1101: q=8b01011110; 4b1110: q=8b01111001; 4b1111: q=8b01110001; endcase end endmodule 同样生成元件图形符号:77 (3)设计电路顶层文件顶层设计文件是调用功能元件,将他们组装起来,成为一个完整的设计。打开一个新文件并进入图形编辑方式(Graphic Editor file)。在图形编辑框中,调出BCD_Adder、BCD_Dec元件符号和输入、输出元件符号,连线完成,存为top.gdf,如下图所示:78 具体操作步骤如下:将输入元件INPUT与BCD_
58、Adder的CIN连接在一起,输入元件名称改为CIN,作为加法器的低位进位输入端。将输入元件INPUT与BCD_Adder的加数输入连接在一起,输入元件名称分别改为A3.0和B3.0,作为加法器4位加数输入端。将BCD_Adder输出SUM3.0与BCD_Dec7的输入A3.0连接在一起,将BCD_Dec7的输出Q7.0与输出元件连接在一起,并将输出元件的名称改为Q7.0,作为8译码输出端。将输出元件OUTPUT与BCD_Adder的COUT连接,并将输出元件的名称改为COUT,作为加法器的进位输出端。顶层设计图形完成后,用TOP.gdf名存入工程目录中。79 (4)编译顶层设计文件执行“Qu
59、artus II”菜单下的“Compiler”命令,完成对顶层文件TOP.gdf的编译。如果要生成TOP.gdf元件符号,还要执行“File”菜单下的“Create Default Symbol”命令。 (5)仿真顶层设计文件在对顶层文件的编译过程中,系统为电路的仿真完成了延时网表提取(Timing SNF Extractor)操作,支持电路的仿真。仿真操作:建立TOP.scf波形文件,对输入波形进行赋值编辑,运行“File-ProjectSave & Simulate”,即可仿真电路。输出波形出现在波形编辑窗口。 (6)下载顶层设计文件 (略)链接Quartus805.6 用Verilog
60、HDL描述逻辑电路的实例(1)用Verilog HDL对4位加法器做逻辑描述加法器是常用的组合逻辑电路,串行进位方法构成的4位全加器如图。/对4位串行进位加法器的顶层结构的描述module Four_bit_fulladd (A, B,CI, S, CO); /4位全加器模块名称和端口名parameter size=4; /定义参数input size:1 A, B; output size: 1 S;input CI;output CO;wire 1: size-1 Ctemp /定义模块内部的连接线onebit_fulladd /调用1位全加器 add1 (A1, B1, CI, S1,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中教师劳务合同标准文本
- 代购专利合同样本
- 九年级上数学备课组家校合作计划
- 服装行业新产品研发流程
- 建筑行业年度预算执行情况总结范文
- 仁爱英语2025年春季学期七年级英语课本分析计划
- 针对六年级学生的英语学习计划
- 农业生态环境保护与土壤保持措施
- 2025年幼儿园小班游戏教学计划
- 国际旅行疫情防控流程
- IEEE33节点三相配网参数
- 中石化华北分公司钻井定额使用说明
- 第四章茎尖分生组织培养
- 高中英语3500词汇完整
- 人教版六年级数学下册期中试卷及答案
- COPD 慢性阻塞性肺疾病
- 施工单位项目部组织机构
- 政策性搬迁计划书
- 2023年厦门市海沧区(中小学、幼儿园)教师招聘考试《教育综合知识》模拟试题及答案解析
- GB/T 23445-2009聚合物水泥防水涂料
- 成都市工伤职工停工留薪期分类目录
评论
0/150
提交评论