硬件描述语言第02讲.ppt
硬件描述语言及器件,主讲教师:苏淑靖,12/13学年第1学期,教材:侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计.,教学安排,第1讲:VHDL概述及其基本结构第2讲:VHDL语言的基本元素 第3讲:VHDL的结构体描述,进程第4讲:VHDL的顺序语句 第5讲:VHDL的并行语句第6讲:基本逻辑电路设计第7讲:计数器和状态机,第2讲:VHDL语言的基本元素,标识符数据对象数据类型操作符,1 标识符,VHDL语言中标识符是符号书写的一般规则。不仅对电子系统设计工程师是一个约束,也为各种EDA工具提供了标准的书写规范,使之在综合仿真过程中不产生歧义,易于仿真。VHDL语言有两个标准版:VHDL87版和VHDL93版。VHDL87版的标识符语法规则经过扩展后,形成了VHDL93版的标识符语法规则。前一部分称为短标识符,扩展部分称为扩展标识符。VHDL93版含有短标识符和扩展标识符两部分。,VHDL的短标识符遵守以下规则的字符序列:(1)标示符由英文字母、数字、下划线组成;(2)必须以英文字母打头。(3)字符不区分大小写、数字(09)和下划线(_)。(4)下划线前后都必须有英文字母或数字。一般地,对VHDL的保留字:ENTITY,ARCHITECTURE,END,BUS,USE,WHEN,WAIT,IS在程序书写时,一般要求大写或黑体,使得程序易于阅读,易于检查错误。,1 短标识符(1),合法的标识符:multi_screens Multi_screens Multi_Screens MULTI_SCREENS 非法标识符:illegal%name illegal-name illegal-name 3decode T_ _2 COUNTER_,同一标识符,1 短标识符(1),VHDL93版增加的标识符书写规则:(1)扩展标识符用反斜杠来定界。multi_screens;(2)允许包含图形符号、空格符。mode A,$100 等;(3)反斜杠之间的字符可以用保留字。entity,end等。(4)扩展标识符的界定符两个斜杠之间可以用数字打头。100$,2chip,4screens等。(5)扩展标识符中允许多个下划线相连。Four_screens,TWO_Computer_sharptor等。(6)扩展标识符区分大小写。EDA 与eda不同。(7)扩展标识符与短标识符不同。例如:COMPUTER 与Computer不同。,扩展标识符(2),数据对象:在VHDL语言中,可以赋予一个值的客体(object)。4种基本类型:常量(CONSTANT)、信号(SIGNAL)、变量(VARIABLE)和文件(FILES)。其中文件类型是VHDL93标准中新增加的。数据对象的物理意义:常量通常表示数字电路中的地和电源;信号表示设计中的某条硬件连接线;变量通常表示暂存某些值的载体;,2 数据对象,常量(constant):是一个固定值;常量说明是对某一常量名赋予一个固定值。常量说明格式:CONSTANT 常量名:数据类型:=表达式;例:CONSTANT T1,T2:time:=30ns;CONSTANT D:BIT_VECTOR:=“0001”;注意:常量一旦赋值不能改变;常量赋的值应和数据类型一致;常量必须在实体、结构体或进程的说明区域指定。定义在实体内的常量在实体对应的结构体中可见,定义在进程内的常量仅在进程内使用。,2 数据对象(常量),变量(VARIABLE):是局部量,用于对中间数据的临时存储。只能在进程、函数和过程中使用。变量说明格式:VARIABLE 变量名:数据类型 约束条件:=表达式;例:VARIABLE count:INTEGER RANGE 0 TO 255:=10;变量赋值语句:目标变量名:=表达式(设定值)注意:一旦赋值立即生效,不产生赋值延时。某一时刻仅包含一个值。变量赋值和初始化赋值符号用“:”表示。在进程中说明的变量,若用于进程外,必须将值赋给一个相同类型的信号,即进程之间传递数据靠的是信号。,2 数据对象(变量),信号(signal):电子电路内部硬件实体相互连接的抽象。信号声明格式:SIGNAL 信号名:数据类型 约束条件:表达式;例:SIGNAL sys_clk:BIT:=0;-系统时钟信号 信号赋值语句:目标信号名=表达式(设定值);注意:信号是全局变量,可在进程之间通信;“:=”表示对信号直接赋值或初始赋值,不产生延时;在程序中信号值代入用“=”带入符,且允许产生延时,是变量之间信号的传递方式,如:T1=T2;可在结构体、实体、块、包集合中声明和使用信号,在进程和子程序中只能使用信号,不能声明信号;,2 数据对象(信号),适用范围,2 数据对象,2 数据对象,在VHDL中,单个位值(bit)用单引号()标明,而位向量值(bit_vector)用双引号(“”)标出。STD_LOGIC(标准逻辑)数据类型只能取0或1,没有不定状态和高阻态,也就不能用来描述双向数据总线之类的功能,93版IEEE(IEEE1164)增加了标准逻辑数据类型共9种:TYPE STD_LOGIC IS(U,X,0,1,Z,W,L,H,-);初始值,不定,0低电平,1高电平,高阻,弱信号不定,弱信号0,弱信号1,不可能情况。,2 数据对象(常量),VHDL标准定义了10种标准的数据类型(1)整数(INTEGER):-21474836472147483647,(231-1);(2)实数(REAL):-1.0E+38+1.0E+38;书写时一定要有小数点;(3)位(BIT):信号用位值表示,位值用带单引号的0和1表示;(4)位矢量(BIT_VECTOR):用双引号括起来的一组位数据,“00101”;(5)布尔量(BOOLEAN):TURE或FALSE,是二值枚举量,但没有数值的含义,不能进行算术运算;(6)字符(CHARACTER):字符量要用单引号括起来,其中的字符可以是az的任一字母、09的任一数及空格或特殊字符等,如A。VHDL对字符量中的大小写有区别,即A和a不同;,3 数据类型(标准),VHDL语言标准定义了10种标准的数据类型。(7)字符串(STRING):双引号括起来的一组字符序列,如“integer range”,用于程序的提示和说明;(8)时间(Time):包括整数和单位,二者之间至少留一个空格,如:10 s,用于表示信号时延;(9)错误(NOTE,WARNIING,ERROR,FAILURE):仿真时用来提示系统当前的工作情况;(10)自然数(NATURAL)、正整数类型(positive)上述10种标准数据类型在编程时可直接引用。如果用户要使用其他数据类型,则要进行自定义。,2 数据类型(标准),用户自定义数据类型格式:TYPE 数据类型名,数据类型名 数据类型定义;常用的用户自定义数据类型:枚举类型、整数类型和实数类型、数组类型、记录类型。(1)枚举类型 格式:TYPE 数据类型名 IS(元素,元素);例:表示一周每天状态的逻辑电路 TYPE week IS(sun,mon,tue,wed,thu,fri,sat);在综合过程中,对枚举类型的编码通常是自动的,枚举类型按二进制编码。依据类型定义时各元素自左向右的出现顺序,分配一个二进制代码。上述语句中,最左边的元素的值为000,001,010,011,100,101,综合成三根信号线表示states。,2 数据类型(用户自定义),(2)整数类型和实数类型 整数和实数类型在标准的程序包中已经作了定义。但在实际应用中,数据类型的取值范围比较小,应该重新定义,限定取值范围,以提高芯片的利用率.格式:TYPE 数据类型名 IS 数据类型 定义约束范围;例:定义一个数码管上显示数字09的整数 TYPE digit IS INTEGER RANGE 0 TO 9;实数类型 TYPE current IS REAL RANGE-1.0E4 TO 1.0E4;,2 数据类型(用户自定义),(3)数组类型 数组类型是相同类型数据集合在一起形成的一个新的数据类型。数组可以是一维数组或多维数组。格式:TYPE 数据类型名 IS ARRAY 范围 OF源数据类型;例:TYPE word IS ARRAY(1 TO 8)OF STD_LOGIC;TYPE IS ARRAY(7 downto 0)of bit;其中,“(7 DOWNTO 0)”决定了数组元素的个数有8个和元素的排序方向,“DOWNTO”指明下标将以降序变化。(1 TO 8)“TO”指明下标将以升序变化,按低到高的顺序排列9个元素。数组类型常用于总线、ROM、RAMA等系统中。,2 数据类型(用户自定义),(4)记录类型:记录是不同类型的名称域的集合 格式:例:,TYPE 数据类型名 IS RECORD 元素名:数据类型名;元素名:数据类型名;END RECORD;,TYPE BANK IS RECORD addr0:STD_LOGIC_VECTOR(7 DOWNTO 0);addr1:STD_LOGIC_VECTOR(7 DOWNTO 0);r0:INTEGER;END RECORDESIGNAL result:BANK;SIGNAL addr:addr0 AND addr1;,2 数据类型(用户自定义),3 数据类型(数据类型的转换),VHDL是一种强类型语言,这意味着如果两个信号的数据类型不同,则不允许将其中的一个信号的值赋给另一个信号,这个问题一般可以通过将信号的数据类型转换成相同的数据类型来解决。整数类型与STD_LOGIC类型可以相互转换。将STD_LOGIC_VECTOR类型转换成整数类型的函数为:CONV_INTEGER;将整数类型转换成STD_LOGIC_VECTOR类型的函数为:CONV_STD_LOGIC_VECTOR;转换函数由IEEE.STD_LOGIC_ARITH库提供。,3 数据类型(数据类型的转换),3 数据类型(数据类型的转换),LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;-在实体说明前,必须加上这条语句,-因为转换函数是由IEEE.STD_LOGIC_ARITH库提供的ENTITY test IS PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN INTEGER RANGE 0 TO 15;c:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);d:OUT INTEGER RANGE 0 TO 15);END test;ARCHITECTURE t est_body OF test ISBEGINc=CONV_STD_LOGIC_VECTOR(b,4);-将整数转换成STD_LOGIC_VECTOR类型d=CONV_INTEGER(a);-将STD_LOGIC_VECTOR转换成整数类型END test_body;,4 运算操作符,逻辑运算符,4 运算操作符,d1 and d2,4 运算操作符,关系运算符,在VHDL程序设计中的规则:两个对象进行比较时,数据类型一定要相同。(等于)和/(不等于)适用于所有数据类型的对象之间的比较。大于、小于、大于等于、小于等于适用于整数、实数位、位矢量及数组类型的比较。=符号有两种含义:代入符和小于等于符,要根据上下文判断。两个位矢量类型的对象比较时,自左至右,按位比较。,4 运算操作符,在VHDL程序设计中,并置运算符“”的使用规则:并置运算符可用于位的连接,形成位矢量。并置运算符可用两位矢量的连接构成更大的位矢量。位的连接,可以用并置符连接法,也可用集合体连接法。如:DATA_C=D0&D1&D2&D3;DATA_C=(D0,D1,D2,D3);,4 运算操作符,ENTITY opr ISPORT(a:IN INTEGER RANGE 0 TO 16;b:IN INTEGER RANGE 0 TO 16;sum:OUT INTEGER RANGE 0 TO 32);END opr;ARCHITECTURE example OF opr ISBEGINPROCESS(a,b)BEGINsum=a+b;END PROCESS END example;,注:库 STD 和包 Standard 不需要引用,VHDL 编译器能够理解该运算符,因为算术运算符是为内建的数据类型 INTEGER定义的,在设计文件的开头部分包括这些语句,允许对非内建的数据类型进行运算,