2010HDL基础语法篇——VHDL2HDL基础语法篇——VHDLVHDL硬件描述语言1.1VHDL概述1.1.1VHDL的特点VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原语句,如if语句、子程序和函数等,便于阅读和应用。具体特点如下:1.支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下(top-down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。2.VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数据传送。利用单元(componet)、块(block)、过程(procure)和函数(function)等语句,用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文档资料的保存和广泛使用。3.VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。既支持预定义的数据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类型语言。4.数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构和行为状态。1.1.2VHDL语言的基本结构VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。但是VHDL毕竟是一种描述数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者感到枯燥无味,不得要领。较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整体的程序结构,再逐步介绍程序中的语法概念。一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路,或者是一个计数器,也可以是一个CPU。一般情况下,一个完整的VHDL语言程序至少要包含程序包、实体和结构体三个部分。实体给出电路单元的外部输入输出接口信号和引脚信息,结构体给出了电路单元的内部结构和信号的行为特点,程序包定义在设计结构体和实体中将用到的常数、数据类型、子程序和设计好的电路单元等。例1-1-1用VHDL语言描述一位全加器。一位全加器的输入信号是A,B,Ci,输出信号是S和Co。全加器的真值表如表1-1-1所列。表1-1-1全加器的真值表输入信号输出信号ABCiSCo00000001103HDL基础语法篇——VHDL010100110110010101011100111111一位全加器的逻辑表达式是:S=A⊕B⊕CiCo=AB+ACi+BCi全加器的VHDL程序的文件名称是fulladder.VHD,其中VHD是VHDL程序的文件扩展名,程序如下:LIBRARYIEEE;--IEEE标准库USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYfulladderIS--fulladder是实体名称PORT(A,B,Ci:INSTD_LOGIC;--定义输入/输出信号Co,S:OUTSTD_LOGIC);ENDfulladder;ARCHITECTUREaddstrOFfulladderIS--addstr是结构体名BEGINS=AXORBXORCi;Co=(AANDB)OR(AANDCi)OR(BANDCi);ENDaddstr;从这个例子中可以看出,一段完整的VHDL代码主要由以下几部分组成:第一部分是程序包,程序包是用VHDL语言编写的共享文件,定义在设计结构体和实体中将用到的常数、数据类型、子程序和设计好的电路单元等,放在文件目录名称为IEEE的程序包库中。第二部分是程序的实体,定义电路单元的输入/输出引脚信号。程序的实体名称fulladder是任意取的,但是必须与VHDL程序的文件名称相同。实体的标识符是ENTITY,实体以ENTITY开头,以END结束。其中,定义A、B、Ci是输入信号引脚,定义Co和S是输出信号引脚。第三部分是程序的结构体,具体描述电路的内部结构和逻辑功能。结构体有三种描述方式,分别是行为(BEHAVIOR)描述、数据流(DATAFLOW)描述方式和结构(STRUCTURE)描述方式,其中数据流(DATAFLOW)描述方式又称为寄存器(RTL)描述方式,例中结构体的描述方式属于数据流描述方式。结构体以标识符ARCHITECTURE开头,以END结尾。结构体的名称addstr是任意取的。4HDL基础语法篇——VHDL1.1.3VHDL语言的实体(ENTITY)说明语句实体是VHDL程序设计中最基本的组成部分,在实体中定义了该设计芯片中所需要的输入/输出信号引脚。端口信号名称表示芯片的输入/输出信号的引脚名,这种端口信号通常被称为外部信号,信号的输入/输出状态被称为端口模式,在实体中还定义信号的数据类型。实体说明语句的格式为:ENTITY实体名称ISGENERIC(常数名称1:类型[:=缺省值];常数名称2:类型[:=缺省值];…常数名称N:类型[:=缺省值];);PORT(端口信号名称1:输入/输出状态数据类型;端口信号名称2:输入/输出状态数据类型;…端口信号名称N:输入/输出状态数据类型);END实体名称;类属GENERIC常用来定义实体端口大小,数据宽度,元件例化数目等。一般在简单的设计中不常用。例1-1-2一个同步十六进制加法计数器,带有计数控制、异步清零、和进位输出等功能。电路有三个输入端和五个输出端,分别是时钟脉冲输入端CLK,计数器状态控制端EN,异步清零控制端Rd,四位计数输出端Q0,Q1,Q2,Q3和一个进位输出端Co。当计数器输出0000~1110时,Co=0,只有当计数器输出1111时,Co=1。电路的功能表如表1-1-2所示。表1-1-2同步十六进制加法计数器的功能表控制端工作状态CLKENRd××0异步清小提示:VHDL语言具有87标准与93标准两种格式,以上为VHDL的87标准,对于93标准要使用ENDENTITY实体名称;结束实体。注意为了保证代码的可综合性与通用性,最好采用87标准的VHDL格式,有些EDA工具不一定支持93标准的VHDL语言格式。(QuartusII支持VHDL93、87标准)小提示:VHDL每条语句是以分号“;”作为结束符的,并且VHDL对空格是不敏感的,所以符合之间空格的数目是可以自己设定的。可以按自己的习惯任意添加,增强代码可读性。5HDL基础语法篇——VHDL零上升沿11计数×01保持该设计的实体部分如下:ENTITYcntm16ISPORT(EN:INSTD_LOGIC;Rd:INSTD_LOGIC;CLK:INSTD_LOGIC;Co:OUTSTD_LOGIC;Q:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDcntm16;1.实体名称表示所设计电路的电路名称,必须与VHDL文件名相同,实体名称是“cntm16”,所存的VHDL文件名必须是“cntm16.VHD”。2.端口信号名称表示芯片的输入/输出信号的引脚名,这种端口信号通常被称为外部信号,端口信号名称可以表示一个信号,也可以表示一组信号(BUS),由数据类型定义,如EN,Rd,CLK,Co分别表示计数允许信号,异步清零信号,时钟输入信号和进位输出信号,Q是一组输出信号,用来表示四位同步二进制计数器的四位计数输出信号。3.端口信号输入/输出状态有以下几种状态:IN信号进入电路单元。OUT信号从电路单元输出。INOUT信号是双向的,既可以进入电路单元也可以从电路单元输出。BUFFER信号从电路单元输出,同时在电路单元内部可以使用该输出信号。4.端口数据类型(TYPE)定义端口信号的数据类型,在VHDL中,常用的端口信号数据类型如下:(1)位(BIT)型:表示一位信号的值,可以取值‘0’和‘1’,放在单引号里面表示,如X=‘1’,Y=‘0’。(2)位向量(BIT_VECTOR)型:表示一组位型信号值,在使用时必须标明位向量的宽度(个数)和位向量的排列顺序,例如:Q:OUTBIT_VECTOR(3downto0),表示Q3,Q2,Q1,Q0四个位型信号。位向量的信号值放在双引号里面表示,例如Q=“0000”;小提示:OUT与BUFFER信号的区别就在于信号是否往内部有反馈,将输出端口定义为BUFFER型,可以省去一个用于中间运算的一个临时信号,但是并不推荐这么做。6HDL基础语法篇——VHDL(3)标准逻辑位(STD_LOGIC)型:IEEE标准的逻辑类型,它是BIT型数据类型的扩展,可以取值‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’等。(4)标准逻辑位向量(STD_LOGIC_VECTOR)型:IEEE标准的逻辑向量,表示一组标准逻辑位型信号值。VHDL是与类型高度相关的语言,不允许将一种数据类型的信号赋予另一种数据类型的信号。除了上述介绍的数据类型外,还有其他多种数据类型用于定义内部信号和变量,请参见1-2节。1.1.4VHDL语言的结构体(ARCHITECTURE)结构体是VHDL程序设计中的最主要组成部分,是描述设计单元的具体结构和功能,在程序中,结构体放在实体的后面。每一个结构体都有名称,结构体的名称是由设计者任取的,结构体是以标识符ARCHITECTURE开头,以END结尾。结构体可以有三种描述方式,分别是行为(BEAVHER)描述方式、数据流(DATAFLOW)描述方式和结构(STRUCTURE)描述方式,其中数据流(DATAFLOW)描述方式又称为寄存器(RTL)描述方式。不同的结构体采用不同的描述语句。结构体的一般格式为:ARCHITECTURE结构体名OF实体名称IS说明语句BEGIN电路描述语句END结构体名;结构体说明语句是对结构体中用到的数据对象的数据类型、元件和子程序等加以说明。电路描述语句用并行语句来描述电路的各种功能,这些并行语句包括并行信号赋值语句、条件赋值(WHEN-ELSE)语句、进程(PROCESS)语句、元件例化(COMPONETMAP)语句和子程序调用语句等。小提示:结构体中定义的参数(信号,变量等)名称不能与其所属实体的端口名重名。结构体的结束语句也可以写成ENDARCHITECTURE结构体名,或者简写为END。小提示:相同类型(模型相同,数据类型相同)的端口可以写在同一行,如:ENTITYcntm16ISPORT(EN,Rd,CLK:INSTD_LOGIC;Co:OUTSTD_LOGIC;Q:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDcntm16;此外要注意,最后一个端口结尾没有分号!7HDL基础语法篇——VHDL例1-1-2设计程序的结构体部分如下:ARCHITECTUREcounstrOFcntm16ISBEGINCo=„1‟WHEN(Q=”1111”ANDEN=„1‟)ELSE„0‟;--条件赋值语句PROCESS(CLK,Rd)--PROCESS语句BEGINIF(Rd=„0‟)THEN--IF语句Q=”0000”;ELSIF(CLK‟EVENTANDCLK=„1‟)THEN--CLK上升沿计数IF(EN=„1‟)thenQ=Q+1;ENDIF;ENDIF;ENDPROCESS;ENDcounstr;结构体的名