资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,VHDL与数字电路设计,第1章 概 述,VHDL是VHSIC Hardware Description LanguageVHSIC硬件,描述语言)的首字母缩写,而VHSIC是Very High Speed Integrated,Circuits(超高速集成电路)的首字母缩写。,VHDL语言可以看作是下面几种语言的集成;,sequential language +,concurrent language +,net-list language +,timing specification +,waveform generation language VHDL,1987年12月正式成为IEEE标准,这个版本是IEEE Std 1076-,1987。,1993年的新版本为IEEE Std 1076-1993,是87版本的扩展版本。,VHDL可以描述数字硬件器件模型。这种模型指定器件的外部,视图以及一个或多个内部视图。硬件的内部视图指定其功能或结构,,而外部视图指定器件与其他模型的通信接口。图1-1说明了硬件器,件和相应的器件模型。,图1-1 器件与器件模型,数字,系统,系统,外部框架,内部框架,模型,器件,器件模型,器件到器件模型映射是一对多的,也就是说,硬件器件可以有,多个器件模型。图1-2说明有多个器件模型的硬件器件的VHDL框架,结构,每个器件模型代表一个实体。,图1-2 器件的VHDL框架结构,实体是实际器件的硬件抽象。每个实体采用一个模型,包括外,部框架结构和一个或多个内部框架结构。同时,一个器件可以用一,个或多个实体来描述。,器件,实体1,实体2,实体N,器件模型1,器件模型2,器件模型N,实际器件,VHDL框架,为了描述实体,VHDL提供了5种不同类型的结构,称为设计单,元:, 实体声明entity, 结构体architecture, 配置configuration, 程序包package, 库library,实体由实体声明和至少一个结构体组成。, 实体声明描述实体的外部视图,例如:输入和输出信号名称。, 结构体包括实体的内部描述,例如:一系列相互连接的实体,结构的元件,或是一系列代表实体行为的并行或时序语句。图1-3,表示了一个实体和一种可能的模型。, 配置声明用来生成实体配置。从跟实体有关的结构体中选出,一个结构体,与实体进行绑定。同时它也能将所选结构体中的元件,与其它实体进行绑定。一个实体可以有多个不同的配置。,图1-4表示了E1实体的配置。,数字系统的,硬件抽象,实体,声明,实体,模型,结构体,图1-3 实体及其模型,实体E1,BX,CX,实体E2,实体E3,M1,图1-4 实体E1的配置,E1_A1,E1_A2,E1_A3,E2_A1,E2_A2,E3_A1,E3_A3,E3_A2,结构体E1_A2 、E1_A3和E2_A1中分别有元件BX 、CX和,M1,其它结构体是没有任何层次的纯行为模型。结构体E1_A3绑定,到实体E1,结构体E2_A1绑定到实体E2,结构体E3_A2绑定到实,体E3。还有另一种类型的绑定,即结构体E1_A3中的元件CX绑定,到实体E2,结构体E2_A1中的元件M1绑定到实体E3。, 程序包声明集成了一系列相关的声明,包括类型声明、子,类型声明、子程序和元件的声明,这些声明可以被两个或多个设计,单元共享。一个程序包体包括程序包声明中声明的子程序的定义。, 库单元可独立存在于一个设计文件中,它存储被编译后的硬,件描述模型的局部。,图1-5表示了硬件器件的器件模型的VHDL根本结构框图。,库、程序包,配置Configuration,实体Entity,结构体,architecture,元件、进程或,其它并行结构,图1-5 VHDL根本结构示意图, 模型分析,VHDL语言描述的实体可以用分析器和仿真器来验证。分析器,和仿真器是VHDL系统的一局部。,验证过程的第一步就是分析。分析器读入包括一个或多个设计,单元的文件,并把它们编译成中间态的形式,存储到特定的设计库-,工作库(WORK)中。在编译过程中,分析器要验证语法,并进行静,态语义检查。,图1-6 编译过程,设计单元,VHDL,分析器,中间形式,WORK_LIB,LIB1,IEEE,STD,库,工作库WORK,VHDL设计文件,一个设计单元,-实体声明,-结构体,-配置声明,-程序包声明,-程序包体, 仿真,验证过程的第二步就是仿真。对于层次化实体的仿真,它的所,有底层元件必须是行为级描述。仿真可以在如下两种结构中进行:,实体声明和结构体对,配置,仿真之前需要做以下两步:, 细化过程(Elaboration Phase):在这个过程中,实体的层,次结构被扩展,链接,库中的元件被绑定到实体,顶层实体被细化,成由许多行为级构成的网络。同时,需要为信号、变量和常量声明,分配存储空间,为变量和常数赋初值,如果有显式说明的文件,该,文件将会被翻开。, 初始化过程(Initialization Phase):计算所有显式声明信号的,驱动器和有效值,给隐含信号赋值,此时进程也开始运行直到被挂,起,仿真时间设为0ns。,仿真是由事件驱动的。当事件发生的时候,原本要赋给这个信,号的值就赋给这个信号。如果信号的取值发生变化,并且那个信号,出现在进程敏感信号列表中,进程将被运行直到挂起。当异常发生,时,仿真停止。当VHDL系统实现或VHDL语言定义的最大仿真时间,到达时,异常声明发生。,第2章 根本语言要素,VHDL根本语言要素是数据对象、数据类型、各类操作数和运,算操作符。,VHDL是一种强类型语言,这意味着只有当操作数和结果的类,型按照一组规那么相匹配时,VHDL语言中的操作和赋值才是合法,的。,2.1 标识符,标识符的用法规定了VHDL书写符号的一般规那么。标识符可以,是常数、变量、信号、端口、子程序或参数的名字。,VHDL根本标识符的书写遵守如下规那么:,a. 有效字符: 英文字母(az, AZ) 、数字(09)和下划线,( _ )。,b. 标识符必须以英文字母开头。,c. 标识符中的英文字母不分大小写。,d. 必须是单一下划线“ _ , 且其前后都必须有英文字母或数,字。,比方:DRIVE_BUS RAM_address,VHDL语言定义了一系列保存关键字,保存关键字在VHDL语言,中有特定的意义,不能当一般标识符使用;,VHDL语言对空格不敏感;,每条VHDL语句以一个分号;结束;,注释前面要加两个连续的连字号,注释一直延续到一行末尾。,比方:- 这是实体声明,2.2 VHDL数据对象(DATA OBJECTS),数据对象是指装载指定类型值的容器。对象可以是信号、变,量、常数和文件。一旦一个对象被声明为某一类型,那么在类型声,明所界定的范围内可以对对象进行运算或操作。,(1) 常数 (CONSTANT),常数是一个恒定不变的值,如果作了数据类型和赋值定义,在,程序中就不能再改变。常数说明的一般格式如下:,constant 常数名:数据类型 :=表达式;,常数的使用规那么如下;,常数必须在程序包、实体、结构体、块、进程和子程序等设计,单元中对有关工程进行指定。,常数的使用范围取决于被定义的位置。定义在程序包中的常数,可由所在的任何实体和结构体中调用;定义在实体或进程内的常数,只能在该实体和进程中使用。,定义的常数数据类型必须与表达式的数据类型一致。,例如:,constant VCC:REAL:=5.0; -定义某一个恒定电源,constant DELAY:TIME:=25 ns; -定义某个模块延迟时间,constant NO_OF_INPUT:INTEGER;- 没有给常数赋值,称为,- 延迟常数,只能出现在程序包声明里,,- 而其常数值必须在程序包体里赋值。,(2) 变量 (VARIABLE),变量类型的对象也能够用来存储某种指定类型一个数值。变量,是一个局部量,用于在进程和子程序结构中作局部的数据存储。变,量的赋值立即发生,不存在任何延时。其格式如下:,variable 变量名: 数据类型 约束条件 := 表达式,变量的使用规那么如下:,a.变量不能用于在进程间传递数据。,b.变量不能用于硬件连线和存储元件。,c.仿真时,变量用于建模。,d.综合时,变量充当数据的暂存。,变量声明的例子如下;,variable a: INTEGER range 0 to 100:=10;,variable b: BIT_VECTOR(10 downto 0);,variable FOUND,DONE: BOOLEAN;,如果没有给变量赋初值,那么其初值为默认值。默认值为,TLEFT,T是对象类型,LEFT是该类型的预定的属性,它表示一,组属于T类型变量数组的最左值。在第二个语句中11个数组元素的,类型为位类型,其最左值为0,因此11个初值均为0,而在第三个,语句中的变量FOUND和DONE的初值被赋为false。,(3) 信号 (SIGNAL),信号是描述硬件系统的根本数据对象,是实体间动态数据交换,的手段。如硬件系统运行的并行性;信号传输过程中的惯性延迟特,性;多驱动源的总线行为等都能很好地描述。信号通常在程序包、,结构体和实体声明中使用,是全局量。,信号的定义格式:,signal 信号名:数据类型 约束条件:=表达式;,信号的使用规那么如下;,“:= 表示对信号直接赋初值,信号获得初值不产生延时。,“ 1, others = U);,信号声明与变量声明某些地方相似,但有许多不同之处。,它们的主要区别如下;,信号的赋值过程与赋值语句分开处理,执行赋值语句不会使,信号立即赋给,必须在进程结束后才能成为当前值;而变量的赋值,语句一旦执行,其值立即被赋予变量。,在进程中,信号可以列入敏感表,而变量不能列入敏感表。,在仿真过程中,变量使用很少的存储器,而为了调度安排和,处理信号属性,信号需要存储更多的信息。,信号可能需要使用WAIT语句来为执行相同迭代做信号赋值,的同步处理;而变量不存在这个问题。,特别要注意:不是所有的对象都用对象声明来产生的,实体端,口的所有对象都是信号对象,但它是默认的,不需要用对象声明来,产生。,2.3 VHDL数据类型 (DATA TYPES),VHDL是一种强类型语言,在运算关系与赋值关系中对操作数,的数据类型有严格要求。在数据对象的定义中,必不可少的就是为,定义的数据对象设定数据类型,并且每一个数据对象只能有一个数,据类型的值,该对象的赋值源是相同的数据类型。,VHDL提供了许多预定义的数据类型,各种预定义数据类型大,多数表达了硬件电路的不同特性。此外,用户还可以自定义数据类,型。这是VHDL语言的一大特色。,2.3.1 VHDL预定义类型,预定义数据类型是VHDL中最常用,最根本的数据类型。在使,用中它自动包含进VHDL的源文件,不必通过USE语句显式调用。,(1) 布尔类型 (BOOLEAN),在程序包STANDARD中定义的源代码是:,type BOOLEAN is (FALSE,TRUE);,布尔数据类型实质是一个枚举数据类型。如定义所示,其取值,只能为FALSE(伪)和TRUE(真)两者之一。综合器用一个二进制位表,示BOOLEAN型变量或信号。布尔量只能通过关系运算符获得,它,不属于数值因而不能用于运算。例如,X小于Y时,在IF语句中的关,系运算表达式(XY)的结果是布尔量TRUE,反之为FALSE。综合,器将其变为1或0信号值,对应于硬件系统中的一根线。,(2) 位类型 ( BIT ),在STANDARD中定义的源代码是:,type BIT is ( 0, 1 );,位数据类型取值只能是 1 或 0,通常用来表示信号的不同状,态。位数据类型的数据对象可以参与逻辑运算,运算结果仍是位数,据类型。VHDL综合器用一个二进制位表示BIT。,(3) 位矢量类型 (BIT_VECTOR),在程序包STANDARD中定义的源代码是:,type BIT_VECTOR is array (NATURAL range ) of BIT;,位矢量是基于位数据类型的数组,使用位矢量必须注明位宽。,例如: signal b: BIT_VECTOR (6 downto 0);,信号b被定义为一个具有7位位宽的矢量,它的最左位是b(6),最右位是b(0)。,(4) 字符类型 ( CHARACTER ),字符类型要用单引号来表示,包括英文字母(a z, A Z) 、数字 (0 9) 、空格及一些特殊字符。字符类型区分英文字母大小写。如A不同于a。,注意:在VHDL程序设计中标识符一般不分大小写,但用了单引号的字符那么区分大小写。,(5) 整数类型 (INTEGER),整数类型的数包括负整数、零和正整数。整数类型和算术整数,相似,可以使用预定义的运算操作符,如加、减、乘、除等进行算,术运算。但不能用于逻辑运算。在程序包中指定了整数的取值范围,是-(2 +1) (2 +1)。,VHDL仿真器通常将INTEGER类型作为有符号数处理,而综合,器将它作为无符号数处理。在使用整数时,VHDL综合器要求用,RANGE子句为所定义的数限定范围,然后根据所限定的范围来决,定表示此信号或变量的二进制数的位数。,例如: signal a: INTEGER range 0 to 7;,规定整数a的取值范围是0 7共8个值,可用3位二进制数来表,示,因此a将被综合成由3条信号线构成的信号。,(6) 自然数和正整数类型 (NATURAL和POSITIVE),自然数和正整数都是整数的子集。自然数是零和正整数;而正,整数包括大于零的整数,是自然数的子集。,31,31,(7) 浮点类型 (REAL),类似于数学上的浮点数。其取值范围为:,-1.010 +1.010 。,(8) 字符串类型 (STRING),字符串数据类型是用双引号引起来的字符串数组,一般用于程,序的提示和结果说明。字符串类型区分英文字母大小写。字符串文,字的例子如下:,“this is a test,“state “READ “ entered! -序列中的两个双引号符号代表一个双引号符号,(9) 时间类型 (TIME),在VHDL中,时间数据类型是唯一的预定义物理类型。完整的,时间类型包括整数和物理量单位,整数和单位之间至少留一个空,格,如33 ms、10 ns。,(10) 错误等级 (SEVERITY LEVEL),其定义为: type SEVERITY LEVEL is (NOTE, WARNING,38,38,ERROR,FAILURE);,错误等级又叫错误类型。在VHDL仿真器中,常用来指示设计,系统的工作状态。共有四种等级:NOTE(注意) 、WARNING(警告) 、,ERROR(出错)和FAILURE(失败)。,在仿真过程中,输出这四种值可向开发者提示系统当前的工作,情况。,2.3.2 IEEE标准数据类型,在IEEE库程序包STD_LOGIC_1164中,定义了两个非常重要,的数据类型,即标准逻辑位和标准逻辑矢量。在程序中使用此数据,类型前,需参加语句:,library IEEE;,use IEEE.STD_LOGIC_1164.all;,(1) 标准逻辑位类型 (STD_ULOGIC),在程序包STD_LOGIC_1164中定义的类型STD_ULOGIC为枚,举类型,其定义如下:,type STD_ULOGIC is ,U, - 未初始化,X - 强信号冲突未知,0 - 逻辑0强0,1 - 逻辑1强1,Z - 高阻态,W - 弱信号冲突不定,L - 弱信号0,H - 弱信号1,_ - 忽略无效,;,在仿真和综合中,STD_ULOGIC值非常重要,它可以使设计者,精确地模拟一些未知和高阻态的线路情况。对于综合器,高阻态和,忽略态可用于三态的描述。但就综合而言,STD_LOGIC型数据能,够在数字器件中实现的只有4种值,即0、1、_和Z。当然,这并不,等于说明其余的5种值不需要。所有9种值对于VHDL行为仿真都有,重要意义。,H,Vcc,L,W,0,1,X,Z,1,1,(2)标准逻辑矢量类型 (STD_LOGIC_VECTOR),STD_LOGIC_VECTOR是定义在STD_LOGIC_1164程序包中,的标准一维数组,数组中的每一个元素的数据类型都是上述定义的,标准逻辑位STD_LOGIC。其数据类型定义如下:,type STD_LOGIC_VECTOR is array (NATURAL range ),of STD_LOGIC;,在使用中,向标准逻辑矢量STD_LOGIC_VECTOR数据类型的,数据对象赋值的方式与普通的一维数组array是一样的,即必须严格,考虑位矢的宽度。同位宽和同数据类型的矢量间才能进行赋值。,描述总线信号,使用STD_LOGIC_VECTOR是最方便的,但要,注意总线中的每一根信号线都必须定义为相同的逻辑位数据类型,STD_LOGIC。,2.3.3 其它予定义标准数据类型,Synnopsys公司程序包,STD_LOGIC_ARITH中:, 无符号型UNSIGNED,定义如下:,type unsigned is arraynatural range of std_logic;,unsigned“1000= 8,最左位为最高位:,variable var : unsigned(0 to 10); -var(0) 是最高位,signal sig : unsigned(5 downto 0); -sig(5)是最高位, 有符号型SIGNED,定义如下:,type signed is arraynatural range of std_logic;,最高位为符号位,综合器认作补码。,signed“0101= 5,,signed“1011= -5,variable var :signed0 to 10; - var(0)是符号位。, 小整型SMALL_INT:0 to 1,2.3.4 用户自定义数据类型,(1) 自定义数据类型方式,VHDL允许用户自己定义新的数据类型,其定义数据类型是用,type类型定义语句和subtype子类型定义语句实现的。,type语句用法,type语句语法结构如下:,type 数据类型名 is 数据类型定义 of 根本数据类型;或,type 数据类型名 is 数据类型定义;,数据类型名由设计者自取;数据类型定义局部描述所定义的数,据类型的表达方式和表达内容;关键词of后的根本数据类型是指数,据类型定义中元素的根本数据类型,一般都是取预定义数据类型如,BIT、STD_LOGIC等。,例如:,type BYTE is array (0 to 7) of STD_LOGIC;,type COLOUR is (RED.GREEN,YELLOW,BLUE);, subtype语句用法,subtype子类型是type所定义的原数据类型(基类型)的一个子集,,它满足根本数据类型所有约束条件。,subtype语句格式如下:,subtype 子类型名 is 根本数据类型 range 约束范围;,子类型定义中的根本数据类型必须是预定义类型或在前面已通,过type定义的类型。例如;,subtype A is INTEGER range 0 to 7;,利用子类型定义数据对象,可以使程序提高可读性并更易处理,,其实质是有利于提高综合的优化效率。,( 2 ) 用户自定义数据类型,用户自定义数据类型有很多种,如枚举类型、整数和浮点类型、,数组类型和记录类型等。,枚举类型 (ENUMERATION type),枚举类型是一种特殊的数据类型,即把类型中的各个元素都列,举出来。这些元素包括标识符和字符文字。这种数据类型非常直观,方便,提高了程序的可读性。,其声明格式为;,type 数据类型名 is (元素 ) ;,在VHDL中,位、布尔变量及字符等许多常用的数据类型都是,在程序包中已定义的枚举型数据类型。如BIT的取值0和1是一种文,字,不能进行常规的数学运算,因而与普通的0和1不同。在综合过,程中,对此类枚举数据,都将转化成二进制代码。,例如:,type PCSTATE is (IDLE, BUSY, WRITE, READ, BACKOFF);,signal a, b : PCSTATE;,type LOGIC is (1, Z, U, 0);,signal S : LOGIC;,signal S1 : LOGIC range Z to U;,-隐含子类型声明,type MICRO_OP is (LOAD, STORE, ADD, SUB, MUL, DIV);,subtype ARITH_OP is MICRO_OP range ADD to DIV;,variable IC : MICRO_OP := STORE; -STORE是初值,variable ALU : ARITH_OP;,枚举类型的值称为枚举文字。在综合过程中, 枚举类型的枚举,文字的编码是自动默认的,即将最左边的枚举文字编码为0,后面,的依次加1,并把它转换成二进制代码。,例如,上面声明的PCSTATE枚举类型的值共有5种,所以其默,认二进制编码值为:,IDLE := “000; BUSY := “001; WRITE := “010;,READ := “011; BACKOFF := “100;,整数类型和浮点类型(INTEGERREAL TYPE),整数和浮点数类型在标准的程序包中已经有预定义。由于它们,的取值定义范围太大,综合器无法进行综合。因此,定义这两种数据,类型的数据对象必须由用户根据实际需要重新定义,并限定其取值,范围,从而提高芯片资源的利用率。,在实际应用中,VHDL仿真器通常将整数和浮点类型作为有符,号数处理,VHDL综合器对整数和浮点数的编码方法是;对用户定,义的数据类型和子类型中的正数编码为二进制原码;对负数编码为,二进制补码。 编码的位数只取决于用户定义的数值的最大值。在综,合中,对浮点数先转换成相应大小的整数。因此在使用整数时,,VHDL综合器要求使用数值限定关键词range对整数的使用范围作明,确的限制。,例如:,type INDEX is range 0 to 15 ;,type NUM1 is range -100 to 100 ;,INDEX和NUM都是隐含的整数类型。采用上面类型的两个数据,对象声明如下;,constant MUX_ADDRES : INDEX := 5 ;,signal DATA_1 : NUM1 ;,在仿真中,按类型定义决定其二进制位矢量的宽度,即INDEX,用5位位矢量表示(其中1位符号位,4位数据位);NUM1用8位位矢,量表示(其中1位符号位,7位数据位)。,物理类型,物理类型的值是物理量(比方时间、长度、电压或电流)的度量,单位。这种类型的值是根本单位的整数乘积。,物理类型的声明例子如下;,type CURRENT is range 0 to 1E9,units,nA; - (根本单位) 毫微安,uA = 1000 nA; - 微安,mA = 1000 uA; - 毫安,Amp = 1000 mA; - 安培,end units;,subtype F_CURRENT is CURRENT range10 uA to 5 mA,物理类型的数值称为物理文字。物理文字用整数和浮点数,或,字符加单位名称表示。TYME是唯一预定义的物理类型。,数组类型(ARRAY TYPE),数组是同类元素的集合。数组可以是一维或多维的。虽然,VHDL仿真器支持多维数组,但综合器只支持一维数组。,VHDL允许定义限定性和非限定性两种不同类型的数组,它们,的区别是:限定性数组下标的取值范围在数组定义时就确定了,而,非限定性数组下标的取值范围需在以后确定。,限定性数组的定义格式为:,type 数组名 is array (数组范围) of 数据类型;,非限定性数组的定义格式为:,type 数组名 is array (range类型名称 range ) of 数据类型;,其中数组名是定义的数组类型的名称;数组范围指出数组元素,的定义数量和排序方式;range类型名称是下标范围的数据类型,,其中符号“是下标范围的待定符号被称为“盒,用时再填入,具体的数组范围;数据类型是数组中各元素的数据类型。,例如:,限定性数组(约束数组)声明的例子如下:,type DATA_WORD is array (7 downto 0) of BIT; - “01001011,非限定性数组(无约束数组)声明的例子如下:,type STD_LOGIC_VECTOR is array (NATURAL range ),of STD_LOGIC;, 存取类型access,存取类型的数据是动态指向其他类型对象的指针。,存取类型定义格式如下:,type 存取类型名称 is access 类型名称,例如:,type LINE is access string; - line是指向字符串的指针,variable buf : line; - access type,这些予定义提供了从一行中读写数据的操作。, 文件类型files,文件类型的对象代表主机环境中的文件。它提供了一种VHDL,设计同主机环境相互通信的机制。,文件类型定义格式如下:,type 文件类型名称 is file of 类型名称,类型名称是文件中包含的数据的类型,例如:,type VECTORS is file of BIT_VECTOR;,类型为VECTORS的文件中的数据为BIT_VECTOR类型。,程序包TEXTIO中予定义了TEXT文件类型。这种文件类型表示,具有变长度文本字符串的文件。,type TEXT is file of string;,- TEXT是一个可变长度的字符串文件,例如:,file infile : text is in “C:/VHDL/data.txt ;,- program file,目前存取类型和文件类型只用于仿真。,记录类型(RECORD TYPE),记录类型的对象由相同或不同类型的元素组成。记录类型适于,描写通信或总线的协议。记录类型可用于仿真,不能用于综合。,记录类型定义格式如下;,type 记录类型名 is record,元素名:元素数据类型;,元素名:元素数据类型;,end record 记录类型名;,例如:,type PCI_BUS is record,addr :std_logic_vector(31 downto 0);,data :std_logic_vector(31 downto 0);,end record;,signal decord1,decord2 :PCI_BUS;,PCI_DEVICE = decord1.addr;,PCI_DEVICE1RAM = decord2.data;,2.3.5 类型转换,VHDL语言定义了非常严格的类型转换,也就是说,需要对不,同类型的值进行明确的转换。紧密相关的类型之间的转换是允许,的。它们包括整型和实型之间以及它们的数组之间。这些数组的维,数相同、索引类型紧密相关且元素类型相同。,VHDL类型转换,除了那些VHDL语言预先定义过的,都可以通,过用户自定义函数进行。, 类型标记法,variable I :integer;,variable R :real;,I := integer (R);,R := real (I);,type SIGNED is array (NATURAL range ) of BIT;,type BIT_VECTOR is array (INTEGER range ) of BIT;,signal FCR : SIGNED (0 to 7);,signal EMA : BIT_VECTOR (0 to 7);,使用类型转换:,FCR,- std_logic_vector,conv_integer(A);,- signned,unsigned - integer,在std_logic_unsigned程序包中:,conv_integer(A) ;,- std_logic_vector - integer,2.4 VHDL运算操作符(OPERATORS),VHDL语言中预定义的运算操作符可以分为以下6类:,1. 逻辑操作符,2. 关系操作符,3. 移位操作符,4. 加操作符,5. 乘操作符,6. 杂项操作符,在VHDL程序设计中,不同类型的数据对象对应不同类型的运,算符,运算符和操作数类型必须匹配。,VHDL操作符列表,类 型,操作符,功 能,操作数数据类型,优先顺序,逻辑,操作符,AND,与,BIT, BOOLEAN, STD_LOGIC,7,OR,或,BIT, BOOLEAN, STD_LOGIC,7,NAND,与非,BIT, BOOLEAN, STD_LOGIC,7,NOR,或非,BIT, BOOLEAN, STD_LOGIC,7,XOR,异或,BIT, BOOLEAN, STD_LOGIC,7,XNOR,异或非,BIT, BOOLEAN, STD_LOGIC,7,NOT,非,BIT, BOOLEAN, STD_LOGIC,1,1:最高优先级,类 型,操作符,功 能,操作数数据类型,优先顺序,关系,操作符,=,等于,任何数据类型,6,/=,不等于,任何数据类型,6,大于,枚举与整数类型, 及对应的一维数组,6,=,大于等于,枚举与整数类型, 及对应的一维数组,6,移位,操作符,SLL,逻辑左移,BIT或布尔类型一维数组,5,SRL,逻辑右移,BIT或布尔类型一维数组,5,SLA,算术左移,BIT或布尔类型一维数组,5,SRA,算术右移,BIT或布尔类型一维数组,5,ROL,逻辑循环左移,BIT或布尔类型一维数组,5,ROR,逻辑循环右移,BIT或布尔类型一维数组,5,说明:,类 型,操作符,功 能,操作数据类型,优先顺序,加,操作符,+,加,整 数,4,-,减,整 数,4,&,拼接,一维数组,4,符号,操作符,+,正,整 数,3,-,负,整 数,3,乘,操作符,*,乘,整数和浮点数,2,/,除,整数和浮点数,2,MOD,取模,整 数,2,REM,取余,整 数,2,杂项,操作符,ABS,绝对值,任意数值类型,1,*,取幂,左操作数为整数或浮点类型,右操作数只能是整数类型,1, 逻辑操作符,and和or操作符各自可以连着使用,但不同的操作符之间不能,连着使用。 nand和nor操作符各自也不可以连着使用。假设要连着使,用,可用圆括号。例如:,A and B and C 是合法的。,A and B or C 是非法的,可用圆括号 (A and B) or C 。,A nor B nor C 是非法的,可用圆括号 (A nor B) nor C。, 当关系操作符的操作数是数组的时候,从左到右每一次取,一个元素作比较。例如:,BIT_VECTOR(0,1,1)BIT_VECTOR(1,0,1) 为true。,type MVL is (U,0,1,Z)。那么,,MVL(U)MVL(Z) 为true。, 如果移位操作符的右操作数是负整数,那么进行相反方向,的操作,即左移和循环左移分别变成右移和循环右移,反之亦然。,移位操作符的例子:,假设所有左边操作数都是 BIT_VECTOR类型:,“1001010 sll 2 is “0101000 - 填入BITLEFT,即0。,“1001010 srl 3 is “0001001 - 填入0。,“1001010 sla 2 is “0101000 - 填入最右边位0。,“1001010 sra 3 is “1111001 - 填入最左边位1。,“1001010 rol 2 is “0101010 - 循环左移。,“1001010 ror 3 is “0101001 - 循环右移。,“1001010 ror -4 is “0101001 - 执行rol 4操作。,“1001010 srl -5 is “1000000 - 执行sll 5操作。,“1001010 sla -2 is “1110010 - 执行sra 2操作。,“1001010 sra -4 is “0100000 - 执行sla 4操作。,“1001010 rol -1 is “0100101 - 执行 ror 1操作。,“1001010 sll -5 is “0000010 - 执行srl 5操作。,&操作符的操作数可以是一维数组,也可以是元素类型,其,结果永远是数组类型。例如:,0&1 结果为 “01。, A rem B = A - (A/B)*B,rem操作的结果与第一个操作数的符号相同。, A mod B = A B*N - N是整数,mod运算的结果与第二个操作数的符号相同。,举例:,A,B,A/B,A rem B,A mod B,11,4,2,3,3,11,-4,-2,3,-1,-11,4,-2,-3,1,-11,-4,2,-3,-3,2.5 属性(Attribute),一个属性是与VHDL描述中某些名称相关联的一个值、函数、,类型、范围、信号或常数。这些名称可以是实体名称、结构体名,称、标号或信号。,VHDL语言中有五种预定义的属性:,1. 值属性(Value Attribute): 返回一个常数值。,2. 函数属性(Function Attribute): 调用函数并返回值。,3. 信号属性(Signal Attribute): 产生相同类型的信号。,4. 类型属性(Type Attribute): 返回类型名称。,5. 范围属性(Range Attribute): 返回一个范围。,现在以下面的各种声明为例,用表格说明五种预定义的属性。,type aufsteigend is 0 to 255;,subtype fallend is aufsteigend range 255 downto 0;,type farben is (rot, gruen, gelb, blau);,signal data: STD_LOGIC_VECTOR(7 downto 0);,signal clk: STD_LOGIC;,属 性,结 果,例 子,LEFT,区间或列举数据最左边的值,Aufsteigend LEFT = 0,Farben LEFT = rot,RIGHT,区间或列举数据最右边的值,Aufsteigend RIGHT=255,Farben RIGHT=blau,HIGH,区间或得到结果最高端的值,Aufsteigend HIGH=255,Farben HIGH=blau,LOW,区间或得到结果最低端的值,Aufsteigend LOW=0,Farben LOW=rot,ASCENDING,如果类型有上升的范围为TRUE,否则为FALSE,Aufsteigend ASENDING=TRUE,fallend ASENDING=FALSE,属 性,结 果,例 子,LENGTH,数组的长度值,data LENGTH=8,整型、枚举及其子类型的属性,数组的值属性,函数类属性,属 性,结 果,例 子,POS(V),序列表中V值的位置序号,FarbenPOS (gelb) = 2,VAL(V),序列表中位置序号为V的值的名称,FarbenVAL (1) = gruen,SUCC(V),序列表中位置序号为V的下一个值的名称,FarbenSUCC (gelb) = blau,PRED(V),序列表中位置序号为V的前一个值的名称,FarbenPRED (gruen) = rot,LEFTOF(V),邻接值V的左边的值,FarbenLEFTOF(blau)=gelb,RIGHTOF(V),邻接值V的右边的值,FarbenRIGHTOF(rot)=gruen,属 性,结 果,例 子,LEFT,数组左端的元素索引,data LEFT = 7,RIGHT,数组右端的元素索引,data RIGHT = 0,LOW,数组低端的索引值,data LOW = 0,HIGH,数组高端的索引值,data HIGH = 7,物理和枚举类型的属性函数,数组的属性函数,函数类属性(续),属 性,结 果,例 子,EVENT,如果信号(事件)在当前仿真时改变了,为真,clk EVENT and clk=1,信号变为 1,ACTIVE,如果信号(事件)在当前仿真时发生了,为真,LAST_EVENT,从前一个事件到现在的时间,CONSTANT t_setup: TIME:=5 ns;,data LAST_EVENT = t_setup;,LAST_VALUE,事件最后一次改变前的值,clk EVENT and clk=1 and,clk LAST_VALUE=0,信号从0变到1,信号-任务的属性函数,注意:正确理解VALUE和ACTIVE之间的差异是很重要的。当新,的值赋给信号时,就是ACTIVE,即使新值和旧值相同。只有在新,值不同于旧值时,才是,VALUE。,属 性,结 果,例 子,DELAYED(t),经时间t的、与该属性所加信号类型相同的延时信号,signal clk_skew: STD_LOGIC;,clk_skew = clkDLAYED(1 ns),STABLE(t),在过去的时间t内,如果参考信号没有发生事件,为真,If (dataSTABLE(t_setup) = TURE,QUIET(t),在过去的时间t内,如果参考信号没有发生转变,为真,If (dataQUIET(t_setup) = TURE,没有给定t,则默认为delta时间,数据类型类属性,属 性,结 果,例 子,BASE,给子类型提供基础类型,FallendBASE = aufsteigend,FallendBASELEFT = 0,信号类属性,属 性,结 果,例 子, RANGE,提供一个数组的索引区间,for i in dataRANGE,-在例中:7 downto 0,REVERSE_RANGE,提供一个次序颠倒的索引区间,for i in dataREVERSE_RANGE,-在例中:0 to 7,数据区间类属性,第3章 VHDL根本设计单元,3.1 VHDL根本设计单元组成,VHDL是一种用来对数字系统建模的硬件描述语言。这里将数,字系统的硬件抽象称为实体。,为了描述实体,VHDL提供了五种不同类型的设计单元。,1. 实体entity,在VHDL中,实体是对数字系统的硬件抽象。实体声明entity,declaration定义实体名和接口端口。端口是实体与其外部环境的,其他模块进行通信的信号。一个设计可包含多个实体。,实体声明的语法如下:,entity 实体名 is,类属参数说明,端口说明,end 实体名;, 端口说明,端口说明是设计实体与外部接口的描述,是对外引脚信号的名,称、数据类型和输入输出方向的描述。其语法如下:,port,端口名称,端口名称:端口模式 端口类型,;端口名称,端口名称:端口模式 端口类型,;,端口名是赋予每个外部引脚的名称,用英文字母或英文字母加,数字命名。端口模式可以是:in输入、out输出、inout,输入输出型,既可读也可赋值、bufer既可读也可输出。,一个与非门的的实体声明:,entity nand is,port (A,B :in BIT; - 两个输入A和B,Z :out BIT); - 一个输出Z,end nand;, 类属参数说明,一个类属声明了一个模式为in的常数对象,并且可以在实体声,明和与之对应的结构体中使用。,类属参数说明必须放在端口说明之前。在实体内部,类属参数,是一个常数值,可以对类属参数设置一个缺省值。,声明语法如下:,generic,常数名称:类型 : = 值 , ;常数名称:类型 : = 值 ,;,其中,常数名称是类属常量的命名;类型是事先定义好的数据,类型。例如:,entity mux is,generic m :time : = 1 ns;,portd0,d1,sel :in BIT; q :out BIT;,end mux;,2. 结构体,实体声明描述模块的对外属性,结构体就完成模块的具体实现,或内部具体描述,描述设计实体的输入与输出的关系。,由于结构体是对设计实体功能的具体描述,因此,在先编译了,实体声明后才能对结构体进行编译。,结构体的语法如下:,architecture 结构体名称 of 实体名称 is, 块声明语句 ,begin, 并行处理语句 ,end 结构体名称 ;,结构体名称是对结构体的命名;of 后面紧跟的实体名称,说明,该结构体所对应的设计实体;块声明语句用来对结构体内部所使用,的信号、常数、数据类型、子程序、元件等进行定义;并行处理语,句具体描述结构体的行为及其连接关系。,例子:一位半加器的VHDL描述,entity half_adder is,porta,b :in bit;,sum,carry :out bit;,end half_adder;,architecture behavioral of half_adder is,begin,sum = a xor b;,carry = a and b;,end behavioral;,x1,A1,sum,a,b,carry,图3-3 半加器的逻辑电路图,一个VHDL实体只能有一个与之相关的结构体。如果存在多个,结构体,必须通过配置确定与实体相关的唯一的一个结构体。一个,设计实体和某一特定的结构体合起来共同定义一个单元,结构体和,实体的绑定关系称为配置。,3. 配置configuration,配置声明用于从假设干个结构体中选择一种结构体,并将代表该,结构体的元件绑定(binding)到设计库中实体-结构体对或配置所代,表的实体上。,配置声明的语法如下:,configuration 配置名 of 实体名 is,配置声明语句局部,块配置局部,end 配置名;,配置名为配置的名称,
展开阅读全文