第二章、Verilog HDL及数字电路入门_第1页
第二章、Verilog HDL及数字电路入门_第2页
第二章、Verilog HDL及数字电路入门_第3页
第二章、Verilog HDL及数字电路入门_第4页
第二章、Verilog HDL及数字电路入门_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章、数字电路与Verilog HDL入门本章主要讲授Verilog的基础知识以及与数字电路的关系。本章内容:基本verilog HDL的语法构成 基本的组合电路设计及语法组成 基本的时序电路设计及语法构成 Verilog HDL的基本语句Verilog HDL是硬件描述语言的一种,故它是用来描述硬件电路的,而现阶段Verilog HDL主要描述的是数字电路。注意:这里是描述,而不是其它的“编程”语言。所以,从这个角度讲硬件描述语言与数字电路之间会有着不可分割的联系。以下主要通过HDL与数字电路的比对来讲述基本的Verilog语法。在Verilog HDL语言中,Verilog所描述的符号及

2、逻辑在数字电路中均有相应的符号与逻辑相对应。下面是常见的一些符号:数字电路的符号Verilog HDL描述的符号电路符号的名字cdbfuncamodule func(a, b, c, d);module关键字后面的func称为模块名endmodule端口上图中的a、b、c、d称为该电路func的端口。在模块名后面的括号中都是端口,端口之间用“,”隔开。端口的方向假设图中a b为输入端口,c d为输出端口。input a;用input声明的端口为输入端口input b;output c;用output声明的端口为输出端口output d;此外,用inout声明的端口为双向端口。端口的类型在数字电

3、路中,通常具有两类数据类型,能保持数值的寄存器型(比如触发器)和不能保持数值的连线型。dclkqD QCPwire a;用wire声明的端口为连线型reg c;用reg声明的端口为寄存器型。通常,输入一般都为wire型,而输出可以为wire型也可以为reg型。wire d;wire clk;reg q;功能实现由内部硬件电路实现,此处以与非门为例:abc&使用always或者assign或者例化语句实现如: always c = !(a & b); assign c = !(a & b); NAND2 func(c,a,b);这里要求掌握的用法,的用法后面章节将详细讲述。被赋值对象为wire型

4、时,使用assign语句进行赋值被赋值对象为reg型时,使用always语句进行赋值边沿数字电路中有上升沿和下降沿posedge 信号 表示信号的上升沿negedge 信号 表示信号的下降沿posedge和negedge关键字都是配合always使用的。总线假设有8位数据总线D0D7用D7:0或者D0:7或者D8:1或者D1:8等表示。也可以用D4:-3之类的表示方式。其他高电平低电平高阻态不确定态10Z 或 zX 或 x Verilog HDL通常的结构构成模块的结构如下:module ( );endmodule一个完整的Verilog HDL通常由4部分构成:(1)模块声明部分,包含关键字

5、module 和endmodule,在module后面的是模块名称和端口名列表,注意,端口名列表的括号后面有个分号(2)端口方向定义,指明所有的端口是输入还是输出或者是双向(关键字为inout,后面会学习到)的。(3)端口(和内部变量)类型,一般来说,所有的输入都是wire型,输出端一般要根据是组合电路还是时序电路分别定义成wire型和reg型。(4)功能实现部分,这部分通常是设计的核心,大型的设计重点就在这里,通常由always、assign和元件例化(后面会学习到)构成。任何一个电路的描述都必须由这4部分构成,不论设计多么简单或者多么复杂。例:一个简单的组合逻辑电路的Verilog HDL

6、实现用Verilog HDL实现一与门。module andgate2(a,b,c);/-input a;/- input b;/- output c;/- wire a;/- wire b;/- wire c;/-assign c=a&b;/-endmodule/-模块声明部分端口方向定义部分端口类型部分功能实现部分代码注释:使用module关键字定一个模块,模块名为andgate2,它有三个端口,端口名分别为a,b,c。使用input关键字将a端口声明为输入端口。 使用input关键字将b端口也声明为输入端口。使用output关键字将c端口声明为输出端口。使用wire声明端口a是连线型。

