VHDL结构及语言要素
- 格式:ppt
- 大小:346.00 KB
- 文档页数:10
VHDL语言的基本要素一、数据对象VHDL语言的主要数据对象有信号,变量,常量。
信号—信号是电路中的物理量,对应于电路的连线、节点;信号说明全局量,用于描述中的构造体(Architecture), 实体(Intity),程序包(package)。
变量—变量是程序运算中的中间量,并不对应电路中的物理量。
变量说明局部量,用于进程语句(process), 函数(Function), 过程(procedure)。
常量—常数也不对应电路中的物理量,当常量说明全局量,在构造体(Architecture), 实体(Intity),程序包(package),进程语句(process), 函数(Function), 过程(procedure)中均可使用。
数据对象的定义格式:signal 信号名:数据类型,约束条件,表达式Variable 变量名:数据类型,约束条件:=表达式Constant 常量名:数据类型,约束条件:=表达式例如:Variable count:INTEGER RANGE 0 TO 255:=10Constant Daly:Time:=100ns信号代入和变量赋值的区别:两者形式不同,操作过程也不相同。
变量赋值符“:=”,信号的代入符“<=”。
在变量的赋值语句中,该语句一当执行,其值立即将赋予变量;而信号的代入,其语句执行后不会立即使信号发生代入,在下条语句执行时,仍使用原来的信号值,如进程语句中的敏感表的信号代入就是如此。
二、数据类型VHDL语言中的数据类型,一般而言可分为:标量类型和组合类型。
在实际使用中,也可分成予定义类型和用户定义类型。
VHDL语言是强类型的语言,主要可按如下分类和变换处理。
①标准数据类型⑴整数⑵实数(浮点数)-1.0E+38~+1.0E38 ⑶位bit(0,1)⑷位矢量⑸布尔量,“假”,“真”⑹字符(ASCⅡ)字符⑺时间⑻错误等级⑼自然数(大于等于0的整数)⑽字符串(字符矢量)②用户定义的数据类型TYPE 数据类型名{数据类型名} 数据类型定义⑴枚举类型⑵整数类型⑶实数类型⑷数组类型⑸存取类型⑹文件类型⑺记录类型⑻时间类型③用户定义子类型SUBTUPE 子类型名IS 数据类型名[范围]例:SUBTYPE digit is INTEGER RANGE 0 TO 9④数据类型转换数据类型的变换函数通常由“STD_LOGIC_1164”,“STD_LOGIC_ARITH”,“STD_LOGIC_UNSIGNED”的程序包提供例如,在STD_LOGIC_1164程序包中,TO_STD LOGIC VECTOR(A) 由BIT_VECTOR转换为STD_LOGIC_VECTORTO_BITVECTOR(A) 由STO_LOGIC_VECTOR转为BIT_VECTORTO_STDLOGIC(A) 由BIT转换为STD_LOGICTO_BIT(A) 由STD_LOGIC转换成BIT signal a: BIT_VECTOR(11 DOWNTO 0)signal b: STD_LOGIC_VECTOR(11 DOWNTO 0)a<=X”A8” 十六进制值可赋予位矢量b<=X”A8” 语法错,十六进制不能赋予.STD 矢量b<=TO_STDLOGICVECTOR(X“AF7”)b<=TO_STDLOGICVECTOR(O“5177”)八进制变换b<=TO_STDLOGICVECTCR(B“1010_1111_0111”)下表中也给出一些典型的类型变换函数三、运算符运算符的优先级如下表所示:运算符的优先级例如,并置运算符的使用:tmp_b<=b AND (en&en&en&en) y <= a & tmp_b第一个语句表示b 的4位位矢量由en 进行选择 得到一个4位位矢量输出第二个语句表示4位位矢量a 和4位位矢量b 再 次连接(并置)构成8位的位矢量y 输出 右图所示为并置运算符操作的电路示意。
VHDL简介——王春桃内容提要VHDL程序结构VHDL基本语法总结 VHDL语言要素VHDL设计常见错误VHDL程序结构第二章VHDL程序的基本结构一个完整的VHDL语言程序通常包含实体(Entity)、结构体(Architecture)、配置(Configuration)、)包集合(Package)、库(Library)5个部分。
VHDL基本结构实体和结构体是最基本的两个组成部分,两者配合可以组成简单的VHDL文件。
一个可综合的VHDL描述的的最小和最基本的逻辑结构中,IEEE标准库说明、实体和结构体是最基本的和不可缺少的三个部分,其他的结构层次可根据需要选用。
VHDL 基本结构VHDL 设计VHDL 文件程序包(Packages )声明在设计或实体中将用到的常数数据类型声明在设计或实体中将用到的常数,数据类型,元件及子程序等实体(Entities )声明到其他实体及其结构体A hit t 他设计的接口,即定义本设计的输入/出端口(Architectures )定义了实体的实现。
即本设计的输出端电路的具体描述一、实体(Entity)实体(VHDL表达的所有设计均与实体有关,实体是设计中最基本的模块。
设计的最顶层是顶层实体。
如果设计分层次,那么在顶级实体中将包含较低级别的实体那么在顶级实体中将包含较低级别的实体。
实体中定义了该设计所需的输入/输出信号,信号的输入输出类型被称为端模式,同时,/类型被称为端口模式,同时,实体中还定义他们的数据类型。
实体(Entity)实体作为个实体的组部分其功能这个实体作为一个设计实体的组成部分,其功能是对这个设计实体与外部电路进行接口描述实体是设计实体的表层设计单元,实体说明部分规定了设计单元的输入输出接口信号或引脚,它是设计实体对外的一个通信界面。
就个设计实体而言外界所看到的仅仅是它的界面上的 就一个设计实体而言,外界所看到的仅仅是它的界面上的各种接口。
设计实体可以拥有一个或多个结构体,用于描述此设计实体的逻辑结构和逻辑功能。
第5章 VHDL 基本结构与语法本章通过几个例题介绍VHDL 语言的基本结构和语法规则5.1 VHDL 基本结构一个相对完整的VHDL 设计由以下四部分组成:(1) 库LIBRARY 、程序包PACKAGE :库用于存储预先完成的程序包和数据集合体;程序包用于声明在设计中将要用到的常数、数据类型、元件及子程序等。
(2) 实体ENTITY :定义设计的输入输出端口。
(3) 结构体ARCHITECTURE :定义实体的实现,即电路的具体描述。
可有多个结构体,但只有一个起作用。
(4) 配置CONFIGURA TION :为实体选定某个特定的结构体。
以上四个部分不是每个VHDL 程序必须的,但每个VHDL 程序至少含有1个实体和1个结构体。
1个实体可有多个结构体,通过配置选择1个结构体对实体起作用,其他结构体不起作用。
当只有1个结构体时不要实体。
【例5-1】2选1多路数据选择器,其功能见图5-1。
功能描述为当S=0时A 送Y , S=1时B 送Y 。
其对应的VHDL 描述为:ENTITY mux21a IS --给出实体名mux21a 和管脚定义 PORT (a,b : IN BIT ;s : INBIT ; y : OUT BIT );END mux21a ;ARCHITECTURE one OF mux21a IS --结构体,描述电路器件的内部逻辑 BEGIN功能或电路结构。
y <=a WHEN s=’0’ ELSE b;END one ;综合后结构体的门电路见图5-3。
5.1.1 实体ENTITY :定义本设计的输入输出端口/信号。
图5-1 例5-1功能示意图图5-3 例5-1综合后的门电路A S约定:[]表示为可选项;--开始的语句为注释,不参与编译和综合;黑体单词为保留字。
1、实体框架:ENTITY实体名IS--此处无分号[GENERIC(常数名:数据类型[:设定值]);]PORT - -端口定义(端口1:端口模式端口类型;…端口n:端口模式端口类型- -最后一个无分号);END[ENTITY] 实体名;注:END中带ENTITY、ARCHITECTURE为IEEESTDl076_1993版的语法要求,不带为IEEESTD1076 1987的语法要求。
VHDL语⾔详解第⼆章 VHDL程序基础2.1 VHDL程序结构2.2 VHDL的语⾔元素2.3 VHDL的基本描述语句2.4 VHDL结构体的三种描述⽅法2.1 VHDL程序结构2.1.1 VHDL程序基本结构2.1.2 VHDL结构体的基本⼦结构2.1 VHDL程序结构2.1.1 VHDL程序基本结构例1 ⼀个2输⼊的与门的逻辑描述LIBRARY ieee; --库说明语句USE ieee.std_logic_1164.ALL; --程序包说明语句ENTITY and2 ISPORT(a,b : IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISBEGINy<=a AND b;END and2x;实体部分结构体部分VHDL设计⽂件的两个基本组成部分实体(Entity)结构体(Architecture)配置(Configuration)包集合(Package)库(Library)⼀个完整的VHDL程序库⽤于存放已编译的实体,结构体,包集合和配置2.1.1 VHDL程序基本结构实体部分描述设计系统的外部接⼝信号(即输⼊/输出信号)结构体⽤于描述系统的内部电路配置⽤于从库中选取所需元件安装到设计单元的实体中包集合存放各设计模块能共享的数据类型,常数,⼦程序等2.1.1.1 实体(ENTITY)实体的⼀般格式为:ENTITY 实体名 IS[类属参数说明];[端⼝说明];END;ENTITY,IS,END是VHDL的关键字(保留字).实体中的每⼀个I/O信号被称为端⼝,其功能对应于电路图符号的⼀个引脚.端⼝说明则是对⼀个实体的⼀组端⼝的定义,即对基本设计实体与外部接⼝的描述.端⼝是设计实体和外部环境动态通信的通道.ayand2b类属参数说明是可选部分.如果需要,可使⽤以"GENERIC"语句来指定该设计单元的类属参数(如延时,功耗等).实体名,端⼝名等均应为符合VHDL命名规则的标识符.端⼝说明的⼀般格式为:PORT(端⼝名{,端⼝名}:端⼝模式数据类型;端⼝名{,端⼝名}:端⼝模式数据类型);端⼝模式⽤来说明数据传输通过该端⼝的⽅向.端⼝模式有以下⼏类:IN(输⼊):仅允许数据流进⼊端⼝.主要⽤于时钟输⼊,控制输⼊,单向数据输⼊.OUT(输出):仅允许数据流由实体内部流出端⼝.该模式通常⽤于终端计数⼀类的输出,不能⽤于反馈.BUFFER(缓冲):该模式允许数据流出该实体和作为内部反馈时⽤,但不允许作为双向端⼝使⽤.INOUT(双向):可以允许数据流⼊或流出该实体.该模式也允许⽤于内部反馈.如果端⼝模式没有指定,则该端⼝处于缺省模式为:IN .数据类型原则上可以是任何标准的数据类型和⽤户⾃定义类型.PORT (a,b : IN STD_LOGIC;y : OUT STD_LOGIC);inininoutoutbufferinoutmodemode模式及其信号源类属参数说明的格式为:GENERIC(端⼝名{,端⼝名}:[IN] ⼦类型 [:=初始值]{;端⼝名{,端⼝名}: [IN] ⼦类型 [:=初始值]} );例2:加⼊类属说明的2输⼊的与门的逻辑描述ENTITY and2 ISGENERIC (rise,fall:time);PORT(a,b: IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISSIGNAL u: BIT;BEGINu<=a AND b;y<=u after(rise) when u='1' else u after(fall) ;END and2x;例3: 四位加法器实体说明程序ENTITY add4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);Ci: IN STD_LOGIC;Sum: OUT STD_LOGIC_VECTOR(3 downto 0);Co: OUT STD_LOGIC);END add4;由实体说明画出四位加法器add4的电路图如下所⽰.add4a[3..0]b[3..0]Sum[3..0]CiCo2.1.1.2 结构体(ARCHITECTURE )结构体的⼀般格式如下:ARCHITECTURE 结构体名 OF 实体名 IS[结构体说明部分];BEGIN[并发处理语句];END 结构体名;结构体说明是指对结构体需要使⽤的信号,常数,数据类型和函数进⾏定义和说明.并发处理语句位于BEGIN和END之间,这些语句具体地描述了构造体的⾏为.并发处理语句是功能描述的核⼼部分,也是变化最丰富的部分.并发处理语句可以使⽤赋值语句,进程语句,元件例化语句,块语句以及⼦程序等.需要注意的是,这些语句都是并发(同时)执⾏的,与排列顺序⽆关.2.1.1.3 配置(CONFIGURATION)配置的基本格式为:CONFIGURATION 配置名 OF 实体名 IS[配置说明];END 配置名;配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系.设计者可以利⽤配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某⼀个实体时,可以利⽤配置选择不同的构造体进⾏性能对⽐实验,以得到性能最佳的构造体. CONFIGURATION 配置名 OF 实体名 ISFOR 选配结构体名END FOR;END 配置名;配置语句根据不同情况,其说明语句有简有繁.最简单的缺省配置格式为:例4:加⼊了配置的4位等值⽐较器设计⽂件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comp4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);y: OUT STD_LOGIC);END comp4;--结构体 1:ARCHITECTURE behavior OF comp4 ISBEGINComp: PROCESS(a, b)BEGINIF a=b THENy<='1';ELSEy RETURN '0';WHEN 'Z'=> RETURN 'Z';END CASE;END invert;END BODY;⼀个包集合说明⾄多可以带⼀个包体,包体和包头使⽤相同的名字.包体的内容是基本说明和⼦程序体说明.但要注意,若包集合中含有⼦程序说明时,必须将⼦程序放在对应的包体中.包体中的⼦程序及其相应的说明是专⽤的,不能被其它VHDL单元所引⽤;⽽包集合中的说明是公⽤的,它可以独⽴地编译并插⼊设计库中.包集合体是次级设计单元,只有在其对应的主设计单元编译并插⼊设计库之后,才可独⽴地编译并插⼊到设计库中.程序包举例(见vhdl程序example )2.1.1.5 库(LIBRARY)库是⽤来放置可编译的设计单元的地⽅,通过其⽬录可查询和调⽤. VHDL中的库⼤致可归纳为5种:IEEE库,STD库,ASIC⽮量库,WORK库和⽤户定义库.IEEE库.常⽤的资源库.IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的⼀些包集合,如STD_LOGIC_ARITH(算术运算库),STD_LOGIC_UNSIGNED等.STD库.VHDL的标准库.库中存放有称为"standard"的标准包集合,其中定义了多种常⽤的数据类型,均不加说明可直接引⽤.STD 库中还包含有称为"textio"的包集合.在使⽤"textio"包集合中的数据时,应先说明库和包集合名,然后才可使⽤该包集合中的数据. ASIC⽮量库.在VHDL语⾔中,为了进⾏门级仿真,各公司可提供⾯向ASIC的逻辑门库.在该库中存放着与逻辑门⼀⼀对应的实体.为了使⽤⾯向ASIC的库,对库进⾏说明是必要的.WORK库.WORK库是现⾏作业库.设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中.WORK库对所有设计都是隐含可见的,因此在使⽤该库时⽆需进⾏任何说明.⽤户定义库.⽤户定义库简称⽤户库,是由⽤户⾃⼰创建并定义的库.设计者可以把⾃⼰经常使⽤的⾮标准(⼀般是⾃⼰开发的)包集合和实体等汇集成在⼀起定义成⼀个库,作为对VHDL标准库的补充.⽤户定义库在使⽤时同样要⾸先进⾏说明.上述5类库中,除了STD库和WORK库之外的其它库均为资源库.资源库是存放常规元件和标准模块的库,使⽤时需预先说明.库说明语句的语法形式为:LIBRARY 库名; --说明使⽤什么库USE 包集合名; --说明使⽤库中哪⼀个包集合及包集合中的项⽬(如过程名,函数名等)包集合名最多为三个层次,即 :library-name. packge-name. item-nameLIBRARY 语句和USE语句的作⽤范围:仅限于紧跟起后的实体和结构体.2.1.2 VHDL结构体的基本⼦结构在规模较⼤的电路设计中,整个电路将被分成若⼲个相对独⽴的模块来描述.这样,⼀个结构体可以⽤⼏个⼦结构,即相对独⽴的⼏个模块来构成.VHDL语⾔有以下3种形式的⼦结构描述语句:BLOCK 语句结构PROCESS 语句结构SUBPROGRAMS 结构2.1.2.1 块( BLOCK )BLOCK语句的语法格式为:块标号:BLOCK [(块保护条件)][说明语句];BEGIN[并发处理语句];END BLOCK 标号名;保护条件是可选项,它是⼀个布尔表达式.如果有保护条件,则该条件应⽤圆括号括起来,放在BLOCK之后.保护条件的作⽤是:只有当其为真时,该块中的语句才被启动执⾏;否则,该块中的语句不被执⾏.BLOCK语句中所描述的各个语句是可以并⾏执⾏的,它和书写顺序⽆关.⼀个⼤规模的电原理图通常可以分割成多张⼦原理图,以便于设计和存档.同样,在VHDL程序设计中,构造体对应整个电原理图,⽽构造体可由多个BLOCK块组成,每⼀个BLOCK块则对应⼀张⼦原理图.电原理图的分割关系和VHDL程序中⽤BLOCK块分割构造体的关系是⼀⼀对应的.例7 ⽤BLOCK语句描述2选1电路的程序.ENTITY mux2_1 ISPORT(d0, d1, sel : IN STD_LOGIC;q :OUT STD_LOGIC);END mux2_1;ARCHITECTURE amux OF mux2_1 ISSIGNAL tmp1,tmp2,tmp3 : STD_LOGIC;BEGINcale: BLOCKBEGINtmp1<=d0 AND sel;tmp2<=d1 AND (not sel);tmp3<=tmp1 OR tmp2;q<=tmp3;END BLOCK cale;END amux;上述结构体中只有⼀个 BLOCK块,若电路复杂时可由⼏个BLOCK块组成.2选1 数据选择器d1d0qselu2u1u3tmp1tmp2tmp3例8 ⽤带保护条件的BLOCK语句描述⼀个锁存器的结构.ENTITY latch ISPORT(d, clk : IN STD_LOGIC;q, qn : OUT STD_LOGIC);END latch;ARCHITECTURE latch_a OF latch ISBEGINg1:BLOCK(clk='1')BEGINq<=guarded d after 5ns;qn<=guarded not(d) after 7ns;END BLOCK g1;END latch_a;qnqQD Cdclk在BLOCK块中的两个信号传送语句都写有前卫关键词guarded,表明只有clk='1'为真时,这两个语句才能执⾏.(注意 :这⾥的综合⼯具不⽀持 guarded block 语句和 after 短语.)2.1.2.2 进程( PROCESS )PROCESS语句是⼀种并发处理语句,在⼀个构造体中多个PROCESS语句可以同时并发运⾏.因此,PROCESS语句是VHDL中描述硬件系统并发⾏为的最常⽤,最基本的语句.进程语句的⼀般格式为;[进程名:] PROCESS (敏感信号表)进程说明语句BEGIN顺序描述语句;END PROCESS [进程名];例9 利⽤PROCESS语句设计与⾮门电路.nandx: PROCESS (a, b)BEGINy<=a NAND b AFTER 10ns;END PROCESS nandx;敏感信号表所标明的信号是⽤来启动进程的.敏感信号表中的信号⽆论哪⼀个发⽣变化(如由'0'变'1'或由'1'变'0' )都将启动该PROCESS语句.⼀旦启动后, PROCESS中的语句将从上⾄下逐句执⾏⼀遍.当最后⼀个执⾏完毕以后,即返回到开始的PROCESS语句,等待下⼀次启动.因此,只要PROCESS中指定的信号变化⼀次,该PROCESS语句就会执⾏⼀遍. PROCESS内部各语句之间是顺序关系 .在系统仿真时, PROCESS语句是按书写顺序⼀条⼀条向下执⾏的.⽽不象BLOCK中的语句可以并⾏执⾏.若构造体中有多个进程存在,各进程之间的关系是并⾏关系 ;进程之间的通信则⼀边通过接⼝由信号传递,⼀边并⾏地同步执⾏.2.1.2.3 ⼦程序( SUBPROGRAM )⼦程序的特点:⼦程序可以在结构体或程序包的任何位置被调⽤,⽽且可以反复调⽤.⼦程序是⼀个⾮重⼊的程序,即⼦程序返回后才能再被调⽤.在调⽤时⼦程序⾸先要进⾏初始化,执⾏结束后⼦程序终⽌;再调⽤时要再进⾏初始化.因此,⼦程序内部的值不能保持.VHDL的⼦程序具有可重载性,即允许有许多重名的⼦程序,但这些⼦程序的参数类型和返回数值类型是不同的.VHDL的⼦程序有两种类型:过程(PROCEDURE)函数(FUNCTION)过程(PROCEDURE)过程语句的结构:PROCEDURE 过程名(参数1;参数2; (I)[定义语句];BEGIN[顺序处理语句];END 过程名;过程语句的调⽤格式:过程名(实际参数表);例10 设计⼀个从两个整数中求取最⼤值的过程.PROCEDURE max(a, b: IN INTEGER;y: OUT INTEGER) ISBEGINIF (ay<=b;ELSEyb) THENtmp:=a;ELSEtmp:=b;END IF;RETURN tmp;END max;函数的参数均为输⼊参数.函数调⽤返回⼀个指定数据类型的值.例11 在结构体中调⽤求最⼤值的函数.LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.newlib.ALL;ENTITY dpeak ISPORT(clk, set : IN STD_LOGIC;date : IN STD_LOGIC_VECTOR(5 downto 0);dout : OUT STD_LOGIC_VECTOR(5 downto 0));END dpeak;ARCHITECTURE rtl OF dpeak ISSIGNAL peak : STD_LOGIC_VECTOR(5 downto 0);BEGINdout<=peak;PROCESS (clk)BEGINIF (clk'event and clk='1') THENIF (set='1') THENpeak<=date;ELSEpeak<= max(date,peak);END IF;END IF;END PROCESS;END rtl;2.2 VHDL的语⾔元素2.2.1 标识符2.2.2 数据对象2.2.3 数据类型2.2.4 运算符与操作符2.2.5 属性标识符规则:标识符规则是在书写VHDL程序时的⼀般⽂字规则.基本标识符由字母,数字以及下划线字符组成,且具有以下特征要求:●第⼀个字符必须是字母;●最后⼀个字符不能是下划线;●不允许连续两个下划线;●在标识符中⼤,⼩写字母是等效的.● VHDL中的注释⽂字⼀律为2个连续的连接线"--",可以出现在任⼀语句后⾯,也可以出现在独⽴⾏;● VHDL的保留字(关键字)不能⽤于标识符;2.2.1 标识符如下标识符是⾮法的:_ tx_clk8B10Blarge#numberlink__barselectrx_clk_例如:如下标识符是合法的:tx_clkThree_state_Enablesel7DHIT_1124--标识符必须起始于字母--只能是字母,数字,下划线--不能有连续两个下划线--关键字(保留字)不能⽤于标识符--最后字符不能是下划线2.2.2 数据对象在VHDL中,数据对象是可以赋予⼀个值的客体.常⽤的数据对象为常量,变量和信号,在使⽤前必须给予说明.●常量(CONSTANT)常量是指在设计描述中不会变化的值.在VHDL描述中,⼀般⽤常量名代替数值.常量说明语句的⼀般格式为:CONSTANT 常量名{,常量名}:数据类型 := 取值;例如: CONSTANT width : integer : = 8 ;常量所赋值和定义的数据类型应⼀致.常量⼀旦赋值就不能再改变.●变量(VARIABLE)变量是暂存数据的量.变量说明语句的格式是:VARIABLE 变量名{,变量名}:数据类型 [:=初始值];例如:VARIABLE count: INTEGER RANGE 0 TO 99 : =0变量是⼀个局部量 ,它只⽤于进程和⼦程序.变量必须在进程或⼦程序的说明区域中加以说明.变量赋值是直接的,⾮预设的 ,它在某⼀时刻仅包含⼀个值.变量的赋值⽴即⽣效,不存在延时⾏为.变量常⽤在实现某种运算的赋值语句中.赋值语句中的表达式必须与⽬标变量具有相同的数据类型.变量赋值语句格式为: ⽬标变量名 := 表达式;●信号(SIGNAL)信号是电⼦电路内部硬件实体相互连接的抽象表⽰.信号能够代表连线,也可内连元件,端⼝也是信号.信号说明语句的格式为:SIGNAL 信号名{,信号名} :数据类型 [:=初始值];例如: SIGNAL count: BIT_VECTOR(3 downto 0);信号包括I/O引脚信号以及IC内部缓冲信号,有硬件电路与之对应,故信号之间的传递有实际的附加延时.信号通常在构造体,包集合和实体中说明;信号不能在进程中说明(但可以在进程中使⽤).硬件中的信号总是同时⼯作的,即信号同时在各个模块中流动,这就是硬件电路的并发性 .HDL体现了实际电路中信号"同时"流动的这种基本特性.信号赋值语句格式为: ⽬标信号名 <= 表达式;赋值语句中的表达式必须与⽬标信号具有相同的数据类型.信号和变量的主要区别:1. 变量是⼀个局部量,只能⽤于进程或⼦程序中;信号是⼀个全局量,它可以⽤来进⾏进程之间的通信.2. 变量赋值⽴即⽣效,不存在延时⾏为;信号赋值具有⾮⽴即性,信号之间的传递具有延时性.4. 信号赋值可以出现在进程中,也可以直接出现在结构体中,但它们的运⾏含义不同:前者属顺序信号赋值,此时的赋值操作要视进程是否已被启动;后者属并⾏信号赋值,其赋值操作是各⾃独⽴并⾏发⽣的.3. 变量⽤作进程中暂存数据的单元;信号⽤作电路中的信号连线.5. 在进程中变量和信号的赋值形式与操作过程不同:在变量的赋值语句中,该语句⼀旦被执⾏,其值⽴即被赋予变量.在执⾏下⼀条语句时,该变量的值即为上⼀句新赋的值.在信号的赋值语句中,该语句即使被执⾏,其值不会使信号⽴即发⽣代⼊,在下⼀条语句执⾏时,仍使⽤原来的信号值.直到进程结束之后,所有信号赋值的实际代⼊才顺序进⾏处理.因此,实际代⼊过程和赋值语句的执⾏是分开进⾏的.如例12所⽰.例12 信号和变量值代⼊的区别举例PROCESS (a,b,c,d)BEGINd<=a;x<=b+d;d<=c;y<=b+d;END PROCESS;结果: x<=b+c;y<=b+c;PROCESS (a,b,c)VARIABLE d:std_logic_vector(3 downto 0);BEGINd:=a;x<=b+d;d:=c;y<=b+d;END PROCESS;结果: x<=b+a;y<=b+c;当进程运⾏时,信号赋值将⾃上⽽下顺序执⾏,但第⼀项赋值操作并不会发⽣,这是因为信号赋值是在进程结束时才起作⽤.因为在进程结束更新时,d的最后⼀个赋值为c ,因此执⾏结果为该式.2.2.3 数据类型VHDL是⼀种类型型很强的语⾔.对象的数据类型定义了该对象可以具有的值和对该对象可以进⾏的运算的限制.在VHDL中,这种限制是被强制执⾏的.VHDL提供了多种标准的数据类型.在VHDL描述中,每个信号,常量,变量都要指定它的数据类型,以确定它能保持那⼀类数据. VHDL对数据类型的定义相当严格,在进⾏赋值或变换过程中都要进⾏类型检查.VHDL不允许不同类型的数值相互赋值或使⽤类型不允许的运算符进⾏运算.这种特性可以帮助设计者在设计前期发现错误.标准数据类型⽤户⾃定义数据类型数据类型的转换1. 标准数据类型VHDL提供的10种标准数据类型.(2)Real(实数).取值范围为 -1.0E+38 ~ +1.0E+38.和整数⼀样,实数能被约束.由于实数运算需要⼤量的资源,因此综合⼯具常常并不⽀持实数类型.(3)Bit(位). 只有两种取值,即 0 和 1 ,可⽤于描述信号的取值.(4)Bit_Vector(位⽮量). 是⽤双引号括起来的⼀组数据,每位只有两种取值:0 和 1.在其前⾯可加以数制标记,如X(16进制),B(2进制,默认),O(8进制)等.位⽮量常⽤于表⽰总线的状态.(1)Integer(整数). 取值范围为 -(231-1)~(231-1).⼀个整数类型和要被综合进逻辑的信号或变量在其范围上应有约束.例如: variable a: integer range –255 to 255;整数可通过语句内带符号⽮量来表达给综合⼯具.(5)Boolean(布尔量). ⼜称逻辑量.有"真","假"两种状态,分别⽤TRUE和FALSE标记.⽤于关系运算和逻辑运算.(6)Character(字符).是⽤单引号括起来的⼀个字母,数字,空格或⼀些特殊字符(如$,@,%等).字符区分⼤,⼩写字母.(7)String(字符串).是⽤双引号括起来的⼀个字符序列.字符串区分⼤,⼩写字母.常⽤于程序的提⽰和结果说明等.(8)Time(时间).时间的取值范围从 -(231-1)~(231-1).时间由整数值,⼀个以上空格以及时间单位组成.常⽤的时间单位有:fs,ns,µs,ms,s,min,hr等.时间常⽤于指定时间延时和标记仿真时刻.上述10种数据类型是VHDL种标准的数据类型,在编程时可以直接引⽤.如果⽤户需使⽤其它的数据类型,则必须进⾏⾃定义.(9)Natural(⾃然数)和Positive(正整数).是整数类型的⼦类型.⾃然数取值范围为0 ~(231-1);正整数是⼤于 0 的整数.(10)Severity Level(错误等级).错误等级分为:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)四级,⽤于提⽰系统的错误等级.时间单位fs,ps,ns,µs,ms,sec,min,hr时间整数的⼦集:⾃然数取值范围为0 ~(231-1);正整数是⼤于0的整数⾃然数,正整数Note,warning,error,failure错误等级字符⽮量字符串ASCII字符字符逻辑"真" 或"假",⽤TRUE和FALSE标记布尔量位⽮量,⽤双引号括起来的⼀组数据位⽮量逻辑'0'或'1'位浮点数,取值范围: -1.0e+38 ~ 1.0e+38实数整数32位, 取值范围:-(231-1) ~ (231-1)整数含义数据类型标准数据类型IEEE库STD_LOGIC_1164程序包中定义的STD_LOGIC类型和STD_LOGIC_VECTOR类型.STD_LOGIC类型的数据可以具有九种取值,其含义如下:'U':初始值'X':不定态'0': 强制0'1': 强制1'Z': ⾼阻态'W':弱信号不定态'L':弱信号0'H':弱信号1'_':不可能情况(可忽略值)其中,"X"⽅便了系统仿真,"Z"⽅便了双向总线的描述.STD_LOGIC_VECTOR类型定义如下:TYPE STD_LOGIC_VECTOR IS ARRAY (NATURALRANGE ) OF STD_LOGIC;2. ⽤户⾃定义数据类型VHDL允许⽤户⾃⼰定义数据类型.常⽤的⽤户⾃定义数据类型主要有:(1)枚举(Enumerated)类型. 通过列举某类变量所有可能的取值来加以定义.对这些取值,⼀般使⽤⾃然语⾔中有相应含义的单词或字符序列来代表,以便于阅读和理解.⾃定义数据类型说明语句的⼀般格式是:TYPE 数据类型名 {,数据类型名} IS [数据类型定义];枚举类型定义的格式为:TYPE 数据类型名 IS (元素1,元素2,…);该数据类型括号中的值⾃左向右按升序排列,中间⽤逗号分隔.在VHDL中,对其中每⼀个元素都赋予⼀个位置编号,最左边的元素开始记为"0" ,向右依次递增"1" .这为"属性"提供了⼀个访问位置编号的机制.例如,在程序包STD_LOGIC_1164中对STD_LOGIC的定义为TYPE STD_LOGIC IS ( 'U' ,'X' ,'0' ,'1' ,'Z' ,'W' ,'L' ,'H' ,'_' );(2) 数组(ARRAY)类型. ⼜称为向量,是多个相同类型的数据集合.它可以是⼆维的和多维的.数组类型定义的格式为:TYPE 数据类型名 IS ARRAY (范围) OF 元素类型名;范围⼀项规定数组下标的类型和范围.默认的下标类型是整型,但也可以使⽤其它数据类型,这就需要在范围中标明下标的类型.例如:TYPE count1 IS ARRAY ( STD_LOGIC '_' DOWNTO 'U' )OF INTEGER;多维数组需要⽤两个以上的范围来描述,⽽且多维数组不能⽣成逻辑电路,因此只能⽤于⽣成仿真图形及硬件的抽象模型. (3) 纪录(RECORD)类型. 是多个不同类型的数据集合.纪录类型定义的格式为:TYPE 数据类型名 IS RECORD元素名: 数据类型名;元素名: 数据类型名;……END RECORD;纪录适⽤于描述总线,仿真等.对于记录类型的对象进⾏单元素赋值时,可在记录类型对象名后加点".",然后再加赋值元素的元素名.(4)时间(TIME)类型(物理类型).表⽰时间的数据类型,在仿真时是必不可少的.时间类型定义的⼀般格式为:TYPE 数据类型名 IS 范围;UNITS 基本单位;单位;END UNITS;例如:TYPE time IS range –1e18 TO 1e18;UNITS fs;ps=1000fs;ns=1000ps;µs=1000ns;ms=1000µs;set=1000ms;min=60set;hr=60min;END UNITS;这⾥的基本单位是"fs".时间是物理类型的数据,当然对容量,阻抗值也可以做定义.(5) ⼦类型(SYBTYPE).⼦类型是⼀个具有限制条件的类型,通常⽤来定义具有⼀定限制条件的基本类型的数据对象.⼦类型定义的⼀般格式为:SYBTYPE ⼦类型名 IS 数据类型名[约束范围];例如:如下 Byte 被定义作为⼀个⼦类型,⽽后数据对象被定义为从属于该⼦类型.SYBTYPE Byte IS Bit_Vector(7 downto 0);SIGNAL Byte1, Byte2:Byte;SIGNAL Data1, Data2:Byte;SIGNAL Addr1, Addr2:Byte;3. 数据类型的转换在VHDL程序中,不同类型的对象不能代⼊,因此要进⾏类型转换.类型转换的⽅法有:(1)类型标记法.⽤类型名称来实现关系密切的标量类型之间的转换.例如: VARIABLE x:INTEGER;VARIABLE y:REAL;使⽤类型标记(即类型名)实现类型转换时,可采⽤赋值语句:x :=INTEGER(y); y :=REAL(x).(2)类型函数法.VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作.常⽤的类型转换函数有:★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成INTEGER类型.★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型,UNSIGNED类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型.★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型.★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换BIT_VECTOR 类型.★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型.★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成STD_LOGIC_VECTOR类型.注意 :引⽤时必须⾸先打开库和相应的程序包.该函数由STD_LOGIC_UNSIGNED程序包定义该函数由STD_LOGIC_ARITH程序包定义以下函数由STD_LOGIC_1164程序包定义2.2.4 运算符与操作符VHDL中共有四类运算符:(1)算术运算符:包括⼀元算术运算符和⼆元算术运算符.⼀元算术运算符包括:+(正号),—(负号),ABS(求绝对值)⼆元算术运算符包括:+ ,— ,* ,/ ,MOD(求模),REM(求余),**(指数运算)(2)关系运算符:它包括:= ,/= ,=(3)逻辑运算符:包括⼀元逻辑运算符和⼆元逻辑运算符.⼀元逻辑运算符包括:NOT⼆元逻辑运算符包括:AND,OR,NAND,NOR,XOR(4)并置运算符:&(连接),⽤于将多个位连接成为位⽮量.例如:DBUS<=D0&D1&D2&D3,即DBUS= ,,<,/= ,= ;XOR,NOR,NAND,OR,AND .需要注意的是:在编写VHDL程序时,必须保证操作数的数据类型与运算符所要求的数据类型⼀致.VHDL中的操作符:● "" 符号: 在WHEN语句中出现,其含义是"THEN(则)".2.2.5 属性(Attributes)VHDL没有⼀般程序设计语⾔中那些运算类标准函数,取⽽代之的是多种能反映和影响硬件⾏为的属性.VHDL的属性可分为数值类,函数类,信号类,类型类和范围类等属性.属性的⼀般格式为:Object ′Attributes为获取硬件设计中的⼀些有关信息(各类项⽬特性)⽽定义的内部函数某⼀项⽬的属性或特征通常可以⽤⼀个值或⼀个表达式来表⽰;它可以通过VHDL的属性描述语句加以访问.1.数值类属性数值类属性⽤于返回数组,块,或⼀般数据的有关值,如边界,数组长度等.●对⼀般数据属性,返回函数的边界值.其格式为Object ′LEFT;Object ′RIGHT;Object ′HIGH;Object ′LOW;●对于数组的数值属性,返回数组的长度值.其格式为Object ′LENGTH;●对于块结构体的数值属性,返回块的信息.其格式为Object ′BEHAVIOR;Object ′STRUCTURE;例如:TYPE num IS ARRAY RANGE 7 DOWNTO 0;VARIABLE i1,i2,i3,i4,M: INTEGER;BEGINi1:=num ′LEFT; --i1取得num的左边界值 7i2:=num ′RIGHT; --i2取得num的右边界值 0i3:=num ′HIGH; --i3取得num的上限值 7i4:=num ′LOW; --i4取得num的下限值 0M:= num ′LENGTH;2.函数类属性函数类属性是以函数形式为设计⼈员提供数据类型,数组,信号的相关信息的.●数据类型的属性函数.利⽤数组属性可以获得数组的区间,该属性的格式为Object ′SUCC(X); --获取X的下⼀个值Object ′PRED(X); --获取X的前⼀个值Object ′LEFTOF(X); --获取X的左边值Object ′RIGHTOF(X); --获取X的右边值其中, "Object"为数据类型名,X为其中的⼀个元素.例如:TYPE time IS (year,month,day,hour,min,sec);则 time ′SUCC(hour); --获取元素hour的下⼀个值mintime ′LEFTOF(day); --获取元素day的左边值month●数组的属性函数.其格式为Object ′LEFT(n); --获取索引号为n的区间左端边界值Object ′RIGHT(n); --获取索引号为n的区间右端边界值Object ′HIGH(n); --获取索引号为n的区间⾼端边界值Object ′LOW(n); --获取索引号为n的区间低端边界值其中, "Object"为数组名;n为多维数组中所定义的多维区间的序号.默认值n=1,表⽰对⼀维空间进⾏操作.●信号的属性函数.利⽤信号属性可得到信号的⾏为和功能信息,其格式为Object ′EVENT; --反映信号的值是否变化,是,则返回为"真"Object ′ACTIVE; --反映信号是否活跃,是,则返回为"真"Object ′LAST_EVENT; --反映从最近⼀次事件到现在经过的时间,返回⼀个时间值Object ′LAST_VALUE; --反映信号变化前的取值,并将该历史值返回Object ′LAST_ACTIVE; --反映从最近⼀次活跃到现在经过的时间,返回⼀个时间值需要注意的是 :信号的事件(Event)和活跃(Active)是两个不同的概念,必须严格区分.信号的活跃定义为信号值的任何变化.信号值由1变为0是⼀个活跃,⽽从1变为1也是⼀个活跃,唯⼀的准则是发⽣了事情,这种情况被称为⼀个事项处理(Transaction).然⽽,信号的事件则要求信号值发⽣变化.信号值从1变为0是⼀个事件,但从1变为1虽是⼀个活跃却不是⼀个事件.所有的事件都是活跃,但并⾮所有的活跃都是事件.例如:利⽤函数信号属性检查信号的建⽴时间.LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff1 ISPORT(d,clk : IN STD_LOGIC;q : OUT STD_LOGIC);END dff1;ARCHITECTURE setup_time_check OF dff1 ISBEGINPROCESS(clk)BEGINIF(clk='1′) AND (clk ′EVENT) THENq5ns) --条件为真,向下执⾏REPORT "SETUP VIOLATION" --条件为假,报告错误信息: 建⽴时间不符合要求SEVERITY ERROR; --出错等级:ERROR。