第3讲VHDL语言及应用_第1页
第3讲VHDL语言及应用_第2页
第3讲VHDL语言及应用_第3页
第3讲VHDL语言及应用_第4页
第3讲VHDL语言及应用_第5页
已阅读5页,还剩252页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录,一.VHDL语言概述,二.VHDL基本结构,三.VHDL语法规则,四.VHDL中的顺序语句,六.子程序及其调用,七.状态机的VHDL设计,五.VHDL中的并行语句,一.VHDL语言概述,1.什么是VHDL?,VHDL:,VHSIC(VeryHighSpeedIntegratedCircuit),Hardware,Description,Language,2.VHDL的历史,80年代初由美国国防部在实施超高速集成电路(VHSIC)项目时开发的。,1987年由IEEE协会批准为IEEE工业标准,称为IEEE1076-1987。,各EDA公司相继推出支持VHDL的设计环境。1993年被更新为93标准,即IEEE1076-1993。进一步提高抽象描述层次,扩展系统描述能力。,3.VHDL的作用,1)VHDL打破软、硬件的界限传统的数字系统设计分为:硬件设计(硬件设计人员)软件设计(软件设计人员),是电子系统设计者和EDA工具之间的界面,2)VHDL与C、C+的比较:C、C+代替汇编等语言VHDL代替原理图、逻辑状态图等,电路原理图描述必须给出完整的、具体的电路结构图,不能进行抽象描述。描述繁杂,效率低。电路原理图描述与实现工艺有关。,3)VHDL与电原理图描述的比较:VHDL具有较强的抽象描述能力,可进行系统行为级别的描述。描述更简洁,效率更高。VHDL描述与实现工艺无关。,VHDL具有强大语言结构,系统硬件描述能力强、设计效率高;具有较高的抽象描述能力。,4.VHDL语言特点,如一个8位全加器的电原理图,用VHDL描述的8位全加器:,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder8ISPORT(A:INSTD_LOGIC_VECTOR(7DOWNTO0);B:INSTD_LOGIC_VECTOR(7DOWNTO0);Cin:INSTD_LOGIC;Co:OUTSTD_LOGIC;Sum:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDadder8;ARCHITECTUREbehaveOFadder8ISSIGNALSint:STD_LOGIC_VECTOR(8DOWNTO0);SIGNALAA,BB:STD_LOGIC_VECTOR(8DOWNTO0);BEGINAA=0,VHDL语言可读性强,易于修改和发现错误。,VHDL具有丰富的仿真语句和库函数,可对VHDL源代码进行早期功能仿真,有利于大系统的设计与验证。,VHDL设计与硬件电路关系不大。,VHDL设计不依赖于器件,与工艺无关。,VHDL是一种并行语言,其编程思想与传统顺序执行的计算机语言(如C、Pascal)有很大区别。,移植性好。,5.VHDL与其它硬件描述语言的比较,行为级,RTL级,门电路级,VHDL:具有较强的系统抽象描述能力,适合行为级和RTL级的描述。设计者可不必了解电路细节,所作工作较少,效率高。但对综合器的要求高。不易控制底层电路的生成。IEEE标准,支持广泛。RTL:RegisterTranslateLevel,VerilogHDL:系统级抽象描述能力比VHDL稍差;门级开关电路描述方面比VHDL强。适合RTL级和门电路级的描述。设计者需要了解电路细节,所作工作较多。IEEE标准,支持广泛。,ABEL、PALASM、AHDL(AlteraHDL):系统级抽象描述能力差,一般作门级电路描述。要求设计者对电路细节有详细的了解。对综合器的性能要求低,易于控制电路资源。支持少。,6.VHDL设计简述,VHDL主要用于描述数字系统的结构、行为、功能和接口。,VHDL将一个设计(元件、电路、系统)分为:,外部(可视部分、端口)内部(不可视部分、内部功能、算法),ARCHITECTUREProcessProcessSequentialCombinationalProcessProcesscomponent,外部与内部:,器件或子系统,ENTITY,2选1选择器的VHDL描述:,Libraryieee;Useieee.std_logic_1164.all;Entitymux21isport(a,b:instd_logic;s:instd_logic;Y:outstd_logic);endmux21;Architecturemux_archofmux21isBeginY=awhens=0elsebwhens=1;-当s=1输出为bEndmux_arch;,二.VHDL基本结构,一个完整的VHDL设计文件,或者说设计实体,通常要求最低能为VHDL综合器所支持,并能作为一个独立的设计单元(模块),即元件的形式而存在的VHDL描述。这里的所谓元件,既可以被高层次的系统所调用,成为该系统的一部分;也可以作为一个电路功能块而独立存在和独立运行。在VHDL源文件中,通常包含实体(ENTITY)、结构体(ARCHITECTURE)、配置(CONFIGURATION)、和库(LIBRARY)程序包(PACKAGE)4个部分,其中实体和结构体这两个基本结构是必需的。,库、程序包,配置(Configuration),1.实体(Entity)定义系统的输入输出端口和类属参数描述。,实体语句的书写格式如下:ENTITY实体名ISGENERIC(类属表);PORT(端口表);END实体名;(1076-1987version)ENDENTITY实体名;(1076-1993version),注:在MAX+PLUSII和QUARTUSII开发工具中实体名与保存该实体的VHDL源文件名必须是一样的。,类属(generic)说明语句用以设定实体或元件的内部电路结构和规模。它常用于定义实体端口的大小、设计实体的物理特性、总线宽度、元件例化的数量等。模块化设计时多用于不同层次模块之间信息的传递。可从外部改变内部电路结构和规模。必须放在端口说明之前。,Generic(常数名称:数据类型:=设定值;常数名称:数据类型:=设定值);-注意最后语句的分号在括号外,例:,EntitymckisGeneric(width:integer:=16);Port(add_bus:outstd_logic_vector(width-1downto0);.,例:2输入与门的实体描述,Entityand_2isGeneric(risewidth:time:=1ns;fallwidth:time:=1ns);port(a1:instd_logic;a0:instd_logic;Z0:outstd_logic);endentityand_2;,注:数据类型time用于仿真模块的设计。综合器仅支持数据类型为整型的类属值。,端口(PORT)说明语句确定输入输出端口的数目和类型。,PORT(端口名,端口名:端口模式数据类型;端口名,端口名:端口模式数据类型);-注意最后语句的分号在括号外,其中,端口模式:in输入型,此端口为只读型。out输出型,此端口只能在实体内部对其赋值。inout输入输出型,既可读也可赋值。buffer输出缓冲型,与out相似,但可读。,数据类型:指端口上流动的数据的表达格式。为预先定义好的数据类型。如:bit、bit_vector、integer、std_logic、std_logic_vector等。,端口模式示意图,例:,Entitynand_2isPort(a,b:inbit;z:outbit);Endnand_2;,结构体(ARCHITECTURE又叫构造体)作用:定义系统(或模块)的行为、元件及内部连接关系,即描述其逻辑功能。一个完整的结构体一般由两大部分组成:结构体的说明(可选项)和结构体功能描述,,说明语句:对数据类型、常数、信号、子程序和元件等因素进行说明的部分;,功能描述语句:以各种不同的描述风格描述系统的逻辑功能部分。包括各种顺序语句和并行语句。,结构体的基本组成框图:,实体与结构体的关系:一个设计实体可有多个结构体,代表实体的多种实现方式。各个结构体的地位相同。,结构体语句的书写格式如下:ARCHITECTURE结构体名OF实体名IS说明语句内部信号、常数、数据类型、子程序(函数、过程)、元件等的说明;BEGIN功能描述(并行处理)语句;ENDARCHITECTURE结构体名;,注:同一实体的结构体不能同名。定义语句中的常数、信号不能与实体中的端口同名。,例:结构体中错误的信号声明,EntityxisPort(sig,const:inbit;out1,out2:outbit);Endx;Architectureexampleofxissignalsig:bit;constantconst:bit:=1;begin.Endexample;,例:一个完整描述(3bit计数器),Entitycounter3isPort(clk,reset:inbit;count:outintegerrange0to7);Endcounter3;Architecturemy_archofcounter3issignalcount_tmp:integerrange0to7;beginprocessbeginwaituntil(clkeventandclk=1);ifreset=1orcount_tmp=7thencount_tmp=0;elsecount_tmp=count_tmp+1endif;endprocess;count=count_tmp;Endmy_arch;,3bit计数器的等效描述(out与buffer的区别),Entitycounter3isPort(clk,reset:inbit;count:bufferintegerrange0to7);Endcounter3;Architecturemy_archofcounter3is-signalcount_tmp:integerrange0to7;beginprocessbeginwaituntil(clkeventandclk=1);ifreset=1orcount=7thencount=0;elsecount=count+1endif;endprocess;Endmy_arch;,一个设计实体的多种实现方式,3.配置(configuration)从某个实体的多种结构体描述方式中选择特定的一个。,简单配置的语法:CONFIGURATION配置名OF实体名ISFOR选配结构体名ENDFOR;END配置名;,例:一个与非门不同实现方式的配置如下:,Libraryieee;Useieee.std_logic_1164.all;Entitynand_2isPort(a:instd_logic;b:instd_logic;c:outstd_logic);Endentitynand_2;Architectureart1ofnand_2isbeginc=not(aandb);Endarchitectureart1;,Architectureart2ofnand_2isbeginc=1when(a=0)and(b=0)else1when(a=0)and(b=1)else1when(a=1)and(b=0)else0when(a=1)and(b=1)else0;Endarchitectureart2;,Configurationfirstofnand_2isForart1Endfor;Endfirst;Configurationsecondofnand_2isForart2Endfor;Endsecond;,例:一个对计数器实现多种形式的配置如下:,EntitycounterisPort(clear,clk:inbit;date_out:outinteger);Endentitycounter;Architecturecount_255ofcounteris-8bitcounterbeginProcess(clk)variablecount:integer:=0;beginifclear=1thencount=0;elsifclkeventandclk=1thenifcount=255thencount=0;elsecount=count+1;endif;endif;data_out=count;endprocess;endcount_255;,Architecturecount_64kofcounteris-16bitcounterbeginProcess(clk)variablecount:integer:=0;beginifclear=1thencount=0;elsifclkeventandclk=1thenifcount=65535thencount=0;elsecount=count+1;endif;endif;data_out=count;endprocess;endcount_64k;,Configurationsmall_countofcounterisForcount_255Endfor;Endsmall_count;Configurationbig_countofcounterisForcount_64kEndfor;Endbig_count;,4.程序包、库程序包(PACKAGE):已定义的常数、数据类型、元件调用说明、子程序的一个集合。目的:方便公共信息、资源的访问和共享。库(LIBRARY):多个程序包构成库。,程序包(PACKAGE)程序包说明的内容:常数说明;VHDL数据类型说明;元件说明;子程序说明;程序包的结构包括:程序包说明(包首)程序包主体(包体),(1)程序包说明(包首)语法:,Package程序包名is包说明项End程序包名;,包说明项可由以下语句组成:use语句(用来包括其它程序包);类型说明;子类型说明;常量说明;信号说明;子程序说明;元件说明。,例:程序包说明,Packageexampleistypebyteisrange0to255;subtypenibbleisbyterange0to15;constantbyte_ff:byte:=255;signaladdend:nibble;componentbyte_adderport(a,b:inbyte;c:outbyte;overflow:outboolean);endcomponent;functionmy_function(a:inbyte)returnbyte;endexample;,(2)程序包包体子程序的实现算法。包体语法:,Packagebody程序包名is包体说明项End程序包名;,包体说明项可含:use语句;子程序说明;子程序主体;类型说明;子类型说明;常量说明。,程序包首与程序包体的关系:程序包体并非必须,只有在程序包中要说明子程序时,程序包体才是必须的。程序包首可以独立定义和使用。,Packagesevenissubtypesegmentsisbit_vector(0to6);typebcdisrange0to9;Endseven;Librarywork;Usework.seven.all;Entitydecoderisport(input:inbcd;drive:outsegments);Enddecoder;ArchitectureartofdecoderisBegin,Withinputselectdrive=B“1111110”when0,B“0110000”when1,B“1101101”when2,B“1111001”when3,B“0110011”when4,B“1011011”when5,B“1011111”when6,B“1110000”when7,B“1111111”when8,B“1111011”when9,B“0000000”whenothers;Endarchitectureart;,库(LIBRARY)的种类VHDL库可分为5种:(1)IEEE库定义了四个常用的程序包:std_logic_1164(std_logictypesuse库名.程序包名.All;,例:,Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.conv_integer;,例:2选1选择器,Libraryieee;Useieee.std_logic_1164.all;Entitymux21isport(a,b:instd_logic;s:instd_logic;Y:outstd_logic);endmux21;Architecturemux_archofmux21isBeginY=awhens=0elsebwhens=1;Endmux_arch;,2选1的另外一种描述,Entitymux21isport(a,b:inbit;s:inbit;Y:outbit);endmux21;Architecturemux_archofmux21isBeginY=awhens=0elsebwhens=1;Endmux_arch;,总结:VHDL语言的一些基本特点:VHDL语言由保留关键字组成;一般VHDL语言对字母大小写不敏感;例外:、“”所括的字符、字符串;每条VHDL语句由一个分号(;)结束;VHDL语言对空格不敏感,增加可读性;在“-”之后的是对VHDL的注释语句;VHDL有以下描述风格:行为描述;数据流(寄存器传输RTL)描述;结构化描述。,三.VHDL语法规则,VHDL具有计算机编程语言的一般特性,其语法规则是编程语句的基本要求,反映了VHDL语言的特征。VHDL的语言规则主要有VHDL文字规则、数据对象、数据类型和各类操作数及运算操作符。,1.文字规则,数字型文字、字符文字、标识符、下标名、段名,数字型文字:(1)整数文字:十进制整数如:5,678,156E2(=15600),45_234_287(=15234287)(2)实数文字:带小数的十进制数如:23.34,2.0,44.99E-2(=0.4499)88_67_551.23_909(=8867551.23909),(3)以数制基数表示的文字格式:基数#数字文字#E指数如:10#170#(=170)2#1111_1110#(=254)16#E#E1(=2#1110_0000#=224)或:(=1416=224)16#F.01#E+2(=(15+1/(1616)1616=3841.00,(4)物理量文字如:60s、100m、177A注:整数可综合实现;实数一般不可综合实现;物理量不可综合实现。,字符文字:字符:用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母。如:A,*,4,Z字符串:用双引号引起来的一维字符数组。字符串分为:,文字字符串:“文字”如:“ERROR”,“XXXXXXXX”,“ZZZZZZZZ”,“X”,“BOTHSANDQEQUALTOL”.数位字符串:称为位矢量,代表二进制、八进制、十六进制的数组。其位矢量的长度为等值的二进制数的位数。格式:基数符号“数值”,其中基数符号有三种:B:二进制基数符号。O:八进制基数符号,每一个八进制数代表一个3位的二进制数。X:十六进制基数符号,每一个十六进制数代表一个4位的二进制数。如:B“1_1101_1110”二进制数数组,长度为9O“34”八进制数数组,长度为6X“1AB”十六进制数数组,长度为12,标识符:最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。基本标识符的要求(87标准):a.以英文字母开头;b.不连续使用下划线“_”;c.不以下划线“_”结尾;d.VHDL的关键字不能作为标识符使用;e.英文字母不区分大小写;f.由26个大小写英文字母、数字09及下划线“_”组成的字符串。,合法标识符如下:my_counter、Decoder_1、FFTSig_N、Not_Ack、State0非法标志识如下:_Decoder_1、2FFT、Sig_#N、Not-AckALL_RST_、data_BUS、return、entity,扩展标识符(93标准):以反斜杠来界定,免去了87标准中基本标识符的一些限制。a.可以以数字打头;b.允许包含图形符号;c.允许使用VHDL保留字;d.区分字母大小写等。如:74LS163Sig_#NentityENTITY,下标名及下标段名下标名:用于指示数组型变量或信号的某一元素。其书写格式如下:信号或变量名(表达式)下标段名:用于指示数组型变量或信号的某一段元素(数组),其书写格式如下:信号名或变量名(表达式1TO/DOWNTO表达式2);如:a:std_logic_vector(7downto0)a(7),a(6)a(0)a(7downto0),a(7downto4),a(5downto3),例如:下面是下标名和下标段名使用示例。SIGNALa,b,c:BIT_VECTOR(0TO7);SIGNALs:INTEGERRANGE0TO3;SIGNALx,y:BIT;x=a(s);y=b(3);c(0TO3)=a(2TO5);-以段的方式进行赋值c(4TO7)=b(7DOWNTO4);-以段的方式进行赋值上例中,a(s)为下标语句,s是不可计算的下标名,只能在特定情况下进行综合;b(3)的下标为3,可以进行综合。c(0TO3)、a(2TO5)、c(4TO7)和b(7DOWNTO4)为下标段语句。,2.数据对象,在VHDL中,数据对象(Dataobjects)类似于一种容器,它接受不同数据类型的赋值。VHDL的数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。前两种数据对象与传统的高级语言中的变量和常量十分相似。但信号这一数据对象比较特殊,它具有更多的硬件特征,是VHDL中最有特色的语言要素之一。,常量是一个恒定不变的值,一旦作了数据类型和赋值定义后,在设计实体中不能再改变,因而具有全局性意义。一般常量代表数字电路中的电源、地、恒定逻辑值等常数。,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出它做出定义的当前进程和子程序中。变量常用在实现某种算法的赋值语句中,主要作用是在进程中作为临时的数据存储单元,不具有实际电路的物理意义。,信号是描述硬件系统的基本特征,它类似于电子电路内部的连接线,包括输入输出端口。信号可以作为设计实体中并行语句模块间的信息交流通道。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系,因此它十分类似于AHDL语言中节点NODE的功能,只是不必注明信号上数据流动的方向。,信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。信号的赋值可以出现在一个进程中,也可以直接出现在结构体中,但它们运行的含义是不一样的。在进程中,只能将信号列入敏感表,而不能将变量列人敏感表。可见进程只对信号敏感,而对变量不敏感。,信号与实体的端口(PORT)概念是一致的。对于端口来说,其区别只是输出端口不能读入数据,输入端口不能被赋值。信号可以看成是实体内部的端口,既可以读数据,也可以被赋值。反之,实体的端口只是一种隐形的信号定义,并附加了数据流动的方向。信号本身的定义是一种显式的定义,因此在实体中定义的端口,在其结构体中都可以看成是一个信号,并加以使用而不必另作定义。,常数说明对某一个常量名赋予一个固定的值。格式:constant常数名:数据类型:=表达式;例:constantdata:bit_vector(3downto0):=“1010”;constantwidth:integer:=8;constantx:new_bit:=x;常量数据类型必须与表达式的数据类型一致。,常量的作用范围:,常量是全局量,其作用范围取决于常量被定义的位置。,变量说明变量是一个局部量,只能在进程和子程序中定义、使用。其作用范围仅限于定义了变量的进程和子程序中。格式:variable变量名:数据类型约束条件:=表达式例:variablea,b:bit;variablecount:integerrange0to255:=10;变量的初值可用于仿真,但综合时被忽略。,信号说明电子硬件系统运行的基本特性:各部分电路工作的并行特性;信号传输过程中的延时特性;多驱动源的总线特性;时序电路中触发器的记忆特性等。信号是电子系统内部硬件连接和硬件特性的抽象表示。用来描述硬件系统的基本特性。格式:signal信号名:数据类型约束条件:=表达式;,例:signala,b:bit;signalinit:integer:=-1;signals1:std_logic:=0;signals2:std_logic_vector(15downto0);,注:a.综合时初值被忽略。b.信号是全局量。可在结构体、实体、块中说明和使用信号。c.在进程和子程序中只能使用信号,不能说明信号。,例:进程中信号与变量的使用entityexisport();endex;architecturearch_exofexissignala,b:std_logic;beginprocess(a,b)variablec,d:std_logic;beginc:=a+b;d:=a-b;.endprocess;endarch_ex;,3.数据类型,VHDL是一种强数据类型语言。VHDL对每一个常数、变量、信号、函数及设定的各种参量的数据类型都有严格要求,相同数据类型的量才能互相传递和作用。VHDL作为强类型语言好处是使VHDL编译或综合工具很容易找出设计中的各种常见错误。,VHDL数据类型分为四大类:标量类型(SCALARTYPE)复合类型(COMPOSITETYPE)存取类型(ACCESSTYPE)文件类型(FILESTYPE)又分为:预定义数据类型用户自定义数据类型,VHDL的预定义数据类型VHDL的预定义的数据类型都在VHDL标准程序包STANDARD中定义了,在实际使用中,自动包含进VHDL的源文件。因此不需要再用USE语句以显式说明。,a.布尔量(BOOLEAN)数据类型一个布尔量具有两种状态,“TRUE(真)”或者“FALSE(假)”。常用于逻辑函数,如相等(=)、比较()等中作逻辑比较。如,bit值转化成boolean值:boolean_var:=(bit_var=1);,b.位(BIT)数据类型表示数字系统中的信号值,为逻辑数据类型。位值只能是字符0或者1(将值放在单引号中)表示。与整数中的1和0不同,1和0仅仅表示一个位的两种取值。可以参与逻辑运算,其结果仍是位的数据类型。,c.位矢量(BIT_VECTOR)数据类型位矢量是用双引号括起来的一组数据。例如:“001100”,X“00bb”。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线状态是最形象也最方便的。使用位矢量时必须注明位宽,即数组中元素个数和排列,例如:表示信号a中有8个元素SIGNALa:BIT_VECTOR(7DOWNTO0);,d.字符(CHARACTER)数据类型用单引号将字符括起来。variablecharacter_var:character;.character_var:=A;,e.整数(INTEGER)数据类型整数与数学中整数的定义相似,可以使用预定义运算操作符,如加“”、减“”、乘“”、除“”进行算术运算。intger表示所有正的和负的整数。硬件实现时,利用32位的位矢量来表示。可实现的整数范围为:-(231-1)to(231-1),VHDL综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路。如:S1GNALdata1:INTEGERRANGE0T015;规定信号data1为整数,其取值范围是015共16个值,可用4位二进制数来表示,可被综合成四条信号线构成的信号。,自然数(NATURAL)和正整数(POSITIVE)数据类型NATURAL是INTEGER类型的子类型,表示非负整数。POSITIVE是INTEGER类型的子类型,表示正整数。定义如下:subtypenaturalisintegerrange0tointegerhigh;subtypepositiveisintegerrange1tointegerhigh;,g.实数(REAL)数据类型或称浮点数取值范围:-1.0E38+1.0E38实数类型仅能用于VHDL仿真器,一般综合器不支持。h.字符串(STRING)string是character类型的一个非限定数组,用双引号将一串字符括起来。如:variableS1:string(1to7);.S1:=“Rosebud”;,i.时间(TIME)数据类型由整数和物理单位组成.如:55ms,20nsj.错误等级(SEVERITY_LEVEL)仿真中用来指示系统的工作状态,共有四种:NOTE(注意)WARNING(警告)ERROR(出错)FAILURE(失败),IEEE预定义标准逻辑位与矢量在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_LOGIC和标准逻辑矢量STD_LOGIC_VECTOR。,a.标准逻辑位STD_LOGIC数据类型在IEEE库程序包STD_LOGIC_1164中的STD_LOGIC数据类型定义如下:TYPEstd_logicIS(U,X,0,1,Z,W,L,H,-);其含义为:末初始化的、强未知的、强0、强1、高阻态、弱未知的,弱0,弱1,忽略等。STD_LOGIC是标准BIT数据类型的扩展,共定义了九种值,这意味着,对于定义为数据类型是标准逻辑位STD_LOGIC的数据对象,其可能的取值已非传统的BIT那样只有逻辑0和逻辑1两种取值,而是如上定义的那样有九种可能的取值。,对于综合器而言,STD_LOGIC型数据能够在数字器件中实现的只有其中的四种值,即、0、1和Z。当然这并不表明其余的五种值不存在。这九种值对于VHDL的行为仿真都有重要意义。,b.标准逻辑矢量STD_LOGIC_VECTOR数据类型STD_LOGIC_VECTOR是定义在STD_LOGIC_1164程序包中的标准一维数组,数组中的每一个元素的数据类型都是以上定义的标准逻辑位STD_LOGIC。,其它预定义标准数据类型VHDL综合工具配带的扩展程序包中,定义了些有用的类型。如:Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义的数据类型有:a.无符号型(UNSIGNED)unsigned(“1000”)=8最左边是最高位:variablevar:unsigned(0to10);var(0)是最高位signalsig:unsigned(5downto0);sig(5)是最高位,Synopsys公司在IEEE库中加入的程序包STD_LOGIC_UNSIGNED中已定义了多种可供不同数据类型间操作的算符重载函数,只要引用这程序包,INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之间即可以混合运算。,b.有符号型(SIGNED)最高位为符号位,综合器认作补码。signed(“0101”)=5signed(“1011”)=-5variablevar:signed(0to10);var(0)是符号位c.小整数(SMALL_INT):0TO1,例八位二进制全加器行为描述如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadder8ISPORT(A:INSTD_LOGIC_VECTOR(7DOWNTO0);B:INSTD_LOGIC_VECTOR(7DOWNTO0);Cin:INSTD_LOGIC;Co:OUTSTD_LOGIC;Sum:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDadder8;ARCHITECTUREbehaveOFadder8ISSIGNALSint:STD_LOGIC_VECTOR(8DOWNTO0);SIGNALAA,BB:STD_LOGIC_VECTOR(8DOWNTO0);BEGINAA=0,用户自定义类型用户自定义类型是VHDL语言的一大特色。可由用户定义的数据类型有:a.枚举类型b.整数和实数类型c.数组类型d.记录类型e.子类型,用类型定义语句TYPE和子类型定义语句SUBTYPE实现用户自定义数据类型。TYPE语句格式:type数据类型名is数据类型定义of基本数据类型;例:typebyteisarray(7downto0)ofbit;variableaddend:byte;typeweekis(sun,mon,tue,wed,thu,fri,sat);SUBTYPE语句格式:subtype子类型名is基本数据类型约束范围;例:subtypedigitsisintegerrange0to9;,a.枚举类型枚举该类型的所有可能的值。格式:type类型名称is(元素1,元素2,);如:typecoloris(blue,green,yellow,red);typemy_logicis(0,1,U,Z);variablehue:color;signalsig:my_logic;hue:=blue;sig=Z;,b.整数类型用户定义的整数类型是标准包中整数类型的子范围。格式:type类型名称isintegerrange整数范围;例:typemy_integerisintegerrange0to9;c.数组类型数组:同类型元素的集合。VHDL支持多维数组。多维数组的声明:typebyteisarray(7downto0)ofbit;typevectorisarray(3downto0)ofbyte;限定数组、非限定数组、属性。,限定数组:其索引范围有一定的限制。格式:type数组名isarray(数组范围)of数据类型非限定数组:数组索引范围被定义成一个类型范围。格式:type数组名isarray(类型名称range)of数据类型;例:typebit_vectorisarray(integerrange)ofbit;variablemy_vector:bit_vector(5downto-5);,属性:VHDL为多种类型定义了属性。语法如下:对象属性VHDL为数组预先定义的属性:leftrighthighlowlengthrangereverse_range,例:variablemy_vector:bit_vector(5downto-5)各属性如下:my_vectorleft5my_vectorright-5my_vectorhigh5my_vectorlow-5my_vectorlength11my_vectorrange(5downto-5)my_vectorreverse_range(-5to5),d.记录类型记录是不同类型的名称域的集合。格式如下:type记录类型名isrecord元素名1:数据类型名;元素名2:数据类型名;endrecord;访问记录体元素的方式:记录体名.元素名,例:constantlen:integer:=8;subtypebyte_vecisbit_vector(len-1downto0);typebyte_and_ixisrecordbyte:byte_vec;ix:integerrange0tolen;endrecord;signalx,y,z:byte_and_ix;signaldata:byte_vec;signalnum:integer;.x.byte=“11110000”;x.ix=2;data=y.byte;num=y.ix;z=x;,4.VHDL操作符,VHDL的各种表达式是由操作数和操作符组成,其中操作数是各种运算的对象,而操作符则规定运算的方式。需要指出的是操作符操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。在VHDL语言中共有如下4类操作符:,逻辑运算符:可以对“STD_LOGIC”和“BIT”等逻辑型数据、“STD_LOGIC_VECTOR”逻辑型数组及布尔数据进行逻辑运算。VHDL综合器将逻辑运算直接生成组合逻辑电路。,并置运算符“10”例外:当逻辑表达式中只有“and”、“or”、“xor”运算符时,可以省略括号。如:a=bandcanddande;a=borcordore;a=用于比较相同类型的两个操作数,返回boolean值。加减运算符:加操作符“+”、减操作符“-”、串联(并置)操作符“Signalb,c,g:bit_vector(1downto0);Signale:bit_vector(2downto0);Signalf,h,i:bit;,a=notb-elementSignalc:std_logic_vector(1to4);a:=1;b:=0;c=“1100”;c(3)=1;,一位值用单引号,多位值用双引号,例如:对信号和变量赋值,Signala,b,c,d:std_logic;Signals:std_logic_vector(1to4);s=“0100”;(a,b,c,d)=s;,位置关联,变量赋值与信号赋值变量与信号的差异:1)赋值方式的不同:变量:=表达式;信号=表达式;2)硬件实现的功能不同:信号代表电路单元、功能模块间的互联,代表实际的硬件连线。变量代表电路单元内部的操作,代表暂存的临时数据。,SIGNALDeclarations,3)有效范围的不同:信号:程序包、实体、结构体;全局变量。变量:进程、子程序;局部变量。,Label1:PROCESSVARIABLEDeclarations,Label2:PROCESSVARIABLEDeclarations,ARCHITECTURE,4)赋值行为的不同:信号赋值延迟更新数值、时序电路;变量赋值立即更新数值、组合电路。5)信号的多次赋值a.一个进程:最后一次赋值有效b.多个进程:多源驱动线与、线或、三态,例:信号的多次赋值,Architecturert1ofexissignala:std_logic;Beginprocess(.)begina=b;.a=c;endprocess;endrt1;,Architecturert1ofexissignala:std_logic;Beginprocess(.)begina=b;endprocess;process(.)begina=c;.endprocess;Endrt1;,三态缓冲器总线结构与多驱动信号定义:给一个信号赋值,即为该信号创建一个驱动器(驱动信号)。多个进程或并发语句给同一个信号赋值,则该信号为多信号源驱动。例:a_out=awhenenable_aelseZ;b_out=bwhenenable_belseZ;process(a_out)beginsig=a_out;endprocess;process(b_out)beginsig=b_out;endprocess;,例:信号赋值与变量赋值的比较信号赋值:architecturert1ofsigissignala,b:std_logic;-定义信号beginprocess(a,b)begina=b;b=a;endprocess;endrt1;,-结果是a和b的值互换,变量赋值:architecturert1ofvarisbeginprocess(a,b)variablea,b:std_logic;-定义变量begina:=b;b:=a;endprocess;endrt1;,-结果是a和b的值都等于b的初值,例:变量赋值实现循环语句功能process(indicator,sig)variabletemp:std_logic;begintemp:=0;foriin0to3looptemp:=tempxor(sig(i)andindicator(i);endloop;output=temp;endprocess;,以上语句等效为:process(indicator,sig)variabletemp:std_logic;begintemp:=0;temp:=tempxor(sig(0)andindicator(0);temp:=tempxor(sig(1)andindicator(1);temp:=tempxor(sig(2)andindicator(2);temp:=tempxor(sig(3)andindicator(3);output=temp;endprocess;,如改为信号,无法实现原功能:.signaltemp:std_logic;.process(indicator,sig)begintemp=0;temp=tempxor(sig(0)andindicator(0);temp=tempxor(sig(1)andindicator(1);temp=tempxor(sig(2)andindicator(2);temp=tempxor(sig(3)andindicator(3);output=temp;endprocess;,流程控制语句通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。流程控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。,2.流程控制语句,IF语句IF-THEN语句是根据所指定的条件来确定执行哪些语句,条件应为布尔表达式,如果规定的条件判断为“1”(TRUE),则执行then后的语句;如果为“0”(FALSE),则执行ELSE后的语句。与C语言程序中的IF语句是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论