7、使用wire声明端口b是连线型。 使用wire声明端口c是连线型。模块功能实现部分,使用assign赋值语句将c的值赋值为a与上(“&”是与运算符号)b的结果。模块结束关键字endmodule,注意:end和module中间没有空格,endmodule是一个整体。以上代码具有verilog的基本特征,须熟记。由此Verilog HDL生成的对应的电路图符号如下:注:此图使用altera公司的FPGA/CPLD集成开发环境Quartus II 9.0 sp2综合实现,有关Quartus II的操作见附录。例:一个简单的时序电路的设计-4位计数器的Verilog HDL实现。4位计数器对应的电路符

8、号如下:它有一个时钟输入端口(clock),一个四位的计数输出端口(q)。功能说明:当clock端输入上升沿脉冲时候,计数器的输出端Q进行加1动作。Verilog HDL代码如下:module counter4(clock,q);/-input clock;/-output 3:0 q;/-wire clock;/-reg 3:0 q;/-always(posedge clock)/-q=q+1; /-endmodule/-代码注释:使用module关键字定一个模块,模块名为counter4,它有两个端口,端口名分别为clock,q。使用input关键字将clock端口声明为输入端口。 使用o

9、utput关键字将q端口声明为4位的输出端口,3:0表示有四个口线。使用wire声明端口clock是连线型。使用reg关键字声明q为寄存器型。注:通常在always中被赋值的对象都要声明为reg型。用always进程块(后面章节会详细讲解)实现模块的功能,表示检测到括号内的信号的变化才会触发always执行,posedge clock表示clock信号的上升沿。表示将q的值进行加1。和一起表示:当clock上升沿到来的时候,q的值变为q+1。模块结束关键字endmodule。基本的数值表示Verilog能够支持综合的数只有整数,而小数、字符等不支持综合。所谓综合,就是指能够直接形成硬件电路的语

10、句和语法。Verilog中整数的构成 +/- 值其中:位宽是指该整数对应的二进制的宽度 进制有4种类型,分别是 二进制:B或者b 八进制:O或者o 十进制:D或者d 十六进制:H或者h 表示可以省略。当位宽省略时候,实际的位宽为该数值对应的二进制位宽 当进制省略时候,默认为十进制 如果值本身很长,可以在值中间用下划线“_”隔开,使程序看起来更加清楚。 例如: 4d7,表示对应二进制宽度是4位的十进制数7(二进制数为0111,即4b0111) 12b1011_0110_0001,表示位宽为12位的二进制数101101100001。 默认情况下,这种方式定义的数都是无符号数, Verilog还可以

11、定义有符号数。方法为在 进制之间使用s,即: +/- 值 例如: 16sh8c01 为一个16位的有符号16进制数。有符号数和无符号数可以相互转换,通过使用系统函数$signed和$unsigned实现。例如:reg 63:0 a;/无符号数据类型使用运算 result1=a/2;进行的是无符号的算术运算而result=$signed(a)/2; 进行的则是有符号算术运算。有符号数还可以通过关键字signed来定义:例如: reg signed 63:0 data; /则,data即为一个64位的有符号数。补充语法:整数的表示形式必须讲了,其余详细语法可以做个附录,详细介绍1 模块的声明2 端

12、口定义a) input b) output c) inout :双向端口,即:既可以作为输入端口,有可以作为输出端口。3 信号类型(Verilog中共有19种信号类型,这里只需要掌握三种)a) wireb) regc) integer4 逻辑功能定义a) assign 持续赋值语句,通常对连线型变量赋值。例如:assign c = !(a & b);b) 元件例化语句(实例化)例如:and a1(out,a,b,c); and为verilog内含的元件,此处表示生成一个与门,这个与门有一个输出端out,三个输入端a,b,c。具体解释参见后面其他章节。c) Always过程块 一般用于描述时序逻

