VHDL硬件描述语言及应用-----------一种很好的数字系统硬件电路的形式化描述实现hwadee2020/2/162VHDL语言概述HDL:HardwareDescriptionLanguageVHDL:由美国国防部开发,1987年由IEEE标准化,1993年进一步修订Verilog:1983年由GatewayDesignAutomation公司开发,1990年被推向公众领域,1995年成为IEEE标准建议:VHDL比较严谨,Verilog比较自由,初学还是用VHDL比较好,初学用Verilog会比较容易出错hwadee2020/2/163VHDL中的注意事项在VHDL语言中,大小写不加区分,但在代码中巧妙应用大小写,可以使代码变得易于阅读和规范实体名必须与VHDL文件名相同,否则编译会出错信号与变量,过程与函数的区分hwadee2020/2/164VHDL语言程序的基本构成库、包集合:用于存放预先编译好的程序包(PACKAGE)和数据集合体,以便不同的VHDL设计使用实体说明:规定设计单元的输入输出接口信号和引脚构造体:定义设计单元的具体构造和操作hwadee2020/2/165VHDL语言程序的基本构成示例库、包集合说明实体说明构造体hwadee2020/2/166库和包集合的使用库的说明总是放在设计单元的最前面,调用方法:LIRARY库名USE库名.所要调用的程序包名.ALL具体可打开安装目录C:\altera\quartus60\libraries\vhdl下相应的文件进行学习常用库和包集合:IEEE库中的包集合STD_LOGIC_1164,STD_LOGIC_ARITH,STD_LOGIC_UNSIGNED,其中后两个包在日本synopsys(新思)公司目录中,该公司在FPGA行列还推出了primetime静态时序分析工具STD库中STANDARD包集合是VHDL的标准配置,使用时可以不说明WORK库:VHDL现行工作库,可以理解为用户当前编辑的目录中所有可用的包和数据集hwadee2020/2/167实体(ENTITY)实体类似于原理图中的一个部件符号,它并不描述设计的具体功能,只是定义所需的全部输入/输出信号。实体格式如下:ENTITY实体名IS[GENERIC(常数名:数据类型[:设定值])]类属说明PORT端口说明(端口信号名1:模式类型;端口信号名2:模式类型;端口信号名3:模式类型;端口信号名4:模式类型);END实体名;实体名:实体名必须与VHDL文件名相同,否则编译会出错hwadee2020/2/168ExempleofENTITYGENERIC所定义的元件叫做参数化元件,即元件的规模或特性由GENERIC的常数决定,利用GENERIC可以设计更加通用的元件,弹性地适应不同的应用端口信号名在实体之中必须是唯一的,信号名应是合法的标识符分别有IN、OUT、INOUT、BUFFER、LINKAGE常用的有INTEGER、STD_LOGIC、STD_LOGIC_VECTORhwadee2020/2/169ARCHITECTURE所有能被仿真的实体都由结构体(ARCHITECTURE)描述,即结构体描述实体的结构或行为,一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案结构体格式:ARCHITECTURE结构体名OF实体名IS[定义语句(元件例化);]BEGIN并行处理语句;END结构体名;结构体名是对本结构体的命名,它是该结构体的惟一名称,虽然可以由设计人员自由命名,但一般都将命名和对实体的描述结合起来,例如:行为描述(BEHAVE),寄存器传输级(RTL)hwadee2020/2/1610ExempleofARCHITECTUREhwadee2020/2/1611ARCHITECTURE的BLOCK子结构子结构的使用使设计者可以把整个电路分成若干个相对独立的模块来进行描述子结构有:BLOCK,PROCESS,SUBPROGRAMSBLOCK与ARCHITECTURE相当于整体原理图与子原理图关系,结构内部语句是并发的,如希望BLOCK有条件执行,可采用卫式BLOCK,如下:hwadee2020/2/1612ARCHITECTURE的PROCESS子结构PROCESS中的语句是顺序执行的,一个结构体中可以有多个PROCESS,它们之间可以通过信号进行通信PROCESS的启动受敏感信号控制,敏感信号的变化会直接导致PROCESS的启动hwadee2020/2/1613ARCHITECTURE的SUBPROGRAM子结构与高级语言中的子程序概念差不多,可以反复调用,但不能重入,结构内语句为顺序执行,有Procedure和Function之分多个过程和函数汇集在一起构成包集合,几个包集合汇集在一起构成库hwadee2020/2/1614VHDL中的数据对象在逻辑综合中,VHDL常用的数据对象有信号、变量及常量信号SIGNAL:为全局变量,定义格式:SIGNAL信号名:数据类型[:=初始值];赋值格式:目标信号名=表达式常在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往忽略信号声名时所赋的值常量:全局变量,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。定义格式:CONSTANT常数名:数据类型:=表达式变量(VARIABLE):用于声明局部值或用于子程序中,变量的赋值符号为“:=”,定义格式:VARIABLE变量名:数据类型[:=初始值]hwadee2020/2/1615VHDL中的信号与变量信号是实际的,是内部的一个存储元件(SIGNAL)或者是外部输入(IN、OUT、INOUT、BUFFER)变量是虚的,仅是为了书写方便而引入的一个名称,常用在实现某种算法的赋值语句当中如果在一个进程中多次为一个信号赋值,只有最后一个值会起作用,这与SIGNAL的硬件特性有关变量赋值时,变量的值改变是立即发生的信号赋值用“=”,变量赋值用“:=”hwadee2020/2/1616VHDL的数据类型VHDL是一种强类型语言,对于每一个常数、变量、信号、函数及设定的各种参量的数据类型(DATATYPES)都有严格要求,相同数据类型的变量才能互相传递和作用,标准定义的数据类型都在VHDL标准程序表STD中定义,实际使用中,不需要用USE语句以显式调用VHDL常用的数据类型有三种:标准定义的数据类型、IEEE预定义标准逻辑位与矢量及用户自定义的数据类型hwadee2020/2/1617标准定义的数据类型Boolean布尔量:取值为FALSE和TRUECHARACTER字符:ASCII字符,编程时用单引号括起来,如‘A’STRING字符串:字符失量,双引号括起来,如“ADFBD”INTEGER整数:32位,范围从-(231-1)到(231-1);REAL实数:实数类型仅能在VHDL仿真器中使用,综合器不支持BIT位:取值为0或1;TIME时间:范围从-(231-1)到(231-1),表达方法包含数字、(空格)单位两部分,如(10PS);BIT_VECTOR位矢量:其于BIT数据的数组,使用矢量必须注明宽度,即数组中的元素个数和排列,如SIGNALA:BIT_VECTOR(7DOWNTO0)NATUREAL自然数:整数的一个POSITIVE正整数:SEVRITYLEVEL错误等级:在VHDL仿真器中,错误等级用来设计系统的工作状态,共有四种可能的状态值:NOTE,WARNING,ERROR和FAILUREhwadee2020/2/1618IEEE预定义的标准逻辑位与矢量STD_LOGIC:工业标准的逻辑类型,取值为‘0’、‘1’、‘Z’、‘X’(强未知)、‘W’(弱未知)、‘L’(弱0)、‘H’(弱1)、‘—’(忽略)、‘U’(未初始化),只有前四种具有实际物理意义,其他的是为了与模拟环境相容才保留的STD_LOGIC_VECTOR:工业标准的逻辑类型集,STD_LOGIC的组合hwadee2020/2/1619用户自定义的数据类型用户自定义的数据类型有枚举类型、整数类型和实数类型、数组类型、记录类型四种枚举类型:TYPE数据类型名IS(枚举文字,枚举文字,....)整数类型与实数类型是标准包中预定义的整数类型的子集,由于综合器无法综合未限定范围的整数类型的信号或变量,故一定要用RANGE子句为所定义整数范围限定范围以使综合器能决定信号或变量的二进制的位数。格式:TYPE数据类型名ISRANGE约束范围;数组类型:数组是同一类型数据集合,记录内元素类型可以不同TYPE数据类型名ISARRAY(下限TO上限)OF类型名称,多维数组不能生成逻辑电路,只能用于仿真图形记录类型:TYPE记录类型名ISRECODE元素名:数据类型名;元素名:数据类型名;。。。。。。。。。。。。。ENDRECODEhwadee2020/2/1620用户自定义的数据类型举例RANGE其范围一般由调用者传递的参数决定hwadee2020/2/1621用户自定义的子类型对已定义类型作一些范围限制(也可以与原数据类型完全一致),定义格式为:SUBTYPE子类型名IS数据类型名(范围)hwadee2020/2/1622数据类型转换VHDL中,不同数据类型不能直接进行运算和代入,要进行运算或代入必需对类型进行转换,使之一致hwadee2020/2/1623BIT_VECTOR与STD_LOGIC_VECTOR代入STD_LOGIC_VECTOR的值只能是二进制,代入BIT_VECTOR的值除二进制外还可以是八进制和十六进制hwadee2020/2/1624数据类型的限定VHDL中有时可以用上下文关系来判断某一数据的数据类型,如果不能判断出来,就必需对数据进行类型限定,类似C中的强制类型转换hwadee2020/2/1625运算符:算术运算符,关系运算符,逻辑运算符与连接运算符hwadee2020/2/1626运算符的使用逻辑运算、算术运算、关系运算的左右以及代入的数据类型一定要相同VHDL中左右没有优先级的差异,如x=(aANDb)OR(NOTcANDd)能真正综合的算术运算符只有“+”,“-”,“*”;“MOD”,“REM”,“/”分母是2乘方时可综合,由于硬件特性,后4种应慎用,最好作适当变通“《=”应通过上下文关系判定是关系运算符还是代入符位的连接也可以采用集合的方式,把并置符改成“,”即可,如:temp_4=(‘1’,‘0’,‘1’,‘0’);其中temp_4为4位宽的位失量,但这种方式不能用于位失量连接,如:temp_4=(temp_2,temp_2);就是错误的hwadee2020/2/1627VHDL的主要描述语句顺序描述语句和并发描述语句是VHDL程序设计中两大基本描述语句系列顺序描述语名只出现在PROCESS和SUBPROGRAM中,语句按出现的次序加以执行对于FPGA搭建的应用系统,元件在定义的仿真时该应该是并发工作的,并发语句就用于表示这种并发行为hwadee2020/2/1628赋值语句赋值语句分为变量赋值和信号赋值,区别如下:格式:变量赋值为“变量名:=表达式”,信号赋值为“信号名=表达式”所用的地方:变量说明和使用都只能在顺序语句中(进程、函数),信号的说明只能在同步语句中,但可以在顺序语句和同步语句中使用赋值过程:变量的赋值是立即的,而信号的赋值的执行和信号值的更新至少要延时DELTA延时,只有延时后信号才能得到新值,否则将保持原值,在进程中,信号赋值在结束时起作用顺序语句hwadee2020/2/1629WAIT语句WAIT语句属于敏感信号激励信号,一个进程语句含有敏感信号时,进程中不能出现WAIT等待语句;当进程语句不含有敏感信号时,进程语句必须含有其