1第三章 VHDL 的数据类型及运算操作符3.1 VHDL 的客体及分类1.客体(Object):在 VHDL中,凡是可赋予一个值的对象,就称客体2. 客体分类(1)常量(constant)• 常量的定义和设置主要是为了使设计实体中的常数更容易阅读和修改• 常数说明:是对某一常数名赋予一个固定的值• 语句格式CONSTANT 常数名:数据类型:=表达式;如:CONSTANT DELAY:REAL:=10.0;• 特点:a) 常量一旦被赋值,就不能再改变;b) 常量所赋的值应和定义的数据类型一致;c) 常量的作用范围取决于它被定义的位置2)变量(VARIABLE)• 语句格式VARIABLE 变量名:数据类型 约束条件:=表达式;如:VARIABLE counter: INTEGER RANGE 0 TO 255:=100;• 特点:a) 变量是一个局部量,只能在进程和子程序中使用;b) 变量的赋值是一种理想化的数据传输,是立即发生,不存在任何时延的行为3)信号(SIGNAL)• 语句格式SIGNAL 信号名:数据类型 约束条件:=表达式;如:SIGNALE dbus: STD_LOGIC_VECTOR(15 DOWNTO 0);• 特点:a) 信号是描述硬件系统的基本数据对象,类似于内部硬件连线;b) 信号是一个全局量,可以用于进行进程之间的通信;c) 信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值(与触发器的记忆功能有很好的对应关系) ;d) 信号可以看成是实体内部的端口(但没有方向说明) 。
小结 :① 从硬件电路系统来看,常量相当于电路中的恒电平(Vcc 或 GND) ,变量和信号相当于组合电路系统中门与门间的连线及其连线上的信号值;② 变量与信号之间的共性(从综合以后对应的硬件结构看)a) 在许多情况下,信号和变量并没有多少区别;b)它们都具有能够接受赋值这一重要共性(而 VHDL综合器不理会延时)③ 变量与信号之间的主要区别(从 VHDL语句功能和行为仿真上看)a) 信号可以设置延时量,而变量则不能;2b) 信号可以作为模块间的信息载体,而变量只能作为局部的信息载体3.2 VHDL 的数据类型• VHDL数据类型特点:① 具有多种标准的数据类型;② 具有多种用户定义数据类型;③ VHDL是一种强类型语句→一是数据类型定义十分严格;→二是不同类型之间的数据不能直接代入;→三是位长不同时,也不能直接代入(相同类型) 1. 标准的数据类型• 整数(Interge):32 位• 实数(Real):浮点数 –1.0E+38--+1.0E+38• 位(Bit):”0”/”1”• 位矢量(Bit Vector):• 布尔量(Boolean):True or False• 字符(Character):’A’• 字符串(String):” ”• 时间(Time):ms,μs• 错误等级(Severity Level):NOTE,WARNING,ERROR,FAILURE• 整数子类(Natural,Positive):大于等于 0的整数,正整数。
注:① 上述十种标准数据类型,编程时可直接引用;② 使用十种以外数据类型,用户自行定义;③ 约束区间:DOWNTO 表示下降,TO 表示上升2. 用户定义的数据类型• 语句格式TYPE 数据类型名 {,数据类型名} 数据类型定义;• 常用数据类型(1) 枚举类型(Enumerated)• 含义:用文字符号来表示一组实际的二进制数的类型• 语句格式:TYPE 数据类型名 IS (元素,元素…);如:TYPE week IS (sun,mon,wed,thu,fri,sat,)000 001 010 011 100 110(2) 整数和实数类型(Integer,Real)• 含义:标准数据类型中已定义,但它们的取值定义范围太大,实际中综合器无法进行综合,具体的数据类型必须由用户椐实际需要重新定义,并限定其取值范围,从而提高芯片资源的利用率• 语句格式:TYPE 数据类型名 IS 数据类型定义 约束范围;如:TYPE counter IS INTEGER RANGE 0 TO 100;3(3)数组(Array)• 含义:是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型(一维或二维) 。
• 语句格式:① 限定性数组:下标的取值范围在数组定义时就被确定TYPE 数组名 IS ARRAY(数组范围) OF 数据类型;如:TYPE STB IS ARRAY(7 DOWNTO 0) OF STD_LOGIC;数组类型名 STB,共有 8个元素,下标取值范围 7-0,各元素排序是 STB(7),STB(6),…STB(0)② 非限定性数组:下标的取值范围待随后根据具体数据对象再确定TYPE 数组名 IS ARRAY(数组下标名 RANGE) OF BIT;VARABLE VA:BIT_VECTOR(1 TO 6);(4)时间类型(Time)• 含义:表示时间的数据类型,仿真时使用• 语句格式:TYPE 数据类型名 IS 范围UNITS 基本单位;单位END UNITS如:TYPE time IS RANGE -1E18 TO +1E18;UNITSfs; -- “飞秒”VHDL 中最小时间单位ps=1000fs; --“皮秒”ns=1000ps; μs=1000ns;ms=1000μs;sec=1000ms;min=60sechr=60min; --“时”END UNITS;(5)记录类型(Recode)• 含义:由已定义的、数据类型不同的对象元素构成的数组,称为记录类型的对象。
• 语句格式:TYPE 记录类型名 IS RECORD元素名:元素数据类型;元素名:元素数据类型;…END RECORD;3. 数据类型的比较• VHDL是一种强类型函数,不同类型的数据是不能进行运算和直接代入,必须通过类型变换4• 变换函数由 VHDL的包集合提供2.3 VHDL 的运算操作符• VHDL共有 4类操作符;• VHDL中的操作符与操作数间的运算要严格遵循以下规则:① 在基本操作符间操作数是同数据类型;② 操作数的数据类型必须与操作符所要求的数据类型完全一致1.逻辑运算符(6 种)AND, OR, NOT, NAND, NOR, XOR,XNOR(同或)[例 3-1] 逻辑运算操作示例SIGNAL a,b,c: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL d,e,f,g: STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL h,I,j,k: STD_LOGIC;SIGNAL l,m,n,o,p: boolean;…a)VHDL规定:·加减操作符的运算规则与常规的加减法是一致的;· 数据类型均为整数;· 位宽大于 4的加减法器,综合器将调用库元件进行综合。
注:并置运算符“&”用于位的连接如:c = a & b ; a,b 分别为 4位位矢量,则 c 为 8位位矢量2)求积操作符(*, /, MOD, REM)VHDL规定:·乘与除的数据类型是整数和实数(包括浮点数) ;· 在一定条件下,可对物理类型对象进行运算;虽在一定条件下,乘除法运算是可以综合的,但尽量用变通的方法来实现3)符号操作符(+, -)注意:在实际使用中,取负操作数需加括号4)混合操作符(**,ABS(5)移位操作符(SLL.SRL.SLA.SRA.ROL.ROR)VHDL规定:操作数的数据类型为一维数组,数组元素必须是 BIT或5BOOLEAN的数据类型,移位的位数则是整数3. 关系操作符(6 种)• 作用:是将相同数据类型的数据对象进行数值比较或关系排序判断,并将结果以 BOOLEAN类型的数据表示出来(即 TRUE or FALSE)• 种类:=(等于) ,/=(不等于) ,(大于), >=(大于等于)• 操作:(1)比较判断 “=” , “=/”对象:VHDL 中的任何数据类型构成的操作数结果:对于标量,他们的数据类型相同且数值也相同,结果为真;而对于数组,只有当等号两边数据中的每一对应位全部相等时,才返回真。
2)关系排序 “”, “>=”对象:VHDL 中的整数数据类型(或一维数组) 、枚举数据类型规则:对于整数值,从正无限到负无限;对枚举数据,与它们的定义方式一致如:’1’>’0’; TRUE>FALSE…对于数组,从左到右比大小(不管位数多少)• 说明:在逻辑综合时,简单的比较运算在实现硬件结构时,比排序操作符构成的电路芯片资源利用率高[例 3-2] ENTITY relational_ops_1 ISPORT (a,b: IN BIT_VECTOR(0 TO 3);m: OUT BOOLEAN);END relational_ops_1 ;ARCHITECTURE example OF relational_ops_1 ISBEGINOutput =b);END example;分析:以上同样是 4位二进制数进行比较,除操作符不同外,程序完全相同但综合结果表明,后者所耗用的逻辑门比前者多出近 3倍2.4 VHDL 的文字规则VHDL除了具有类似与计算机高级语言所具备的一般文字规则外,还有许多特有的文字规则和表达方式61.数字• 整数:整数都是十进制数如:3, 3876, 76E2(=7600) ,12_34_56(=123456)• 实数:实数是带小数点的十进制数如:3.45, 1.02. 字符串• 字符:是用单引号括起的 ASCII字符,可以是数值、符号或字母。
• 字符串:是用双引号括起的一维字符数组,有两种类型(1)文字字符串:用双引号括起的一串文字,如:“ XY”,”ERROR”(2)数位字符串(矢量):与文字字符串相似,但所代表的是二、八或十六进制的数组B: 二进制基数符号,表示二进制位 0或 1,字符串中的每位表示一个BitO: 八进制基数符号,字符串中的每位表示一个八进制数(3 位二进制) X: 十六进制基数符号,字符串中的每位表示一个十六进制数(4 位二进制)如: data1<=B”1011” ;二进制数组,位矢数组长度是 4Data2<=O”15” ;八进制数组,位矢数组长度是 6data1<=X”3DE” ;十六进制数组,位矢数组长度是 123.标识符标识符是最常用的操作符,它可以是常数、变量、信号、端口、子程序或参数的名字书写规则如下:• 有效的字符:26 个大小写英文字母,数字 0-9, ”_”, ” ”;• 英文字母开头,标识符中的英文字母不分大小写;4.下标名下标名用于指示数组型变量或信号的某一元素;下标段名则用于指示数组型变量或信号的某一段元素;语句格式:标识符(表达式) ;说明:标识符必须是数组型的变量或信号的名字;表达式的值必须是数组下标范围中的一个值,这个值对应数组中的一个元素。
例如:SIGNAL a, b: BIT_VECTOR( 0 TO 3 );SIGNAL m : INTEGER RANGE 0 TO 3;SIGNAL y, z: BIT;Y <= a(m) ; 不可计算型下标表示(综合难,耗费资源大)Z <= b(3) ; 可计算型下标表示 //---End---。