13、辑,always内部被赋值的对象一般设置成reg型。5 空白符和注释6 标识符、运算符、关键字7 Verilog HDL支持的逻辑值状态8 Verilog HDL中整数的表示9 数据类型和变量10 寄存器和存储器由于VerilogHDL语言是由C语言演变过来的,所以C语言的很多关键字、运算符都可以直接用于Verilog中,需要注意的是一些c语言的运算符和关键字及符号在verilog中的含义有所改变,这些关键字主要包括,在以后的内容中会逐一说明。以上内容放到第一章里面?2. 条件语句(?:)-基本组合逻辑电路设计组合电路是数字电路的最基本类型,通常在数字系统中大量应用,比较典型的有二选一、多选一

14、、3-8译码器,8-3编码器等。2选1电路设计:2选1的模块图形如下My2_1MuxABYSEL如上图所示,模块名为My2_1Mux。二选一有3个输入端口,分别是A、B、SEL和一个输出端口Y。当给SEL施加一个高电平时,Y端输出的是A的电平值,否则,Y端输出的是B的电平值。此处使用条件语句实现。即c语言中的 “? :”。核心语句如下: assign Y=SEL?A:B;词句解释:如果SEL为高电平,就把A端口直接赋给Y,否则把B端口赋给Y。即:SEL端在这里起到了一个选择Y输出谁的作用,也即2选1。完整代码如下:module My2_1Mux (A, B, SEL, Y);input A;i

15、nput B; input SEL; /-output Y; wire A;wire B; wire SEL; wire Y;/-assign Y=SEL?A:B;endmodule代码注释:可以把多条语句写在一行,像C语言的语句用法一样。当然,也可以分成三行写。格式比较自由。此处训练使用if else语句的使用。If else 是选择语句,verilog中的用法与c语言用法相同。基本代码如下3-8译码器的设计3-8译码器的电路图形如下My3_8CircuitABCY0Y1Y2Y3Y4Y5Y6Y7其中ABC是三个输入,Y0Y7是8个输出。为了研究问题方便和代码书写的方便,这里将原本的3-8译码

16、器的输入输出名称更换成总线的表示形式(原来的表示形式也可以用Verilog描述,但会用到新的语法),新的3-8译码器的电路图形式如下:My3_8Circuit2SEL2.0Y7.0其中SEL2.0表示A、B、C三个输入端,Y7.0表示Y7Y0八个输出端。使用上面的条件语句表示如下:module My3_8Circuit2(SEL,Y);input 2:0 SEL; output7:0 Y; wire 2:0 SEL; wire 7:0 Y;assign Y= (SEL=3b000)?8b11111110: /-(1) (SEL=3b001)?8b11111101: /-(2) (SEL=3b0

17、10)?8b11111011: (SEL=3b011)?8b11110111: (SEL=3b100)?8b11101111: (SEL=3b101)?8b11011111: (SEL=3b110)?8b10111111: (SEL=3b111)?8b01111111: 8b11111111; /-(3)endmodule代码注释(1)如果输入端都为低电平,则输出Y0为0,其余均为高电平1。否则(2)。(2)如果输入端为二进制的001,则输出Y1为0,其余均为高电平1。依次类推。(3)如果是其他值的情况,比如某个输入为高阻态之类的(实际电路中不应该出现的情况),输出全高电平,即:不让译码器工作

18、。注意:图中的Y总线表示用Y7.0,而代码中用的是Y7:0,请注意它们的区别。If else语句的使用。基本的时序电路的实现,D触发器是时序电路中最简答的时序电路了,它的电路图如下:MyDffCPQCLRPRED这里,CP是时钟输入端,PRE是异步置位端,CLR是异步复位端,Q为输出,Qbar为输出的取反,为了彻底描述D触发器的特性,我们分步骤进行设计,首先,从最基本的功能开始,为此,我们将设计的D触发器进行简化,PRE、CLR和Qbar的功能我们暂不实现。D触发器设计实例1:最简单的D触发器设计。简化后的D触发器如下图:MyDff1CPQD功能描述:当CP端出现一个上升沿脉冲时,将D输入端信

