1第1章硬件描述语言VHDL数字系统设计分为硬件设计和软件设计,但是随着计算机技术、超大规模集成电路(CPLD、FPGA)的发展和硬件描述语言(HDL,HardwareDescriptionLanguage)的出现,软、硬件设计之间的界限被打破,数字系统的硬件设计可以完全用软件来实现,只要掌握了HDL语言就可以设计出各种各样的数字逻辑电路。1.1老的硬件设计方法老的硬件设计方法有如下几个特征:(1)采用自下而上的设计方法使用该方法进行硬件设计是从选择具体元器件开始,并用这些元器件进行逻辑电路设计,从而完成系统的硬件设计,然后再将各功能模块连接起来,完成整个系统的硬件设计,(2)采用通用逻辑元器件通常采用74系列和CMOS4000系列的产品进行设计(3)在系统硬件设计的后期进行调试和仿真只有在部分或全部硬件电路连接完毕,才可以进行电路调试,一旦考虑不周到,系统设计存在较大缺陷,则要重新设计,使设计周期延长。(4)设计结果是一张电路图当设计调试完毕后,形成电原理图,该图包括元器件型号和信号之间的互连关系等等。老的硬件设计方法已经使用了几十年,是广大电子工程师熟悉和掌握的一种方法,但是现在这种方法老了,不仅方法老了,就连使用的元器件也老了。1.2使用HTL的硬件设计方法所谓硬件描述语言,就是利用一种人和计算机都能识别的语言来描述硬件电路的功能,信号连接关系及定时关系,它可以比电原理图更能表示硬件电路的特性。该方法有如下特征:(1)支持自顶向下的设计方法所谓自顶向下的设计方法就是从系统的总体要求出发,自顶向下分三个层次对系统硬件进行设计。第一个层次是行为描述,所谓行为描述,实际就是对整个系统的数学模型的描述,在行为描述阶段,并不真正考虑其实际操作和算法怎么实现,而是考虑系统的结构和工作过程是否能达到系统设计规格书的要求。2第二个层次是数据流描述,又称为寄存器描述或RTL方式描述,该描述比行为描述更注重硬件的具体实现,通过该描述可以导出系统的逻辑表达式,为逻辑综合作准备,当然进行逻辑综合和逻辑综合工具的能力有关,当然设计人员还必须了解逻辑综合工具的说明和规定,第三个层次为逻辑综合。该层次把RTL描述的程序转换成基本逻辑元件表示的文件,该文件就象老的设计方法中的电原理图。(2)采用大量的ASIC芯片(3)早期仿真以确定系统的可行性(4)使设计更容易只需写出系统的HDL源程序文件,其它由计算机去做(5)全部设计文件就是HDL源程序文件1.3VHTL硬件设计语言当前ASIC制造商都自己开发了HDL语言,但是都不通用,只有美国国防部开发的VHDL语言成为了IEEE.STD_1076标准,并在全世界得到了承认。该语言集成了各种HDL语言的优点,使数字系统设计更加简单和容易。VHDL语言是一个规模庞大的语言,在使用它之前完全学会它是很难的,本书介绍的只是VHDL语言的一部分。1.4VHDL语言的基本结构VHDL语言通常包含实体(Entity),构造体(Architecture),配置(Configuration),包集合(Package),和库(Library)五部分.其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。如下详细介绍。1.4.1基本设计单元VHDL的基本设计单元就是实体,无论数字电路复杂还是简单,都是由实体和构造体组成。(1)实体说明实体说明有如下结构:ENTITY实体名IS[端口说明]END实体名;(VHDL语言中不分大小写字母)其中:3端口说明是对设计实体中输入和输出借口进行描述,格式如下:PORT(端口名(,端口名):方向数据类型名;::端口名(,端口名):方向数据类型名);端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。端口方向是定义引脚是输入还是输出,见下表:方向说明IN输入到实体OUT从实体输出输出INOUT双向BUFFER输出(但可以反馈到实体内部)LINKAGE不指定方向常用的端口数据类型有两种:BIT和BIT_VECTOR,当端口被说明为BIT时,只能取值“1”或“0”,当端口被说明为BIT_VECTOR时,它可能是一组二进制数。例:PORT(n0,n1,select:INBIT;q:OUTBIT;bus:OUTBIT_VECTOR(7DOWNTO0));本例中,n0,n1,select是输入引脚,属于BIT型,q是输出引脚,BIT型,bus是一组8位二进制总线,属于BIT_VECTOR,例:LIBRARYIEEE;USEIEEE.STD_LOGIC.1164.ALL;ENTITYmmISPORT(n0,n1,select:INSTD_LOGIC;Q:OUTSTD_LOGIC;Bus:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmm;在此例中端口数据类型取自IEEE标准库(该库中有数据类型和函数的说明),其中STD_LOGIC取值为“0”,“1”,“X”和“Z”。因为使用了库所以在实体说明前要增加库说明语句。(2)构造体4构造体是实体的一个重要部分,每一个实体都有一个或一个以上的构造体。1)一般说明构造体格式如下:ARCHITECTURE构造体名OF实体名IS[定义语句]内部信号,常数,数据类型,函数等的定义BEGIN[并行处理语句]END构造体名;例:ENTITYnaxISPORT(a0,a1:INBIT;Sel:INBIT;Sh:OUTBIT);ENDnax;ARCHITECTUREdataflowOFnaxISBEGINsh=(a0ANDsel)OR(NOTselANDa1);ENDdataflow;构造体描述设计实体的具体行为,它包含两类语句:并行语句并行语句总是在进程语句(PROCESS)的外部,该语句的执行与书写顺序无关,总是同时被执行顺序语句顺序语句总是在进程语句(PROCESS)的内部,从仿真的角度,该语句是顺序执行的一个构造体包含几个类型的子结构描述,这些描述是:*BLOCK描述(块描述)*PROCESS描述(进程描述)*SUNPROGRAMS描述(子程序描述)2)BLOCK语句描述使用BLOCK语句描述的格式如下:块标号:BLOCKBEGIN::ENDBLOCK块标号:5例:二选一电路ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINcale:BLOCKBEGINtmp1=d0ANDsel;tmp2=d1AND(NOTsel);tmp3=tmp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDconnect;在对程序进行仿真时,BLOCK中的语句是并行执行的,与书写顺序无关,这一点和构造体中直接写的语句是一样的。3)进程(PROCESS)描述进程描述的格式如下:[进程名]:PROCESS(信号1,信号2,。。。)BEGIN::ENDPROCESS进程名;*一般用于组合电路进程模式:__进程标记:PROCESS(__信号名,__信号名,__信号名)VARIABLE__变量名:STD_LOGIC;VARIABLE__变量名:STD_LOGIC;BEGIN--指定信号6--指定变量--过程调用--如果语句--CASE语句--循环语句ENDPROCESS__进程标记;*用于时序电路进程模式:__进程标记:PROCESS(__信号名,__信号名,__信号名)VARIABLE__变量名:STD_LOGIC;VARIABLE__变量名:STD_LOGIC;BEGINWAITUNTIL__时钟信号='1';--指定信号--指定变量--过程调用--如果语句--CASE语句--循环语句ENDPROCESS__进程标记;例:ENTITYmux1ISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux1;ARCHITECTUREconnectOFmux1ISBEGINcale:PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;--在进程中定义的变量BEGINtmp1:=d0ANDsel;--输入端口向变量赋值tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;q=tmp3;7ENDPROCESScale;ENDconnect;在PROCESS中的语句是顺序执行的,这一点和BLOCK中的语句是不一样的。当PROCESS所带的信号量发生变化时,PROCESS中的语句就会执行一遍。4)子程序描述子程序的概念和其它高级程序中子程序的概念相同,在VHDL中有两种类型:过程(Procedure)函数(Function)1.过程的格式:PROCEDURE过程名(参数1,参数2。。。。)IS[定义变量语句]BEGIN[顺序处理语句]END过程名;例:PROCEDUREvector_to_int(z:INSTD_LOGIC_VECTOR;x_flag:OUTBOOLEAN;q:ININTEGER)ISBEGINq:=0;x_flag:=FALSE;FORiINzRANGELOOPq:=q*2;IF(z(i)=1)THENq:=q+1;ELSEIF(z(i)/=10)THENx_flag:=TRUE;ENDIF;ENDLOOP;ENDvector_to_int;在过程中,语句是顺序执行的。2.函数8函数的格式:FUNCTION函数名(参数1,参数2。。。。)RETURN数据类型名IS[定义变量语句]BEGIN[顺序处理语句]RETURN[返回变量名];END函数名;在VHDL语言中函数的参数都是输入信号,例:FUNCTIONmin(x,y:INTEGER)RETURNINTEGERISBEGINIFXYTHENRETURN(x);ELSERETURN(y);ENDIF;ENDmin;1.4.22包、库和配置(1)库库是经编译后的数据的集合,它存放包定义、实体定义、构造定义和配置定义。在设计单元内的语句可以使用库中的结果,所以,库的好处就是设计者可以共享已经编译的设计结果,在VHDL中有很多库,但他们相互独立。IEEE库:在IEEE库中有一个STD_LOGIC的包,它是IEEE正式认可的包。STD库:STD库是VHDL的标准库,在库中有名为STANDARD的包,还有TEXTIO包。若使用STANDARD包中的数据可以不按标准格式说明,但是若使用TEXTIO包,则需要按照如下格式说明:LIBRARYSTD;USESTD.TEXTIO.ALL另外还有ASIC库、WORK库和用户自定义库等。库的使用:在使用库之前,一定要进行库说明和包说明,库和包的说明总是放在设计单元的前面:LIBRARY库名;USELIBRARYname.package.name.ITEM.name9例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL该例说明要使用IEEE库中的1164包中所有项目库的作用范围:库的作用范围从一个实体说明开始到它所属的结构体、配置为止,当有两个实体时,第二个实体前要另加库和包的说明。(2)包通常在一个实体中对数据类型、常量等进行的说明只可以在一个实体中使用,为使这些说明可以在其它实体中使用,VHDL提供了程序包结构,包中罗列VHDL中用到的信号定义、常数定义、数据类型、元件语句、函数定义和过程定义,它是一个可编译的设计单元,也是库结构中的一个层次,使用包时可以用USE语句说明,例如:USEIEEE.STD_LOGIC_1164.ALL程序包分为包头和包体,包结构的格式如下:1)包头格式:PACKAGE包名IS[说明语句]END包名包头中列出所有项的名称。2)包体格式:PACKAGEBODY包名