-VHDL的基本元素.ppt_第1页
-VHDL的基本元素.ppt_第2页
-VHDL的基本元素.ppt_第3页
-VHDL的基本元素.ppt_第4页
-VHDL的基本元素.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

可编程逻辑器件应用,主讲人:刘文怡,第6讲:VHDL的基本元素,1标识符2数据对象3数据类型4操作符5端口模式,漂亮的程序(回顾),Fengzhuang_kaishiport(IN1:in;IN2:in;IN3:in;IN4:in;OUT4:out)Fengzhuang_jieshuGongneng_kaishisignalT1,T2;OUT4=T1orT2;T2=IN3andIN4;T1=IN1andIN2;Gongneng_jieshu,1、为了用起来像个函数的样子,不妨加个port关键词,把输入输出引脚象参数一样排列起来。2、很好地表达了4个输入引脚,1个输出引脚。3、提供给别人调用。,1、内部功能实现的细节2、T1、T2似乎有点奇怪,哪来的?3、那我们也规定先定义,后使用!,LibraryIEEE;UseIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:inbit;q:outbit);ENDmux;,Architecturedataflowofmuxissignaltmp1,tmp2,tmp3:bit;Begintmp1=d0andsel;tmp2=d1and(notsel);tmp3=tmp1ortmp2;q=tmp3;Enddataflow;,VHDL语言如何做的?(回顾),实体声明(回顾),实体声明语法:ENTITY实体名IS类属参数说明;端口说明;END实体名;举例:ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;,结构体的一般书写格式(回顾),ARCHITECTURE结构体名OF实体名IS定义语句内部信号,常数,数据类型,函数等的定义;BEGIN功能描述语句并行处理语句;END结构体名;,实体名必须是所在设计实体的名字,结构体名由设计者定义,但当一个实体具有多个结构体时,结构体的取名不可重复。,PROCESS语句(回顾),进程名:PROCESS(敏感信号表)IS变量说明语句变量说明语句BEGIN进程内逻辑语句ENDPROCESS进程名;,process语句使用的类型、常量、变量、子程序声明、子程序体、属性声明等,但不能有信号声明*,可有可无,区分不同进程,1标识符,标识符规则是VHDL语言中符号书写的一般规则。不仅对电子系统设计工程师是一个约束,同时也为各种各样的EDA工具提供了标准的书写规范。VHDL语言有两个标准版:VHDL87版和VHDL93版。VHDL87版的标识符语法规则经过扩展后,形成了VHDL93版的标识符语法规则。前一部分称为短标识符,扩展部分称为扩展标识符。VHDL93版含有短标识符和扩展标识符两部分。,短标识符(1),短标识符在VHDL语言中使用的名字,如信号名、实体名、结构体名、变量名、各种进程标记、块标记等命名时,采用短标识符要遵守以下规则:(1)必须以英文字母打头。(2)字符可以是大小写的字符、数字(09)和下划线(_)。(3)下划线前后都必须有英文字母或数字。(4)短标识符不区分大小写。一般地,对VHDL的保留字:ENTITY,ARCHITECTURE,END,BUS,USE,WHEN,WAIT,IS在程序书写时,一般要求大写或黑体,使得程序易于阅读,易于检查错误。,短标识符(2),下面是合法的标识符:multi_screens、Multi_screensMulti_Screens、MULTI_SCREENS下面的书写是不合法的:illegal%nameillegal-nameillegal-name命名规则举例:SIGNALsel:INTEGER;SIGNALPCI_BUS:STD_LOGIC_VECTOR(31DOWNTOO);SIGNAL8_BUS:.-数字开头,是错误的名字SIGNALPCI_BUS:.-是非法符号SIGNALPCI_BUS_:.-结尾不能用连字符,扩展标识符,扩展标识符是VHDL93版增加的标识符书写规则:(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不同。,2数据对象,在VHDL语言中,凡是可以赋予一个值的客体叫对象。VHDL对象包含有专门数据类型,主要有4个基本类型:常量(CONSTANT)、信号(SIGNAL)、变量(VARIABLE)和文件(FILES)。其中文件类型是VHDL93标准中新通过的。信号和变量可以连续的赋予不同的值。常量只在它被说明时赋值,在整个器件工作期间值不变化。试图对常量多次赋值是错误的。文件可以用参数向子程序传递数据,通过子程序对文件进行读和写操作。文件不可以通过赋值来更新文件的内容,文件参数没有模式。,数据对象声明举例,对象说明的一般书写格式为:对象类别标识符表:子类型标识:=初值;对象说明举例:CONSTANTT1,T2:time:=30ns;-常量说明VARIABLESUM:read;-变量说明SIGNALCLOCK:bit;-信号说明,常量,常量(constant)是设计者给实体中某一常量名赋予的固定值。一般地,常量赋值在程序开始前进行说明,数据类型在实体说明语句中指明。常量说明的一般格式如下:CONSTANT常数名:数据类型:表达式;根据上面的格式,举例如下:8位寄存器宽度指定:CONSTANTregw:integer:8;设计实体的电源供电电压指定:CONSTANTVcc:real:5.0;某一模块信号输入/输出的延迟时间:CONSTANTDALY:time:100ns;,常量,常量标识符、WIDTH,VCC,DALY,PBUS等在VHDL程序中多处有用,其值在运行中不变。若要改变常量值,必须要改变设计,改变实体中的常量说明,然后重新编译。常数所赋的值应和定义的数据类型一致;常量必须在程序包、实体、结构体或进程的说明区域中对常量的标识符、类型、常量值进行指定。定义在程序包中的常量由所在的实体或结构体调用。定义在实体内的常量仅在实体内使用,定义在进程内的常量仅在进程内使用。,变量,变量(variables)仅用在进程语句、函数语句、过程语句中的结构中使用,变量是一个局部量,变量的赋值立即生效,不产生赋值延时。变量书写的一般格式为:VARIABLES变量名:数据类型约束条件:表达式;根据上述格式,举例如下:VARIABLESresult:std_logic:0;变量赋初值VARIABLESx,y,z:integer;VARIABLEScount:integerrange0TO255:10;变量不能加附加延时,如”after10ns”。,变量,在VHDL语言中,变量的使用规则和限制范围说明如下:变量赋值是直接非预设的。在某一时刻仅包含了一个值。变量赋值和初始化赋值符号用“:”表示。变量不能用于硬件连线和存储元件。在仿真模型中,变量用于高层次建模。在系统综合时,变量用于计算,作为索引载体和数据暂存。在进程中,变量的使用范围在进程之内。若将变量用于进程之外,必须将该值赋给一个相同类型的信号,即进程之间传递数据靠的是信号。,信号,信号(signal)是电子电路内部硬件实体相互连接的抽象表示。信号通常在构造体、包集合和实体说明中使用,其一般书写格式为:SIGNAL信号名:数据类型、约束条件:表达式;使用上述格式举例如下:SIGNALsys_clk:BIT:=0;-系统时钟信号SIGNALcount:bit_vector(7downto0);-计数器宽度,信号,有关信号的使用规则说明如下:“:=”表示对信号直接赋值,表示信号初始值不产生延时。“=”表示代入赋值,是变量之间信号的传递,代入赋值法允许产生延时。例如:T1=T2;在仿真中,初始化能保证信号设定在指定值上。对于存储元件的加电初始状态,应该设计复位或予置位机构,而不是通过信号指定初始化值来实现。在EDA工具综合时,信号应在结构体中描述清楚。在进程中,变量的使用范围在进程之内。若将变量用于进程之外,必须将该值赋给一个相同类型的信号,即进程之间传递数据靠的是信号。,信号和变量代入的区别,声明的形式与位置不同:信号在结构体中声明;变量在进程中声明。赋值符号不同:count=“00000000”;data:=“00000000”;进程对信号敏感,对变量不敏感作用域不同:信号可以是多个进程的全局信号;变量只在定义后的顺序域可见。,信号和变量代入的区别,数据对象赋值的补充说明,可用函数调用的方法给对象赋初值。CONSTANTBus_number:Integer:My_function(True,6);如果在同一个对象说明语句中,对多个同一类型的对象指定初始值,则多个对象同时取得了这一指定值。信号和变量的默认值。当信号和变量没有指定初始值或没有给信号变量赋值时,即信号和变量的值在对象说明语句中默认时,信号变量的取值称为默认值。一般地,若变量、信号为数值型变量,则取初始值,默认值为0.,3数据类型,VHDL语言标准定义了10种标准的数据类型。为了方便设计,允许用户自定义数据类型。VHDL语言程序是系统行为的描述、功能的说明和结构的组织,使用规范化语言,有着很强的约束性。不同的数据类型不能直接代入,相同的类型,位长不同也不能代入。EDA工具在编译、综合时会报告类型错。,数据类型(2),VHDL语言标准所定义的标准数据类型(1)整数类型(INTEGERTYPE)p36(2)实数类型或浮点类型(REALTYPEFLOATINGTYPE)(3)位类型(BITTYPE)std_logic(4)位矢量类型(BIT_VECTORTYPE)std_logic_vector(5)布尔类型(BOOLEANTYPE)(6)字符类型(CHARACTERTYPE)(7)时间类型或物理类型(Timetypephysicaltype)(8)错误类型(NOTE,WARNIING,ERROR,FAILURETYPE)(9)自然数、整数类型(NATURALTYPE)(10)字符串类型(TRINGTYPE),数据类型字符型,字符(CHARACTER)字符在VHDL语言中编程时用单引号括起来。A,a,B,b,都认为是不同的字符。VHDL语言对大小写英文字母不敏感,但区分字符量中的大小写。字符1,2仅是符号。字符包括AZ,az,09,空格及一些特殊字符。,数据类型字符串型,字符串(STRING)字符串是由双引号括起来的一个字符序列。例如“VHDL”,“STRING”,“MULTI_SCREENCOMPUTER”等。字符串一般用于给位向量赋值、程序的提示、结果的说明等场合。字符为单引号括起来的ASCII字符:例如1,A,F。WR=1;字符串为双引号括起来的图形字符序列。例如:“PCIBUSinterface”,“Thisstringconstainaninformation”。Bus=“01011100”;,数据类型-整型,整数(INTEGER)在VHDL语言中,整数范围从(2311)到(2311),例如:128,5,12,。在电子系统中,整数可以用进制来表示。整数不能看作矢量,不能单独对某一位操作。整数不能用于逻辑运算,只能用于算术运算。对象的数据类型定义为整数时,范围应有约束。例如:VARIABLEA:INTEGERRANGE128TO128;在电子系统设计过程中,整数可以用来抽象地表达总线的状态。常用的整数常量的书写方式如下:2,10E3;-十进制整数16#D2#;-十六进制整数2#10101010#;-二进制整数,数据类型布尔型,布尔量(BOOLEAN)布尔量是二值枚举量,每一个布尔量具有两个可能的值:“真”或者“假”。布尔量没有数量多少的概念,不能进行算术运算,只能进行逻辑运算。布尔量常用来表达信号的状态,或者总线上的控制权,仲裁情况,忙、闲状态等。若某个客体被定义为布尔量,则EDA工具对设计进行仿真时,自动地对其赋值情况进行核查。,数据类型比特型,位(BIT)位通常用来表示一个信号的值。位通常用单引号来括号引其位的值。如:TYPEBITIS(0,1);位的值0,1可以表示信号的状态;位数据类型取值0和1;整数中的1和0表示数值,布尔量的值TRUE和FLASE没有数值含义,三者的意义不一样位数据类型可以参与逻辑运算,结果任然为BIT。,数据类型位向量型,位向量(BIT_VECTOR)位矢量只是基于BIT数据类型的数组位矢量可以进行算术运算。位矢量通常用来表示总线状态。声明:SIGNALb:BIT_VECTOR(3DOWNTO0);位矢量常量是用双引号括起来的一组位数据。如:B”001100”-B表示二进制X”00BB”-X表示十六进制O”3705”-O表示八进制,在VHDL语言中,实数范围为1.0E38到1.0E38。实数有正负数,书写时一定要有小数点。在有关文献中,实数类型也称为浮点类型。但大多数EDA工具不支持浮点运算,仅用于仿真,因为太复杂,电路规模难以承受。书写方式举例:2.22,44.5E-4;-十进制浮点数8#44.5E-4;-八进制浮点数,数据类型-实数型(REAL),类型转换(1),在VHDL程序设计中,不同类型的对象不能代入。对于某一数据类型的变量、信号、常量、文件赋值时,类型一定要一致,否则EDA工具进行综合、仿真等过程中不能通过。为了进行不同类型的数据变换,可以有3种方法:类型标记法函数转换法常数转换法。,类型转换(2),用类型标记法实现类型转换类型标记就是类型的名称。类型标记法仅适用于关系密切的标量类型之间的类型转换,即整数和实数的类型转换。若:variablei:integer;variabler:real;则有:i:integer(r);r:real(i);,类型转换(3),用函数法进行数据类型转换,VHDL语言标准中的程序包提供的变换函数来完成这个工作。这些程序包有3种:STD_LOGIC_1164程序包定义的转换函数:函数TO_STDLOGICVECTOR(A)-由位矢量BIT_VECTOR转换为STD_LOGIC_VECTOR函数TO_BITVECTOR(A);-由标准逻辑矢量STD_LOGIC_VECTOR转换为BIT_VECTOR函数TO_STDLOGIC(A);-由BIT转换为STD_LOGIC函数TO_BIT(A);-由标准逻辑STD_LOGIC转换BIT,类型转换(3),STD_LOGIC_ARITH包集合定义的转换函数:函数:CONV_STD_LOGIC_VECTOR(A,位长);-由INTEGER,SINGED,UNSIGNED转换成STD_LOGIC_VECTOR函数:CONV_INTEGER(A);-由SIGNED,UNSIGNED转换成INTEGERSTD_LOGIC_UNSIGNED包集合定义的转换函数:USEIEEE.STD_LOGIC_UNSIGNED.ALL;-增加声明函数:CONV_INTEGER(A);-由STD_LOGIC_VECTOR转换成INTEGER,逻辑标准值,与BIT类型不同,VHDL93标准定义了STD_LOGIC9种不同的值,增加了不定状态“X”、高阻状态“Z”。不定状态方便了系统仿真,高阻状态方便了双向总线的描述。U-初始值X-不定,未知;O-01-1Z-高阻W-弱信号不定,未知L-弱信号0H-弱信号1-不可能情况使用时需要写出库说明语句和使用的包集合说明语句USEIEEE.STD_LOGIC_1164.ALL,常用的类型包,建议库资源同时声明三个,会省很多事:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;ieee是库,std_logic_XXXX是程序包,all是项目名std_logic_arith程序包,它预先编译在ieee库中,是在std_logic_1164程序包的基础上扩展了三个数据类型unsigned、signed和small_int,并且定义了相关的算术运算符和数据类型转换函数。,程序注释,为了提高VHDL语言设计程序的可读性,像其他高级语言那样,在每一程序行后可以增加注释。注释从“-”符号开始,到该行末尾结束。注释文字不产生硬件电路结构,不描述电路行为,在综合、仿真、验证过程中,EDA工具对注释行不进行处理。举例:Trant=Frame-XXX-PCI总线数据传输译码逻辑之一。,第6讲:VHDL的基本元素,1标识符2数据对象3数据类型4操作符5端口模式,4运算操作符,VHDL语言的操作符有4种:(1)逻辑运算符(LOGICAL)(2)关系运算符(RELATIONAL)(3)算术运算符(ARITHMETIC)(4)并置运算(CONCATENATION),逻辑运算符,在VHDL中,逻辑运算符有6种,列表如下:(1)NOT取反(2)AND与(3)OR或(4)NAND与非(5)NOR或非(6)XOR异或;逻辑运算符左右无优先级,下面语句的括号去掉后不同;X=(aandb)or(notcandd);逻辑运算符用于bit类型的逻辑操作以及条件组合。,关于逻辑运算符,在VHDL程序设计中有如下规则:(1)适用变量类型:STD_LOGIC、BIT等逻辑型数据、STD_LOGIC_VECTOR及布尔型数据;(2)运算符的左边和右边,以及代入的信号的数据类型必须是相同的;(3)一个逻辑式中,先做括号里的运算,再做括号外运算;(4)表达式中只有“AND”、“OR”、“XOR”中的一种运算符,则改变顺序不影响结果,括号可省略。,逻辑运算符说明,SIGNALA,B,C:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALD,E,F,G:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALH,I,J,K:STD_LOGIC;SIGNALL,M,O,P:BOOLEAN;A=BANDC;-B、C相与向A赋值,同属4位长的位矢量D=EORFORG;-两个操作符相同,不需要括号H=(INANDJ)NANDK;-不属于与、或、异或,所以需要括号L=(MXORN)AND(OXORP);-操作符不同,所以需括号H=IANDJANDK;-都是与,可以不用括号H=IANDJORK;-错误,操作符不同需要括号A=BANDE;-错误,位长度不同H=IORL;-错误,数据类型不同,逻辑运算符举例,在VHDL93版中,增加了6种新的逻辑运算符:SLL逻辑左移SRL逻辑右移SLA算术左移SRA算术右移ROL逻辑循环左移ROR逻辑循环右移,移空的位补零,移空的位由最初首位补,移出的位依次填补移空的位,移位运算符(新增逻辑运算符),“1001001”SLL1“0010010”“1001001”SRL1“0100100”“1001001”SLA1“0010011”“1001001”SRA1“1100100”“1001001”ROL1“0010011”“1001001”ROR1“1100100”,45,移位运算符举例,关系运算符(1),关系运算符是两个对象在比较运算时,将两个操作数比较的结果表示出来所使用的符号,列表如下:-等于/-不等于-小于-小于等于-大于-大于等于,关系运算符(2),两个对象进行比较时,数据类型一定要相同。(等于)和/(不等于)适用于所有数据类型的对象之间的比较。大于、小于、大于等于、小于等于适用于整数、实数位、位矢量、数组类型的比较。=符号有两种含义:代入符和小于等于符,要根据上下文判断。两个位矢量类型的对象比较时,自左至右,按位比较。,算术运

温馨提示

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

评论

0/150

提交评论