19、号传递至输出Q端。代码如下:module MyDff(cp,d,q);input cp;input d;output q;wire cp; reg q;always(posedge cp) /-(1) q=d; endmodule代码注释:(1)当cp上升沿到达时,always模块动作一次,将d的值赋给q。注意在输出类型中,我们将q端定义成reg型,是因为我们设计了一个输出端q,它赋值的时候是在always功能块中进行的。也就是说,所有在always功能块中被赋值的对象都要定义成reg类型。从物理意义上将,此处设计的是一个能保存数据的端口,故此需要定义成reg型。QuartusII 可以将综合

20、后的电路进行展示出来,通过菜单Tools-NetlistViewers-RTL Viewer可以查看生成的电路视图,见下图:并且可以通过仿真验证D触发器工作的正确性。见下图从上图可以看出,尽管d输入端在74.8ns时刻之前的就变为了高电平。但是只有在74.8ns时刻时钟上升沿到达的时候输出端q才变为高定平,也就是当时钟上升沿到达的时候输入端d的值才传递给输出端q。同理可以推导其他时刻q端的变化情况。并行同时电路设计Verilog HDL硬件描述语言的特长是并行同时执行。即可以在CPLD/ FPGA中用硬件描述语言Verilog同时实现多个相互独立的硬件电路,这些电路之间相互可以独立的运行。例如

21、:设计一个电路,该电路内部同时具有一个D触发器和一个与非门电路。为了研究简便,采用最简方式的D触发器。电路图如下MyCustomCircuitCPQDABC此电路具有D、CP、Q、A、B、C等端口,其功能如虚线所示,D、CP、Q表达的是一个D触发器,A、B、C表示一个与非门。电路代码如下module MyCustomCircuit(D,CP,Q,A,B,C); input D,CP,A,B; wire D,CP,A,B; output Q; reg Q; output C; wire C; always(posedge CP) Q=D; /-(1) assign C=!(A&B); /-(2)

22、endmodule代码注释:设计个作业题,让学生把D触发器的Qbar端的功能补上本代码中功能实现部分采用了两个语句,分别是always和assign,其中always描述的语句是时序电路D触发器;assign描述的语句是组合电路与非门,这两个电路即与非门和D触发器是同时并存的,他们之间执行没有先后顺序,是同时运行的,与代码的书写顺序无关,也就是说,如果把(1)和(2)调换一下顺序,不影响生成电路的结果。学习Verilog时候要特别注意这一点,它和普通的程序设计语言的先后执行顺序在本质上有着天壤之别!(2) 中的“! ”是取反运算符号。作业题2,把前面设计的4位计数器的进位输出功能加上带有中间变

23、量的编程实例在具有一定复杂性的设计中,往往单靠一条功能性语句并不能很好地描述电路的功能,引入中间变量则是个较好的方法,可以改变设计的复杂性。以下通过半加器的两种不同设计方式来对比中间变量使用的好处。半加器1,传统方式的设计。无中间变量的Verilog HDL描述方式。在数字电路中,半加器的电路实现如下图HalfAdderSABC在以往的数字线路教学中,根据卡诺图等工具可以推导出半加器内部是由与门和异或门构成,如上图所示。其中A和B为半加器的两个输入端,S为半加器的和输出端,C为输出进位端。这里使用2个assign语句就可以实现,参照下面代码:module HalfAdder1(A,B,C,S); input A,B; wire A,B; output C,S; wire C,S; assign S= AB; /-(1) assign C= A&B; /-(2)endmodule代码注释:(1)“”符号为异或运算符,和c语言中的异或运算符相同(2) 与门功能和(1)的异或功能是同时并存于电路中的,并行执行。(1)和(2)语句的顺序可以颠倒,功能不变。通过Quartus II综合可以看出半加器的实现是正确的,当然也可以通过仿真验证。

温馨提示

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

评论

0/150

提交评论