版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章 初识Verilog HDL 第第2章初识章初识Verilog HDL 2.1 Verilog HDL的设计方法的设计方法 2.2 Verilog HDL中的模块及其描述方式中的模块及其描述方式 2.3 Verilog HDL设计流程设计流程 第2章 初识Verilog HDL 2.1 Verilog HDL的设计方法的设计方法Verilog HDL的设计方法归纳起来主要有两种:自下而上(Bottom-Up)的设计方法与自上而下(Top-Down)的设计方法。另外,还可根据实际情况,利用这两种方法的组合进行综合设计,即综合设计方法。2.1.1 自下而上自下而上(Bottom-Up)的设计
2、方法的设计方法方法的步骤自下而上的设计方法是一种传统的电子系统设计方法,它的主要步骤是:首先根据系统要求编制技术规格书,并画出系统控制流程图;然后依照技术规格书和系统控制流程图,对系统的功能进行细化,合理划分功能模块,并画出系统的功能框图;接着进行各功能模块的细化和电路设计;当各功能模块电路设计、调试完成后,将各功能模块连接起来进行全系统的调试。其具体流程如图2.1所示。第2章 初识Verilog HDL 图2.1 自下而上设计单元设计功能块划分子系统设计系统合成系统分解第2章 初识Verilog HDL 自下而上的设计方法常用于原理图设计中,它的优点是:(1) 设计人员对于用这种方法进行设计
3、比较熟悉。(2) 实现各个子块电路所需的时间较短。但这种设计方法也有许多不足之处,具体表现为:(1) 一般来说采用这种设计方法,容易造成对系统的整体功能把握不足。(2) 因为必须先完成各个小模块,所以整个系统的实现需要较长的时间。(3) 这种方法对设计人员之间相互进行协作有比较高的要求。第2章 初识Verilog HDL 2.1.2 自上而下自上而下(Top-Down)的设计方法的设计方法随着硬件技术以及HDL语言的发展,电子系统的设计方法发生了巨大的变化,传统的自下而上的设计方法已经不能满足复杂度日益增长的系统的要求。目前在电子系统的设计中已经越来越多地采用自上而下的设计方法了。在这种新的设
4、计方法中,由系统用户对整个系统进行方案设计和功能划分,把系统划分为基本单元,然后再把每个基本单元划分为下一层次的基本单元,直到可以直接用元件库中的元件来实现为止。其具体流程如图2.2所示。第2章 初识Verilog HDL 图2.2 自上而下设计方法的步骤第2章 初识Verilog HDL 自上而下的设计方法一般采用HDL语言,具有以下一些优点:(1) 在设计周期开始就做好了系统分析。(2) 由于设计的主要仿真和调试过程是在高层次完成的,所以能够在早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑仿真的工作量。(3) 自顶向下的设计方法方便了从系统划分和管理整个项目,使得几十万门甚
5、至几百万门规模的复杂数字电路的设计成为可能。并可减少设计人员,避免不必要的重复设计,提高了设计的一次成功率。自上而下的设计方法有以下缺点:(1) 因采用的综合工具不一样,得到的最小单元不标准。(2) 制造成本高。第2章 初识Verilog HDL 2.1.3 综合设计方法综合设计方法复杂数字逻辑电路和系统的设计过程通常是以上两种设计方法的结合。复杂系统的设计需要考虑多个目标的综合平衡。在高层系统采用自上而下的设计方法来实现,而在低层系统采用自下而上的方法从库元件或数据库中调用已有的单元设计。综合设计方法兼有上述两种设计方法的优点,而且可以使用矢量测试库进行测试。第2章 初识Verilog HD
6、L 2.2 Verilog HDL中的模块及其描述方式中的模块及其描述方式2.2.1 模块的概念及结构模块的概念及结构和其它高级语言一样,Verilog HDL语言也是模块化的。它以模块集合的形式来描述数字系统。模块(Module)是Verilog HDL语言的基本单元,它用于描述某个设计的功能或结构及其与其他模块通信的外部端口。每一个模块都有接口部分,用来描述与其它模块之间的连接,通常一个文件对应一个模块。Verilog HDL中的各个模块是并行运行的,不过常用的做法是用一个包括测试数据和硬件描述的高层模块来定义一个封闭的系统,并在这一模块中调用其它模块的实例。第2章 初识Verilog H
7、DL 模块的基本语法如下:module ()端口说明(input,out,inout)参数定义(可选)数据类型定义连续赋值语句 (assign)过程块 (initial和 always)-行为描述语句低层模块实例任务和函数延时说明块endmodule第2章 初识Verilog HDL 其中是模块唯一性的标识符;是由模块各个输入、输出和双向端口组成的一张端口列表,这些端口用来与其它模块进行连接;数据类型定义部分用来指定模块内用到的数据对象为寄存器型、存储器型或连线型;过程块包括initial过程块和always过程块两种,行为描述语句只能出现在这两种过程块内;延时说明块用来对模块各个输入和输出端
8、口间的路径延时进行说明。第2章 初识Verilog HDL 调用模块实例的一般形式如下: ()下面以一个2选1选择器来说明模块,图2.3是2选1选择器电路示意图。第2章 初识Verilog HDL 图2.3 MUX2_1模块电路示意图abselsel_a1b1outaselsel_bb1a1outbl第2章 初识Verilog HDL 用Verilog HDL语言实现上述电路的模块如下:【例例2-1】一个2选1模块的例子。module MUX2_1(out,a,b,sel);/ 端口定义output out;input a,b,sel; / 输入输出列表not(sel_,sel);and(a1
9、,a,sel_);and(b1,b,sel);or(out,a1,b1); / 结构描述endmodule第2章 初识Verilog HDL 在关键词module和endmodule之间包含着完整的2选1选择器的设计实现。a、b和sel是设备的输入端口,out是输出端口,所有信号都从这些端口输入和输出。and、or、not是Verilog中预定义好的基本门级元件,可以在结构描述方式下直接使用。当要在其它模块中调用这一选择器模块时,只需使用其模块名和所定义的端口名,不需要知道其内部的具体实现。因为对一个模块的定义可以是行为级描述、门级结构描述或混合描述,而采用什么描述方式对调用它的高层模块来说是
10、没有什么区别的,采用的描述方式对高层模块不产生任何影响。这种模块设计方法是自上而下设计方法的一个主要特征。第2章 初识Verilog HDL Verilog HDL程序是由模块构成的,每个模块的内容都包含在“module”和“endmodule”两个语句之间。每个模块要进行端口定义,说明输入、输出端口。Verilog HDL程序的书写与C语言类似,一行可以写多条语句,也可以一条语句分成多行书写,每条语句以分号结束,endmodule语句后面不必写分号。用“/*/”可以对多行程序进行注释,用“/”可以对一行程序进行注释。第2章 初识Verilog HDL 2.2.2 模块的描述方式模块的描述方式
11、Verilog模块代表硬件上的逻辑实体,其范围可以从简单的门到整个电路系统,例如计数器、存储子系统和微处理器等等。模块可以根据所采用的不同描述方法而分成行为描述模块、结构描述模块两类(也有的文献将其分成三类:行为描述模块、数据流描述模块和结构描述模块),也可以采用以上几种描述方式的组合。下面分别介绍模块的这几种描述方式。第2章 初识Verilog HDL 1. 数据流描述方式数据流描述方式数据流型描述主要用来描述组合功能,具体由“assign”连续赋值语句来实现。assign连续赋值语句可以分成“显式连续赋值语句”和“隐式连续赋值语句”两种类型。 显式连续赋值语句连线型变量类型 连线型变量位宽
12、 连线型变量名; assign #(延时量) 连线型变量名 = 赋值表达式;“显式连续赋值语句”包含了两条语句:第一条语句是对连线型变量进行类型说明的说明语句;第二条语句是对这个已得到声明的连线型变量进行连续赋值的赋值语句。第2章 初识Verilog HDL 隐式连续赋值语句连线型变量类型 (赋值驱动强度) 连线型变量位宽 #(延时量) 连线型变量名= 赋值表达式;“隐式连续赋值语句”把连线型变量说明语句和连线型变量连续赋值语句结合在一条语句内。它可以在对连线型变量进行类型说明的同时进行连续赋值。assign连续赋值语句的功能是:当赋值表达式中变量的值发生变化时,重新计算赋值表达式的值,并在指
13、定的时延后将得到的结果赋给等式左端的连线型变量。时延定义了右边表达式操作数变化时刻与对左边变量进行赋值时刻之间的延迟时间,如果没有定义延时量,缺省时延为0。assign语句只能用来实现组合功能。第2章 初识Verilog HDL 下面是一个NAND与非逻辑模块的数据流型描述,输出out是输入in1和in2相与后求反的结果。【例例2-2】数据流描述的例子。/与非门的数据流型描述module NAND(in1,in2,out);input in1,in2;output out;assign out=(in1&in2);/连续赋值语句endmodule第2章 初识Verilog HDL in
14、1、in2和out端口都被定义为连线型。在程序中,一旦in1或者in2的值发生变化,assign连续赋值语句将立刻重新计算右端表达式并把得到的结果传给等式左端进行输出。assign连续赋值语句用来描述组合电路,一旦其输入发生变动,输出也随之而改变。由于数据assign语句描述了连线型变量的取值逻辑,所以从本质上说它是对连线型变量的行为进行了描述,因此本书将这种数据流描述方式归类于行为描述方式,我们将在行为建模这一章中对assign连续赋值语句作进一步的说明。第2章 初识Verilog HDL 2. 行为描述方式行为描述方式行为描述是一种高级语言使用的方法。Verilog中的行为描述方式和软件编
15、程语言的描述方式类似,具有很强的通用性和有效性。行为型描述是通过行为语句来实现的,行为功能可使用下述过程语句结构描述:(1) initial语句:此语句只执行一次。(2) always语句:此语句循环执行。只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的initial语句和always语句在0时刻并发执行。第2章 初识Verilog HDL 下例所示为一个行为描述的1位加法器。【例例2-3】行为描述的例子。module ADDER (A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Sum,Cou
16、t;reg T1,T2,T3;always ( A or B or Cin ) beginSum = (A B) Cin;T1 = A & Cin;T2 = B & Cin;T3 = A & B;Cout = (T1| T2) | T3;endendmodule第2章 初识Verilog HDL 模块ADDER有3个输入A、B、Cin和2个输出Sum、Cout。其中Sum、Cout、T1、T2和T3要在always语句中被赋值,所以它们被定义为reg类型(reg是寄存器数据类型的一种)。always语句中包含一个或事件控制(紧跟在字符后面的表达式),以及相关联的顺序过程
17、(begin-end对)。此或事件控制的作用是当A、B或Cin上发生事件,即A、B或Cin中某一个的值发生变化时,就执行下面的顺序过程。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,程序指针返回到或事件控制语句,always语句再次等待A、B或Cin的值发生变化。这种机制有点类似C+中的消息循环。第2章 初识Verilog HDL 3. 结构描述方式结构描述方式结构描述是通过实例进行描述的方法。它将Verilog中预定义的基本元件实例嵌入到语言中,监控实例的输入,一旦其中任何一个发生变化,便重新运算并输出。在Verilog HDL中可使用如下结构描述部件:(1
18、) 用户自己定义的模块。(2) 用户自定义元件UDP。(3) 内置门级元件。(4) 内置开关级元件。第2章 初识Verilog HDL 下例所示是一AND模块的结构型描述。这一模块是通过将一个NAND的输出连接到另一NAND的两个输入上得到的。【例例2-4】结构描述的例子。/由两个NAND生成的与门的结构型描述module AND(in1,in2,out);input in1,in2;output out;wire w1;NAND NAND1(in1,in2,w1); / NAND模块实例1NAND NAND2(w1,w1,out); / NAND模块实例2endmodule这个模块含有NAN
19、D1和NAND2两个NAND模块实例,它们通过内部连线w1连接起来。第2章 初识Verilog HDL 4. 混合型描述混合型描述在模块中,用户可以混合使用结构描述和行为描述方式,也就是说,模块中可以包含门的实例、模块实例语句、连续赋值语句、always语句和initial语句以及它们的混合语句,并且它们之间可以相互包含。always语句和initial语句(只有寄存器类型数据可以在这两种语句中被赋值)中的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动连线类型)的值能够反过来用于触发always语句和initial语句。第2章 初识Verilog HDL 2.2.3 设计的仿真与测试设
20、计的仿真与测试在编写完Verilog HDL程序之后,需要对它进行验证。在这方面Verilog HDL语言同样可以胜任,它不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。验证中使用的激励和控制可用初始化语句产生,验证运行过程中的响应可以作为“变化时保存”或作为选通的数据存储。另外,还可以在初始化过程中写入相应的语句,把设计验证的结果与期望的响应值进行比较。下面举一个高层模块测试的例子。我们通过在这一模块中设置测试数据对前面的NAND和AND两个模块中的变量进行监测。第2章 初识Verilog HDL 【例例2-5】测试模块的例子。/测试以上两个模块的高层模块modu
21、le TEST_AND;reg a,b;wire out1,out2;initial begin /产生测试数据a=0;b=0;#1 a=1;#1 b=1;#1 a=0;end第2章 初识Verilog HDL initial begin /设置监测功能$monitor(Time=%0 a=%b b=%b out1=%b out2=%b,$time,a,b,out1,out2);end/模块AND和NAND实例调用AND gate1(a,b,out2);NAND gate2(a,b,out1);endmodule第2章 初识Verilog HDL 应注意的是,a和b都要被定义为reg类型,这是
22、因为它们的值需要保持,而寄存器型变量可以存储过程赋值的最终结果(同传统的命令式编程语言中的变量相类似)。连线型变量则没有存储能力,它们需要被连续驱动,例如用连续赋值语句或由一个模块的输出进行驱动,若连线型输入的左端悬空,则其值为未知态“x”。下面介绍一下连续赋值和过程赋值的区别。Verilog HDL语言中过程赋值和连续赋值之间区别很大。连续赋值使用关键词“assign”,而过程赋值的形式是=;其中必须是寄存器型或存储器型变量。过程赋值只允许出现在initial和always过程块中,过程赋值改变一个寄存器的状态,即时序逻辑;而连续赋值用来描述组合逻辑,连续赋值语句驱动连线型变量,输入操作数的
23、值一发生变化,就重新计算并更新它所驱动的变量。掌握这一区别很重要。第2章 初识Verilog HDL 模块中前一个initial结构块中的语句是顺序执行的,并且都设定了延迟,#1表示一个仿真时间单位的延迟。always结构块与initial结构块功能相同,但它是无限循环的过程(直到仿真停止),而initial结构块只执行一次。initial和always结构多用来描述时序逻辑,即有限状态自动控制。第二个initial结构块包含一条$monitor语句,它的功能是在参数表中指定的变量值发生变化时打印指定的字符串。第2章 初识Verilog HDL TEST_AND模块运行后的结果如下:Time=0 a=0 b=0 out1=1 out2=0Time=1 a=1 b=0 out1=1 out2=0Time=2 a=1 b=1 out1=0 o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论