概述数字系统设计分为硬件设计和软件设计,但是随着计算机技术、超大规模集成电路(CPLD、FPGA)的发展和硬件描述语言(HDL,HardwareDescriptionLanguage)的出现,软、硬件设计之间的界限被打破,数字系统的硬件设计可以完全用软件来实现,只要掌握了HDL语言就可以设计出各种各样的数字逻辑电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux2_1ISPORT(A,B:INSTD_LOGIC;S:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDmux2_1;ARCHITECTUREoneOFmux2_1ISBEGINprocess(A,B,S)beginIf(S=‘0’)thenY=A;ElseY=B;endif;endprocess;ENDone;IEEE库说明实体结构体例1:一个简单的例子,2选1数据选择器的描述数据输入选择输出ABSY01AB端口图ABSY1、VHDL语言的基本结构VHDL设计实体的基本结构由库、程序包、实体、结构体和配置等部分构成。其中,实体和结构体是设计实体的基本组成部分,它们可以构成最基本的VHDL程序。根据VHDL语法规则,在VHDL程序中使用的数据对象、数据类型都需要预先定义。为了方便使用VHDL编程,IEEE将预定义的数据类型、元件调用声明以及一些常用子程序收集在一起,形成程序包,供VHDL设计实体共享和调用。若干个程序包则形成库。常用的VHDL库有IEEE标准库、STD库和WORK库。IEEE标准库包括STD_LOGIC_1164程序包,它是最重要和最常用的程序包,大部分数字系统设计都是以此程序包设定的标准为基础的。1.1、实体设计实体是一个完整的、独立的语言模块。它相当于电路中的一个器件。实体由实体声明部分和结构体组成。实体声明部分指定了设计单元的输入输出端口或引脚,它是设计实体对外的一个通信界面,是外界可以看到的部分。结构体用来描述设计实体的逻辑结构和逻辑功能,它由VHDL语句构成,是外界看不到的部分。一个实体可以拥有一个或多个结构体。ENTITY实体名IS[GENERIC(类属表);]PORT(端口表);ENDENTITY实体名;例:ENTITYor2ISPORT(a,b:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDENTITYor2;实体语句结构如下:注意:Quartus开发工具中实体名与保存该实体的VHDL源文件名必须是一样的。在层次化系统设计中,实体说明是整个模块或整个系统的输入输出(I/O)接口;在一个器件级的设计中,实体说明是一个芯片的输入输出(I/O)。1.1.1类属表(GENERIC)类属参量是实体说明中的可选项,放在端口说明之前,其一般格式为:GENERIC(常数名:数据类型:=设定值;...);类属表是一种端口界面常数,常用来规定端口的大小、实体中子元件的数目及实体的定时特性等。它和常数不同,常数只能从设计实体的内部得到赋值且不能改变,而类属表的值可由设计实体的外部提供。因此设计者可以从外面通过类属表的重新设定而容易的改变一个设计实体或一个元件的内部电路结构和规模。例:GENERIC(trise,tfall:TIME:=1ns;Addrwidth:INTEGER:=16);PORT(a0,a1:INSTD_LOGIC;Add_bus:OUTSTD_LOGIC_VECTOR(Addrwidth-1DOWNTO0);这里类属表中参数trise为上升沿宽度,tfall为下降沿宽度,用于仿真模块的设计;定义地址总线的宽度为Addrwidth位,类属值Addrwidth的改变将使结构体中所有相关的总线定义同时改变,由此使整个设计实体的硬件结构发生变化。1.1.2端口说明(PORT)端口的功能相当电路图符号中的外部引脚。端口可以被赋值,也可以当做逻辑变量用在逻辑表达式中。其一般书写格式为:PORT(端口名:端口方向数据类型;端口名:端口方向数据类型;……);其中端口名是设计者为实体的每一个引脚所取的名字,通常为英文字母加数字,名字的定义有一定的惯例,如clk表示时钟,D开头的端口名表示数据,A开头的端口名表示地址。端口方向是指这些通道上的数据流动的方式,如输入或输出等。端口方向有以下几种类型:1.输入(IN)允许信号进入实体,主要用于时钟输入、控制输入(如load、reset、enable、clk)和单向的数据输入(如地址数据信号address)等。2.输出(OUT)输出模式只允许信号离开实体,常用于计数输出、单向数据输出、被设计实体产生的控制其他实体的信号等。注意:输出模式不能用于被设计实体的内部反馈,因为输出端口在实体内不能看做是可读的。3.双向模式(INOUT)双向模式允许信号双向传输(既可以进入实体,也可以离开实体),双向模式端口允许引入内部反馈。4.缓冲(BUFFER)缓冲模式允许信号输出到实体外部,但同时也可以在实体内部引用该端口的信号。缓冲端口既能用于输出也能用于反馈。缓冲模式用于在实体内部建立一个可读的输出端口,例如计数器输出、计数器的现态用来决定计数器的次态。端口模式可用图下说明,图中方框代表一个设计实体或模块。INOUTINOUTBUFFER在VHDL设计中,通常将输入信号端口指定为输入模式,输出信号端口指定为输出模式,而双向数据通信信号,如计算机PCI总线的地址/数据复用总线,DMA控制器数据总线等纯双向的信号采用双向端口模式。从端口的名称、模式就能一目了然地知道信号的用途、性质、来源和去向。1.2、结构体结构体是用来描述设计实体的内部结构与实体端口间的逻辑关系的,在电路上相当于器件的内部电路结构。结构体是对实体功能的具体描述,因此它一定要跟在实体的后面。结构体一般由两大部分组成:1.信号声明部分,用于结构体内部使用的信号名称及信号类型的说明;2.功能语句部分,描述实体的逻辑行为。结构体的语句格式为:ARCHITECTURE结构体名OF实体名IS[定义语句]BEGIN功能描述语句;END结构体名;1.2.1结构体名结构体名由设计者自行定义,OF后面的实体名指明了该结构体所对应的是哪个实体。有些设计实体有多个结构体,这些结构体的结构体名不可相同。1.2.2结构体的信号定义语句结构体的信号定义语句必须放在关键词ARCHITECTURE和BEGIN之间,用于对结构体内部将要使用的信号、常数、数据类型、元件、函数和过程加以说明。需要注意的是实体说明中定义的信号是外部信号,而结构体定义的信号为该结构体的内部信号,它只能用于这个结构体中。结构体中的信号定义和端口说明一样,应有信号名称和数据类型定义。因为它是内部连接用的信号,因此不需要方向说明。ARCHITECTURErtlOFmujISSIGNALs1:BITSIGNALs2,s3:STD_LOGIC_VECTOR(0TO3);┇BEGIN┇ENDrtl;实体名结构体名功能描述语句结构体信号定义语句例:结构体的信号定义实例。1.2.3结构体功能描述语句结构体功能描述语句位于BEGIN和END之间,具体地描述了构造体的行为及其连接关系。结构体的功能描述语句可以含有5种不同类型的并行语句,如图所示。每一语句结构内部可以使用并行语句,也可以是顺序语句。结构体(ARCHITECTURE)说明语句功能描述语句块语句(BLOCK)进程语句(PROCESS)信号赋值语句子程序调用语句元件例化语句结构体构造图:例题演示例1:用VHDL文本输入法描述2输入与门,并仿真验证其功能。具体演示见操作。libraryieee;useieee.std_logic_1164.all;entityand_2isport(a,b:instd_logic;c:outstd_logic);endand_2;architectureoneofand_2isbeginprocess(a,b)beginc=aandb;endprocess;endone;2、VHDL的基本语法VHDL是一种计算机编程语言,其语言要素包括数据对象、数据类型和运算操作符。2.1数据对象数据对象包括变量、信号和常数。(1)变量变量是局部量,只能用于进程、函数和子程序中,任何变量都要声明后才能使用。其语法格式为:variable变量名:数据类型:=初始值;例:variableA:bit;variableB:boolean:=false;variableD,E:integer:=2;为变量取名时,须遵循以下规则:①以英文字母开头。②英文字母,数字和下划线是有效的字符。③关键字不能作为标识符使用。见P231.变量赋值语句的格式为:变量名:=表达式;例:A:=‘0’;D:=5;(2)信号VHDL中的信号类似于硬件电路中的连接线。信号只能在结构体中声明(不能在进程和子程序中声明),信号语句包括信号声明语句和信号赋值语句。信号声明语句的其格式为:signal信号名:数据类型:=初始值;例:signalX,Y:integer:=3;信号赋值语句的格式为:信号名=表达式;例:X=5;例:信号声明与赋值语句举例。architectureoneofhadderissignaly:bit;beginy=AxorB;S=y;y=AandB;C0=y;endone;(3)常数VHDL设计实体中的常数可以使程序容易阅读和修改。定义常数后,程序中所有用到该常数值的地方都用定义的常数名表示,需要修改该常数时,只要在该常数名定义处修改即可。常数定义的语法格式为:constant常数名:数据类型:=表达式;例:constantDelay:time:=25ns;2.2数据类型VHDL有多种标准的数据类型,并且允许用户自定义数据类型。一、标准数据类型VHDL标准程序包STANDARD中定义,在应用中自动包含进VHDL的源文件,不需要USE语句显示调用。标准数据类型说明如下。1.整数(INTEGER)整数包括正、负整数和零,可以使用预定义运算操作符,如加“+”、减“-”、乘“×”、除“÷”进行算术运算。在VHDL语言中,整数的表示范围为-2147483647~2147483647,即从-(231-1)到(231-1)。2.实数(REAL)实数的定义值范围为-1.0E+38~+1.0E+38。实数有正负数,书写时一定要有小数点。例如:-1.0,+2.5,-1.0E+383.位(BIT)位值用字符‘0’或者‘1’(将值放在引号中)表示。4.位矢量(BIT_VECTOR)位矢量是用双引号括起来的一组数据。例如:“001100”,X“00bb”。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线最形象也最方便,在VHDL程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:SIGNALS:BIT_VECTOR(15DOWNTO0);SIGNALY:BIT_VECTOR(0TO7);5.布尔量(BOOLEAN)取值是TRUE或者FALSE。6.字符(CHARACTER)字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘a’。一般情况下VHDL对大小写不敏感,但对字符量中的大小写则认为是不一样的。例如,‘B’不同于‘b’。字符量中的字符可以是从a到z中的任一个字母,从0到9中的任一个数以及空格或者特殊字符,如$,@,%等等。包集合standard中给出了预定义的128个ASCⅡ码字符,不能打印的用标识符给出。字符‘1’与整数1和实数1.0都是不相同的,当要明确指出1的字符数据时,则可写为:CHARACTER(‘1’)。7.字符串(STRING)字符串是由双引号括起来的一个字符序列,也称字符矢量或字符串组。字符串常用于程序的提示和说明。字符串举例如下:VATIABLEstring_1:STRING(0TO3);┇string_1:=“abcd”;8.时间(TIME)时间是一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位置。