您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第二章、Verilog-HDL与数字电路入门
第二章、数字电路与VerilogHDL入门本章主要讲授Verilog的基础知识以及与数字电路的关系。本章内容:基本verilogHDL的语法构成基本的组合电路设计及语法组成基本的时序电路设计及语法构成VerilogHDL的基本语句VerilogHDL是硬件描述语言的一种,故它是用来描述硬件电路的,而现阶段VerilogHDL主要描述的是数字电路。注意:这里是描述,而不是其它的“编程”语言。所以,从这个角度讲硬件描述语言与数字电路之间会有着不可分割的联系。以下主要通过HDL与数字电路的比对来讲述基本的Verilog语法。在VerilogHDL语言中,Verilog所描述的符号及逻辑在数字电路中均有相应的符号与逻辑相对应。下面是常见的一些符号:数字电路的符号VerilogHDL描述的符号电路符号的名字modulefunc(a,b,c,d);……endmodule端口上图中的a、b、c、d称为该电路func的端口。在模块名后面的括号中都是端口,端口之间用“,”隔开。端口的方向假设图中ab为输入端口,cd为输出端口。inputa;用input声明的端口为输入端口inputb;outputc;用output声明的端口为输出端口outputd;此外,用inout声明的端口为双向端口。端口的类型在数字电路中,通常具有两类数据类型,能保持数值的寄存器型(比如触发器)和不能保持数值的连线型。wirea;用wire声明的端口为连线型regc;用reg声明的端口为寄存器型。通常,输入一般都为wire型,而输出可以为wire型也可以为reg型。wired;wireclk;regq;功能实现由内部硬件电路实现,此处以与非门为例:使用always或者assign或者例化语句实现如:①alwaysc=!(a&b);②assignc=!(a&b);dclkqDQCPfuncabdcmodule关键字后面的func称为模块名③NAND2func(c,a,b);这里要求掌握①②的用法,③的用法后面章节将详细讲述。被赋值对象为wire型时,使用assign语句进行赋值被赋值对象为reg型时,使用always语句进行赋值边沿数字电路中有上升沿和下降沿posedge信号表示信号的上升沿negedge信号表示信号的下降沿posedge和negedge关键字都是配合always使用的。总线假设有8位数据总线D0~D7用D[7:0]或者D[0:7]或者D[8:1]或者D[1:8]等表示。也可以用D[4:-3]之类的表示方式。其他高电平低电平高阻态不确定态10Z或zX或xVerilogHDL通常的结构构成模块的结构如下:一个完整的VerilogHDL通常由4部分构成:(1)模块声明部分,包含关键字module和endmodule,在module后面的是模块名称和端口名列表,注意,端口名列表的括号后面有个分号(2)端口方向定义,指明所有的端口是输入还是输出或者是双向(关键字为inout,后面会学习到)的。(3)端口(和内部变量)类型,一般来说,所有的输入都是wire型,输出端一般要根据是组合电路还是时序电路分别定义成wire型和reg型。(4)功能实现部分,这部分通常是设计的核心,大型的设计重点就在这里,通常由always、assign和元件例化(后面会学习到)构成。任何一个电路的描述都必须由这4部分构成,不论设计多么简单或者多么复杂。abc&module模块名(端口列表);定义内部功能的实现endmodule例:一个简单的组合逻辑电路的VerilogHDL实现用VerilogHDL实现一与门。代码注释:⑴使用module关键字定一个模块,模块名为andgate2,它有三个端口,端口名分别为a,b,c。⑵使用input关键字将a端口声明为输入端口。⑶使用input关键字将b端口也声明为输入端口。⑷使用output关键字将c端口声明为输出端口。⑸使用wire声明端口a是连线型。⑹使用wire声明端口b是连线型。⑺使用wire声明端口c是连线型。⑻模块功能实现部分,使用assign赋值语句将c的值赋值为a与上(“&”是与运算符号)b的结果。⑼模块结束关键字endmodule,注意:end和module中间没有空格,endmodule是一个整体。以上代码具有verilog的基本特征,须熟记。由此VerilogHDL生成的对应的电路图符号如下:注:此图使用altera公司的FPGA/CPLD集成开发环境QuartusII9.0sp2综合实现,有关QuartusII的操作见附录。例:一个简单的时序电路的设计--4位计数器的VerilogHDL实现。4位计数器对应的电路符号如下:它有一个时钟输入端口(clock),一个四位的计数输出端口(q)。moduleandgate2(a,b,c);//------⑴inputa;//------⑵inputb;//------⑶outputc;//------⑷wirea;//------⑸wireb;//------⑹wirec;//------⑺assignc=a&b;//------⑻endmodule//------⑼模块声明部分端口方向定义部分端口类型部分功能实现部分clockq[3..0]counter4inst功能说明:当clock端输入上升沿脉冲时候,计数器的输出端Q进行加1动作。VerilogHDL代码如下:代码注释:⑴使用module关键字定一个模块,模块名为counter4,它有两个端口,端口名分别为clock,q。⑵使用input关键字将clock端口声明为输入端口。⑶使用output关键字将q端口声明为4位的输出端口,[3:0]表示有四个口线。⑷使用wire声明端口clock是连线型。⑸使用reg关键字声明q为寄存器型。注:通常在always中被赋值的对象都要声明为reg型。⑹用always进程块(后面章节会详细讲解)实现模块的功能,@表示检测到括号内的信号的变化才会触发always执行,posedgeclock表示clock信号的上升沿。⑺表示将q的值进行加1。和⑹一起表示:当clock上升沿到来的时候,q的值变为q+1。⑻模块结束关键字endmodule。基本的数值表示Verilog能够支持综合的数只有整数,而小数、字符等不支持综合。所谓综合,就是指能够直接形成硬件电路的语句和语法。Verilog中整数的构成+/-位宽’进制值其中:位宽是指该整数对应的二进制的宽度’进制有4种类型,分别是二进制:’B或者’b八进制:’O或者’omodulecounter4(clock,q);//---------⑴inputclock;//---------⑵output[3:0]q;//---------⑶wireclock;//---------⑷reg[3:0]q;//---------⑸always@(posedgeclock)//---------⑹q=q+1;//---------⑺endmodule//---------⑻十进制:’D或者’d十六进制:’H或者’h表示可以省略。当位宽省略时候,实际的位宽为该数值对应的二进制位宽当’进制省略时候,默认为十进制如果值本身很长,可以在值中间用下划线“_”隔开,使程序看起来更加清楚。例如:4’d7,表示对应二进制宽度是4位的十进制数7(二进制数为0111,即4’b0111)12’b1011_0110_0001,表示位宽为12位的二进制数101101100001。默认情况下,这种方式定义的数都是无符号数,Verilog还可以定义有符号数。方法为在’进制之间使用s,即:+/-位宽’s进制值例如:16’sh8c01为一个16位的有符号16进制数。有符号数和无符号数可以相互转换,通过使用系统函数$signed和$unsigned实现。例如:reg[63:0]a;//无符号数据类型使用运算result1=a/2;进行的是无符号的算术运算而result=$signed(a)/2;进行的则是有符号算术运算。有符号数还可以通过关键字signed来定义:例如:regsigned[63:0]data;//则,data即为一个64位的有符号数。补充语法:整数的表示形式必须讲了,其余详细语法可以做个附录,详细介绍1.模块的声明2.端口定义a)inputb)outputc)inout:双向端口,即:既可以作为输入端口,有可以作为输出端口。3.信号类型(Verilog中共有19种信号类型,这里只需要掌握三种)a)wireb)regc)integer4.逻辑功能定义a)assign持续赋值语句,通常对连线型变量赋值。例如:assignc=!(a&b);b)元件例化语句(实例化)例如:anda1(out,a,b,c);and为verilog内含的元件,此处表示生成一个与门,这个与门有一个输出端out,三个输入端a,b,c。具体解释参见后面其他章节。c)Always过程块一般用于描述时序逻辑,always内部被赋值的对象一般设置成reg型。5.空白符和注释6.标识符、运算符、关键字7.VerilogHDL支持的逻辑值状态8.VerilogHDL中整数的表示9.数据类型和变量10.寄存器和存储器由于VerilogHDL语言是由C语言演变过来的,所以C语言的很多关键字、运算符都可以直接用于Verilog中,需要注意的是一些c语言的运算符和关键字及符号在verilog中的含义有所改变,这些关键字主要包括,在以后的内容中会逐一说明。以上内容放到第一章里面?2.条件语句(?:)-基本组合逻辑电路设计组合电路是数字电路的最基本类型,通常在数字系统中大量应用,比较典型的有二选一、多选一、3-8译码器,8-3编码器等。2选1电路设计:2选1的模块图形如下如上图所示,模块名为My2_1Mux。二选一有3个输入端口,分别是A、B、SEL和一个输出端口Y。当给SEL施加一个高电平时,Y端输出的是A的电平值,否则,Y端输出的是B的电平值。此处使用条件语句实现。即c语言中的“?:”。核心语句如下:assignY=SEL?A:B;词句解释:如果SEL为高电平,就把A端口直接赋给Y,否则把B端口赋给Y。即:SEL端在这里起到了一个选择Y输出谁的作用,也即2选1。完整代码如下:代码注释⑴⑵:可以把多条语句写在一行,像C语言的语句用法一样。当然,也可以分成三行写。格式比较自由。此处训练使用ifelse语句的使用。Ifelse是选择语句,verilog中的用法与c语言用法相同。基本代码如下3-8译码器的设计My2_1MuxABYSEL‘moduleMy2_1Mux(A,B,SEL,Y);inputA;inputB;inputSEL;//---------⑴outputY;wireA;wireB;wireSEL;wireY;//---------⑵assignY=SEL?A:B;endmodule3-8译码器的电路图形如下其中ABC是三个输入,Y0~Y7是8个输出。为了研究问题方便和代码书写的方便,这里将原本的3-8译码器的输入输出名称更换成总线的表示形式(原来的表示形式也可以用Verilog描述,但会用到新的语法),新的3-8译码器的电路图形式如下:其中SEL[2..0]表示A、B、C三个输入端,Y[7..0]表示Y7~Y0八个输出端。使用上面的条件语句表示如下:moduleMy3_8Circuit2(SEL,Y);input[2:0]SEL;output[7:0]Y;wire[2:0]SEL;wire[7:0]Y;assignY=(SEL==3'b000)?8'b11111110://---------(1)(SEL==3'b001)?8'b11111101://---------(2)(SEL==3'b010)?8'b11111011:(SEL==3'b011)?8'b11110111:(SEL==3'b100)?8'b11101111:(SEL==3'b101)?8'b11011111:(SE
本文标题:第二章、Verilog-HDL与数字电路入门
链接地址:https://www.777doc.com/doc-3889887 .html