硬件描述语言及器件教材:任勇峰等编著《VHDL与硬件实现速成》主讲教师:刘文怡08/09学年第1学期2008-09~2008.12教学安排第1讲:VHDL概述及其开发环境第2讲:VHDL的基本元素第3讲:VHDL的进程第4讲:其它并行语句第5讲:VHDL实例剖析第6讲:VHDL的顺序描述语句第7讲:结构体的描述风格第8讲:计数器和状态机第9讲:不同风格的状态机举例第10讲:VHDL综合举例2008-09~2008.12第2讲:VHDL的基本元素1标识符2数据对象3数据类型4操作符5端口模式2008-09~2008.121标识符标识符规则是VHDL语言中符号书写的一般规则。不仅对电子系统设计工程师是一个约束,同时也为各种各样的EDA工具提供了标准的书写规范,使之在综合仿真过程中不生产生歧义,易于仿真。VHDL语言有两个标准版:VHDL’87版和VHDL’93版。VHDL’87版的标识符语法规则经过扩展后,形成了VHDL’93版的标识符语法规则。前一部分称为短标识符,扩展部分称为扩展标识符。VHDL’93版含有短标识符和扩展标识符两部分。2008-09~2008.12短标识符(1)短标识符VHDL的短标识符是遵守以下规则的字符序列:(1)必须以英文字母打头。(2)字符可以是大写、小写的数字(0~9)和下划线(_)。(3)下划线前后都必须有英文字母或数字。(4)EEA工具综合、仿真时,短标识符不区分大小写。一般地,对VHDL的保留字:ENTITY,ARCHITECTURE,END,BUS,USE,WHEN,WAIT,IS…在程序书写时,一般要求大写或黑体,使得程序易于阅读,易于检查错误。2008-09~2008.12短标识符(2)下面是合法的标识符:multi_screensMulti_screensMulti_ScreensMULTI_SCREENS下面的书写是不合法的:illegal%nameillegal-nameillegal-name2008-09~2008.12扩展标识符扩展标识符是VHDL’93版增加的标识符书写规则:(1)扩展标识符用反斜杠来定界。\multi_screens\,\eda_centrol\等都是合法的扩展标识符。(2)允许包含图形符号、空格符。例如:\modeA\,\$100\,\p%name\等。(3)反斜杠之间的字符可以用保留字。例如:\buffer\,\entity\,\end\等。(4)扩展标识符的界定符两个斜杠之间可以用数字打头。如:\100$\,\2chip\,\4screens\等。(5)扩展标识符中允许多个下划线相连。例如:\Four_screens\,\TWO_Computer_sharptor\等。(6)扩展标识符区分大小写。例如:\EDA\与\eda\不同。(7)扩展标识符与短标识符不同。例如:\COMPUTER\与Computer不同。2008-09~2008.122数据对象(1)在VHDL语言中,凡是可以赋于一个值的客体叫对象(object)。VHDL对象包含有专门数据类型,主要有4个基本类型:常量(CONSTANT)、信号(SIGNAL)、变量(VARIABLE)和文件(FILES)。其中文件类型是VHDL’93标准中新通过的。2008-09~2008.12数据对象(2)信号和变量可以连续的赋于不同的值。常量只在它被说明时赋值,在整个器件工作期间值不变化。试图对常量多次赋值是错误的。文件可以用参数向子程序传递数据,通过子程序对文件进行读和写操作。文件不可以通过赋值来更新文件的内容,文件参数没有模式。2008-09~2008.12数据对象(3)对象说明的一般书写格式为:对象类别标识符表:子类型标识[:=初值];对象说明举例:CONSTANTT1,T2:time:=30ns,--常量说明VARIABLESUM:read;--变量说明SIGNALCLOCK:bit;--信号说明FILEinput:TextISIN“STD_INPUT”--文件说明2008-09~2008.12数据对象(4)对象的赋值规则:可用函数调用的方法给对象赋初值。CONSTANTBus-number:Integer:=My_function(True,6);如果在同一个对象说明语句中,对多个同一类型的对象指定初始值,则多个对象同时取得了这一指定值。信号和变量的默认值。当信号和变量没有指定初始值或没有给信号变量赋值时,即信号和变量的值在对象说明语句中默认时,信号变量的取值称为默认值。一般地,若变量为字符型变量则取最大值;若变量、信号为数值型变量,则取初始值,默认值为‘0’2008-09~2008.12常量(1)常量(constant)是设计者给实体中某一常量名赋予的固定值。一般地,常量赋值在程序开始前进行说明,数据类型在实体说明语句中指明。常量说明的一般格式如下:CONSTANT常数名:数据类型:=表达式;根据上面的格式,举例如下:8位寄存器宽度指定:CONSTANTwidth:integer:=8;设计实体的电源供电电压指定:CONSTANTVcc:real:=5.0;某一模块信号输入/输出的延迟时间:CONSTANTDALY:time:=100ns;3数据对象2008-09~2008.12常量(2)常量标识符、WIDTH,VCC,DALY,PBUS等在VHDL程序中多处有用,其值在运行中不变。若要改变常量值,必须要改变设计,改变实体中的常量说明,然后重新编译。常量必须在程序包、实体、结构体或进程的说明区域中对常量的标识符、类型、常量值进行指定。定义在程序包中的常量由所在的实体或结构体调用。定义在实体内的常量仅在实体内使用,定义在进程内的常量仅在进程内使用。2008-09~2008.12变量(1)变量(variables)仅用在进程语句、函数语句、过程语句中的结构中使用,变量是一个局部量,变量的赋值立即生效,不产生赋值延时。变量书写的一般格式为:VARIABLES变量名:数据类型约束条件:=表达式;根据上述格式,举例如下:VARIABLESresult:std_logic:='0';—变量赋初值VARIABLESx,y,z:integer;VARIABLEScount:integerrange0TO255:=10;2008-09~2008.12变量(2)在VHDL语言中,变量的使用规则和限制范围说明如下:变量赋值是直接非预设的。在某一时刻仅包含了一个值。变量赋值和初始化赋值符号用“:=”表示。变量不能用于硬件连线和存储元件。在仿真模型中,变量用于高层次建模。在系统综合时,变量用于计算,作为索引载体和数据暂存。在进程中,变量的使用范围在进程之内。若将变量用于进程之外,必须将该值赋给一个相同类型的信号,即进程之间传递数据靠的是信号。2008-09~2008.12信号(1)信号(signal)是电子电路内部硬件实体相互连接的抽象表示。信号通常在构造体、包集合和实体说明中使用,其一般书写格式为:SIGNAL信号名:数据类型、约束条件:=表达式;使用上述格式举例如下:SIGNALsys_clk:BIT:=‘0’;--系统时钟信号SIGNALcount:bit_vector(7downto0);--计数器宽度2008-09~2008.12信号(2)有关信号的使用规则说明如下:“:=”表示对信号直接赋值,表示信号初始值不产生延时。“=”表示代入赋值,是变量之间信号的传递,代入赋值法允许产生延时。例如:T1=T2;在仿真中,初始化能保证信号设定在指定值上。对于存储元件的加电初始状态,应该设计复位或予置位机构,而不是通过信号指定初始化值来实现。在EDA工具综合时,信号应在结构体中描述清楚。2008-09~2008.124数据类型VHDL语言标准定义了10种标准的数据类型。为了方便设计,允许用户自定义数据类型。VHDL语言程序是系统行为的描述、功能的说明和结构的组织,使用规范化语言,有着很强的约束性。不同的数据类型不能直接代入,相同的类型,位长不同也不能代入。EDA工具在编译、综合时会报告类型错。2008-09~2008.12数据类型(2)VHDL语言标准所定义的标准数据类型(1)整数类型(INTEGERTYPE)(2)实数类型或浮点类型(REALTYPE&FLOATINGTYPE)(3)位类型(BITTYPE)std_logic(4)位矢量类型(BIT_VECTORTYPE)std_logic_vector(5)布尔类型(BOOLEANTYPE)(6)字符类型(CHARACTERTYPE)(7)时间类型或物理类型(Timetype&physicaltype)(8)错误类型(NOTE,WARNIING,ERROR,FAILURETYPE)(9)自然数、整数类型(NATURALTYPE)(10)字符串类型(TRINGTYPE)2008-09~2008.12数据类型(3)布尔量(BOOLEAN)布尔量是二值枚举量,每一个布尔量具有两个可能的值:“真”或者“假”。布尔量没有数量多少的概念,不能进行算术运算,只能进行逻辑运算。布尔量常用来表达信号的状态,或者总线上的控制权,仲裁情况,忙、闲状态等。若某个客体被定义为布尔量,则EDA工具对设计进行仿真时,自动地对其赋值情况进行核查。2008-09~2008.12数据类型(4)字符(CHARACTER)字符在VHDL语言中编程时用单引号括起来。‘A’,‘a’,‘B’,‘b’,都认为是不同的字符。VHDL语言对大小写英文字母不敏感,但区分字符量中的大小写。字符‘1’,‘2’仅是符号。字符包括A~Z,a~z,0~9,空格及一些特殊字符。2008-09~2008.12数据类型(5)字符串(STRING)字符串是由双引号括起来的一个字符序列。例如“VHDL”,“STRING”,“MULTI_SCREENCOMPUTER”等。字符串在其他文献中也称为字符矢量或字符串数组。字符串一般用于程序的提示、结果的说明等场合。2008-09~2008.12数据类型(6)整数(INTEGER)在VHDL语言中,整数范围从-(231-1)到(231-1),例如:+128,+5,-12,…。在电子系统中,整数可以用进制来表示。整数不能看作矢量,不能单独对某一位操作。整数不能用于逻辑运算,只能用于算术运算。对象的数据类型定义为整数时,范围应有约束。例如:VARIABLEA:INTEGERRANGE-128TO128;在电子系统设计过程中,整数可以用来抽象地表达总线的状态。2008-09~2008.12数据类型(7)位(BIT)位通常用来表示一个信号的值。位通常用单引号来括号引其位的值。如:TYPEBITIS('0','1');位的值‘0’,‘1’表示信号的状态;布尔量的值‘0’,‘1’表示‘假’,‘真’。两者的意义不一样。2008-09~2008.12类型转换(1)在VHDL程序设计中,不同类型的对象不能代入。对于某一数据类型的变量、信号、常量、文件赋值时,类型一定要一致,否则EDA工具进行综合、仿真等过程中不能通过。为了进行不同类型的数据变换,可以有3种方法:类型标记法、函数转换法和常数转换法。2008-09~2008.12类型转换(2)用类型标记法实现类型转换类型标记就是类型的名称。类型标记法仅适用于关系密切的标量类型之间的类型转换,即整数和实数的类型转换。若:variablei:integer;variabler:real;则有:i:=integer(r);r:=real(i);2008-09~2008.12类型转换(3)用函数法进行数据类型转换,VHDL语言标准中的程序包提供的变换函数来完成这个工作。这些程