VerilogHDL语言的基本结构.ppt_第1页
VerilogHDL语言的基本结构.ppt_第2页
VerilogHDL语言的基本结构.ppt_第3页
VerilogHDL语言的基本结构.ppt_第4页
VerilogHDL语言的基本结构.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 现场可编程逻辑器件的应用设计技术,4.1 Verilog HDL硬件描述语言,1. 简单的Verilog HDL例子,首先来看两个简单的Verilog HDL程序。一个8位全加器的Verilog HDL源代码:,module adder8(cout,sum,ina,inb,cin); output7:0 sum; output cout; input 7:0 ina,inb; input cin; assign cout,sum = ina+inb+cin; endmodule,1. 简单的Verilog HDL例子,从上面的例子可以看出: 1.Verilog HDL巳程序是由模块构成

2、的。每个模块的内容都是嵌在module和endmodule两个语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。 2.每个模块首先要进行端口定义并说明输入(input)和输出(output),然后对模块的功能进行逻辑描述。 3. Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分多行写。,1. 简单的Verilog HDL例子,4. 除了endmodule语句外,每个语句的最后必须有分号。 5. 可以用/*/ 和 /对Verilog HDL程序的任何 部分作注释。一个完整的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。 6. 大小写敏感; 7.

3、 所有的关键字小写;,2. Verilog HDL模块的结构,Verilog HDL的基本设计单元是“模块(block)”。一个模块是由两部分组成的,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明一个“与或非”门电路。,2. Verilog HDL模块的结构,该电路表示的逻辑函数可以写为:,用Verilog HDL语言对该电路进行描述如下。,module E1(A,B,C,D,F); / 模块名为E1 (端口列表A,B,C,D) input A,B,C,D; /定义模块的输入端口A,B,C,D output F; /定义模块的输出端口F assign F = (

4、AB)|(CD); /模块内的逻辑描述 endmodule,2. Verilog HDL模块的结构,从上面的例子可知,电路图符号的引脚也就是程序模块的端口,在程序模块内描述了电路图符号所实现的逻辑功能。在上面的Verilog设计中,模块中的第2、第3行说明接口的信号流向,第4行说明了模块的逻辑功能。,Verilog HDL结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括4个主要部分:端口定义,IO说明,信号类型声明和功能描述。,2. Verilog HDL模块的结构,模块的端口定义 模块的端口声明了模块的输入和输出口。其格式如下: module 模块名(口1

5、,口2, 口3,); 模块内容 模块内容包括IO说明,信号类型声明和功能定义, (1) IO说明的格式如下:,2. Verilog HDL模块的结构,输入口: input 信号位宽1:0 端口名 ; input 信号位宽1:0 端口名1,端口名2 ,端口名N; 输出口: output 信号位宽1:0 端口名; output 信号位宽1:0 端口名1,端口名2 ,端口名N; 输入/输出口: inout 信号位宽1:0 端口名; inout 信号位宽1:0 端口名1,端口名2 ,端口名N;,IO说明的格式,2. Verilog HDL模块的结构,常用的形式为: reg 位宽1:0 变量1,变量2,

6、变量N; wire 位宽1:0 变量1,变量2,变量N;,(2) 信号类型声明:它是说明逻辑描述中所用信号的数据类型及函数声明。,2. Verilog HDL模块的结构,对于端口信号的缺省定义类型为wire(连线)型。,如: input1:0 a,b; output 2:0 sum; wire 1:0 a; / a为连线型; reg 2:0 sum; / sum为寄存器型; . /b缺省为连线型;,2. Verilog HDL模块的结构,在一个模块的开始部分包含模块的端口声明和端口类型声明。 Verilog 2001 标准可以将这两部分合而为一。 增强的端口声明实例:,module addr(

7、a,b,sum); input wire 1:0 a, b; output reg 2:0 sum; ,2. Verilog HDL模块的结构,Verilog 2001 标准允许定义模块时就声明端口及其类型: 例如: module addr( input wire 1:0 a; input wire 1:0 b; output reg 2:0 sum ); .,3. 逻辑功能定义,逻辑功能描述部分是对数字电路系统的建模,是Verilog HDL模块中最重要也是最复杂的部分。 但其最基本的描述方式只有三种:always、assign和创建模块实例。 一个Verilog HDL模块允许使用一种或多

8、种方式描述逻辑功能。,3. 逻辑功能定义,1. 用assign描述逻辑功能 assign语句多用在输出信号可以和输入信号建立某种直接联系的情况下,这种联系通常可以用逻辑表达式或算术表达式方式描述。 assign只能用于组合逻辑描述,而不能用于时序逻辑电路。即该语句一般适合于对组合逻辑进行赋值,称为连续赋值方式。,3. 逻辑功能定义,例用assign描述下述表达式: X1 = a input a,b; output X1,X2; wire a,b; wire X1,X2; assign X1 = a endmodule,3. 逻辑功能定义,2.用always描述逻辑功能 在Verilog HDL

9、中,由always指定的内容将不断地重复运行,这恰恰反映出了实际电路的特性在通电的情况下不断运行。用always可以描述一些比较复杂的组合逻辑电路及时序逻辑电路。 always在使用时必须加入事件的控制,当事件发生时,执行always指定的内容。这与上面所说的不断重复允许并不矛盾,不断地重复运行是指只要事件发生就会执行相关操作,不论该事件已经发生了多少次。,3. 逻辑功能定义,最常用的两个事件是电平触发和边沿触发。 电平触发是指当某个信号的电平发生变化时,执行always指定的内容; 边沿触发指的是当某个信号的上升沿或下降沿到来时,执行always指定的内容。 为always添加电平触发事件或

10、边沿触发事件的方法是在always后面添加“”,之后再跟上事件内容, “” 后面的内容称为敏感列表(sensitive list)。,3. 逻辑功能定义,电平触发的写法是在“”后面直接写触发信号的名称; 边沿触发的写法是在“”后面写“posedge 信号名”或者“negedge 信号名”,posedge代表信号的上升沿,negedge代表信号的下降沿。 对于同一个操作,可能有多个触发事件,当其中的任意一个事件发生时都要执行该操作,那么需要在不同的事件之间添加关键字“or”。,3. 逻辑功能定义,下例为always不正确的使用方法。,module wr1(a,b,out); input a,b;

11、 output out; wire a,b; reg out; always out = a /错误使用always endmodule,3. 逻辑功能定义,下例为always正确的使用方法。,module crt1(clk1,clk2,a,b,out1,out2,out3); input clk1,clk2, a,b; output out1,out2,out3; wire clk1,clk2, a,b; reg out1,out2,out3; /当clk1的上升沿到来时,令out 1等于a与b; always (posedge clk1) out1 = a,3. 逻辑功能定义,/当clk1

12、的上升沿或者clk2的下降沿到来时, always (posedge clk1 or negedge clk2) out2 = a|b; /当a或b的值发生变化时, always (a or b) out3 = a+b; endmodule,3. 逻辑功能定义,敏感列表中可以同时包括多个电平敏感的事件,也可以同时包括多个边沿敏感的事件,但不可以同时包括电平敏感的事件和边沿敏感的事件。 敏感列表中,同时包括一个信号的上升沿敏感事件和下降沿敏感事件是不允许的,这两个事件可以合并为一个电平敏感的事件。,3. 逻辑功能定义,always后面除了可以跟随电平敏感的事件和边沿敏感的事件以外,也可以跟随其他

13、事件,例如延时或者自定义事件。Verilog HDL中,“”为延时符号,后面跟的数字表示延时多少个基本周期,基本周期是电路仿真的时间单位,其长度由timescale定义。,3. 逻辑功能定义,示例:使用延时事件的always。,timescale 100ns/100ns /定义仿真的基本周期为100ns module delay1(clkout); output clkout; reg clkout; /clkout为输出时钟信号,频率5MHz initial clkout =0; /将输出初值赋零; /每过100ns时钟信号翻转一次; always #1 clkout = clkout; e

14、ndmodule,3. 逻辑功能定义,always块在采用电平敏感事件时,所有的输入信号,即位于赋值语句等式右边的信号,都必须在敏感列表中列出,否则有可能发生错误。比如,有一个四输入与门,其程序为:,module and4(a,b,c,d,out); input a,b,c,d; output out; always (a or b or c or d) out = a endmodule,3. 逻辑功能定义,Verilog 2001对此作了增强,即通过一个符号 “*” 来代替敏感列表的内容,表示将所有输入信号都加入敏感列表。好处是避免疏忽而在敏感列表中漏掉某个信号造成错误。则上例可写为:,m

15、odule and4(a,b,c,d,out); input a,b,c,d; output out; reg out; always * out = a endmodule,3. 逻辑功能定义,Verilog 2001 还有一项对敏感列表的增强,就是用逗号代替原来敏感列表中的关键字or。 如: always (posedge clk or negedge rst) 可以写成: always (posedge clk , negedge rst),3. 逻辑功能定义,3.利用创建实例来描述逻辑功能 Verilog HDL创建的实例包括模块实例和原语两种。 原语(Primitive)也同模块一样

16、描述某个特定功能的电路,但与模块不同,原语是利用真值表来描述电路。 Verilog HDL自身带有一些原语模型,这些原语描述从门级或开关级数字电路中的基本组成部分,如与门(and),与非门(nand),或门(or),或非门(nor),异或门(xor),异或非门(nxor),缓冲器(buf)和非门等。,3. 逻辑功能定义,例如通过原语描述的逻辑门描述一位半加器,module hadd(a,b,carry,sum); input a,b; output carry,sum; xor sum_Z(sum,a,b); and c_Z(carry,a,b); endmodule,3. 逻辑功能定义,Ve

17、rilog HDL允许用户自定义原语,称为用户自定义原语(User Define Primitive ,UDP)。关于UDP的创建规则见后续部分。,用创建模块实例来描述逻辑功能。利用创建模块实 例来描述逻辑功能的方法和使用电路原理图描述类似,每个模块实例都代表实际电路中的某个结构单元。在Verilog HDL模块中,用变量将各个实例模块连接起来,就如同在实际电路中用导线将多个结构单元连接起来。,3. 逻辑功能定义,例如一位全加器的Verilog HDL模块,module Addr1 (a,b,cin,sum,cout) input a,b,cin; output sum cout; wire

18、a,b,cin; wire sum,cout; assign cout,sum = a+b+cin; endmodule,3. 逻辑功能定义,在Verilog HDL中,高层模块可以通过调用低层模块来构建复杂系统。例如通过调用一位全加器的模块构建四位全加器。如下图所示。,3. 逻辑功能定义,通过一位全加器的模块构建四位全加器的程序为:,module addr4(a,b,cin,sum,cout); input wire 3:0 a,b; input wire cin; output reg3:0 sum; output reg cout; /定义内部变量 wire cout0; /第0位的Co

19、ut信号; wire cout1; /第1位的Cout信号; wire cout2; /第2位的Cout信号;,3. 逻辑功能定义,/描述逻辑功能 /调用一位全加器的模块构建四位全加器 MyAddr addr0(. a(a0),.b(b0), .cin(cin),.sum(sum0),.cout(cout0); MyAddr addr1(. a(a1),.b(b1), .cin(cout0),.sum(sum1),.cout(cout1); MyAddr addr2(. a(a2),.b(b2), .cin(cout1),.sum(sum2),.cout(cout2); MyAddr addr

20、3(. a(a3),.b(b3), .cin(cout2),.sum(sum3),.cout(cout); endmodule,3. 逻辑功能定义,下面是模块调用的一般形式:,调用模块也可以用省略方式:,模块名 实例名(.端口1(连接的信号1), .端口2(连接的信号2), );,模块名 实例名(连接的信号1,连接的信号2 );,需要注意括号内列出的信号的顺序要和模块的端口顺序一致。,3. 逻辑功能定义,对与一个复杂系统,可以划分成很多模块,并且具有层次关系,高层模块可以调用低层模块, 各个模块可以同时编写。,3. 逻辑功能定义,多个逻辑描述块之间的关系 在描述逻辑功能时,对使用assign,

21、always和模块实例的种类和次数没有限制。 用高级语言编写的程序是顺序执行的,而Verilog HDL在描述逻辑功能时每个assign,always和模块实例是同时发生的。因此assign,always和模块实例在程序中出现的顺序可以随意排列。,3. 逻辑功能定义,例如:算术表达式x = a+b+c 两种描述,module parallel(a,b,c,x); input a,b,c; output1:0 x; wire a,b,c; wire1:0 x; /定义之间变量temp, /用于保存结果a+b的和 wire 1:0 temp; assign temp = a+b; assign x

22、 = temp+c; endmodule,assign x = temp+c; assign temp = a+b;,4 . 块语句,在Verilog HDL描述逻辑功能中,当操作需要多条Verilog HDL语句才能描述时,这时就需要用块语句将多条Verilog HDL语句复合在一起。,块语句包括两种: (1) 由begin end构成的块语句: (2) 由forkjoin构成的块语句:,4 . 块语句,1. 由begin end构成的块语句 begin end之间可以添加多条语句,并且语句是按照出现的顺序执行的。 如果语句前面有延时符号“”,那么延时的长度是相对于前一条语句而言的。,4 .

23、 块语句,下例为begin end使用实例:,timescale 100ns/100ns module beginend(din,dout); input din; output dout; wire din; reg dout; reg temp1,temp2; /定义之间变量;,4 . 块语句,always (din) begin #1 temp1 = din; #1 temp2 = temp1; #1 dout = temp2; end endmodule,4 . 块语句,2. 由forkjoin构成的块语句 fork join之间可以添加多条语句,并且语句的关系是并行的,是同时执行的。 如果语句前面有延时符号“”,那么延时的长度是相对于fork join块开始时间而言的。,4 . 块语句,下例为fork join使用实例:,timescale 100ns/100ns module forkjoin(din,dout); input din; output dout; wire din; reg dout; reg temp1,temp2; /定义之间变量;,4 . 块语句,always (din) fork / fork join之间是同时执行的 #1 temp1 = din; /相对块开始延时100ns #2 temp2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论