版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章VHDL语言的基本要素及基本结构1.第二章VHDL语言的基本要素及基本结构1.第二章VHDL的语言要素及基本结构要求:1.掌握:VHDL的命名规则:基本标示符、下标名、段名及注释;VHDL对象(客体)分类定义及其性质;VHDL语言的数据类型:位、位矢量、整形数;枚举类型;IEEE标准的STD_LOGIC、STD_LOGIC_VECTOR;运算操作符;VHDL程序的组成VHDL语言设计的基本单元及其构成VHDL构造体描述的几种方法库及IEEE库中包集合的使用2.熟悉:VHDL语言的其它数据类型、子程序、包集合及配置3.了解:标示符:扩展标识符;数据类型转换
2.2022/11/26第二章VHDL的语言要素及基本结构要求:2.2022/11VHDL语言程序通常包含5部分:实体说明:entity:描述所设计系统的外部接口信号,是可见的。构造体:architecture描述所设计系统的内部的结构和行为,是不可见的。配置:configuration选取所需单元组成系统的不同版本包集合:package存放各设计模块都能共享的数据类型、常数、子程序和函数。库:library存放已经编译好的实体、构造体、包集合和配置VHDL语言程序最基本组成是实体说明和构造体3.2022/11/26VHDL语言程序通常包含5部分:实体说明:entity:描述VHDL的语言要素VHDL的语言要素包含客体(或对象)数据类型操作数运算操作符VHDL规定:(1)不区分大小写(“”和‘’内的字符除外);(2)每条语句以一个分号;结束;(3)不是所有语句前都可以加标号;(4)一条语句后可以加注释,在注释内容前加两个短划线。
4.2022/11/26VHDL的语言要素VHDL的语言要素包含客体(或对象)数据类§2.1VHDL语言的命名规则2.1.1数字型文字(1)整数文字 (2)实数文字(3)以数制基数表示的文字 格式:数制#数值#[指数值]
例如:10#170#E1---------十进制1700 16#FE#------------十进制254 2#1101_0001#--十进制209 8#376#------------十进制25416#E#E1---------(十六进制数表示,14*161等于224)(4)物理量文字(VHDL综合器不接受此类文字)。60s(60秒),100m(100米),kΩ(千欧姆),177A(177安培)5.2022/11/26§2.1VHDL语言的命名规则2.1.1数字型文字5.22.1.2字符串型文字字符串型文字包含文字字符串、数位字符串数位字符串:位矢量,由数据类型为BIT的元素组成的一维数组书写格式:基数符“数值”基数符:B—二进制数;O—八进制数;X—十六进制数例如:data1<=B“1_1101_1110”;data2<=O“15”;data3<=X“AD0”;data4<=B“101_010_101_010”;data5<=“101_010_101_010”;--表达错误,缺B;data5<=“101010101010”;--表达正确,没有“_”默 认为二进制数;data6<=“0AD0”;--表达错误,缺X
6.2022/11/262.1.2字符串型文字字符串型文字包含文字字符串、数位字2.1.3标识符用来定义实体、结构体、对象(常数、变量、信号)、端口、子程序、语句标号或参数的名字。VHDL的基本标识符书写遵循规则:由26个大小写英文字母、数字0~9以及下划线“_”组成;以英文字母开头;不连续使用下划线“_”,不以下划线“_”结尾的;标识符中的英语字母不分大小写;VHDL的保留字(或关键字)不能作为标识符使用。VHDL’93标准还支持扩展标识符,但是目前仍有许多VHDL工具不支持扩展标识符。由一对反斜杠之间的任何字符序列组成,取消了标准标示符的所有限制。合法标示符:Decoder_1,FFT,Sig_N,Not_Ack,State0,Idle
非法标识符:
_Decoder_1,
2FFT,Sig_#N,Not-Ack,RyY_RST_,data__BUS,return7.2022/11/262.1.3标识符用来定义实体、结构体、对象(常数、变量、2.1.4下标名下标名指的是数组型变量或信号的某一个元素。格式:标示符(表达式)标识符必须是数组型的变量或信号的名字,表达式所代表的值必须是数组下标范围中的一个值,这个值将对应数组中的一个元素。例如:SIGNALa,b:BIT_VECTOR(0TO3);
SIGNALm:INTEGERRANGE0TO3;
SIGNALy,z:BIT;
y<=a(m);--
不可计算型下标表示
z<=b(3);--可计算型下标表示8.2022/11/262.1.4下标名下标名指的是数组型变量或信号的某一个元素2.1.5段名段名是多个下标名的组合,对应数组中某一段的元素格式:标示符(表达式方向表达式)方向:TO
或DOWNTOSIGNAL
a,z:BIT_VECTOR(0TO7)
;
Signal
b:bit_vector(4
downto
0);
z(0TO
3)<=a(4TO7);--z(0)<=a(4)、z(1)<=a(5)…9.2022/11/262.1.5段名段名是多个下标名的组合,对应数组中某一段的§2.2VHDL的数据类型及运算操作符VHDL语言同其它语言一样有多种数据类型和运算符,且它们的定义也大多相同。VHDL语言的特点是用户可以自己定义数据类型。如:typecountisintegerRANGE0to10;10.2022/11/26§2.2VHDL的数据类型及运算操作符VHDL语言同其它语2.2.1VHDL客体(对象)及其分类客体(对象):可以赋予一个值的对象或者是数据类型所定义的对象。客体主要包括3类信号:变量:常数:代表元件间的硬件连接线—全局变量代表暂存某一值的载体—局部变量数字电路中的电源和地等—全局变量物理意义11.2022/11/262.2.1VHDL客体(对象)及其分类客体(对象):可1、VHDL语言对象(客体)—常数一般某一值在程序中多处用到,为了增加程序的可读性、可修改性,给该常数定义一个常数名,在书写程序时用定义的常数名代替该常数。可以在实体、结构体、程序包、块、进程和子程序中定义(说明)。在包集合中定义的常量可以暂不设具体数值,它可以在包体中设定。常量的使用范围取决于它被定义的位置程序包:实体:构造体:块:由调用该程序包中的任何实体、构造体引用仅作用于该实体仅作用于该构造体仅作用于该块进程:仅作用于该进程子程序:仅作用于该子程序12.2022/11/261、VHDL语言对象(客体)—常数一般某一值在程序中多处用到1、VHDL语言对象(客体)—常数常数说明的一般格式:CONSTANT常量名:数据类型﹕=表达式;如:CONSTANTFBUS﹕BIT_VECTOR﹕=“0101”;CONSTANT
VCC﹕REAL﹕=5.0;CONSTANTDELY﹕TIME﹕=25ns;注意:常数被赋值的类型一定要和定义的数据类型一致,如第二条语句中的5.0若变为5则不正确。13.2022/11/261、VHDL语言对象(客体)—常数常数说明的一般格式:13.2、VHDL语言客体—变量是一个局部量,只能在进程和子程序(过程和函数)中定义和使用。变量不能将信息带出对它作出定义的当前设计单元。变量在硬件中没有明确的对应物,只是对数据暂存。变量的赋值是立即发生,不存在任何延时的行为。常用在实现某种算法的赋值语句中,赋值符号为“:=”变量说明语句格式:
variable变量名1[,变量名2,···]:数据类型
[约束条件:=表达式];注意:1、语句中用[]括起部分可有可无2、表达式:给变量赋初值3、变量赋值符号为“:=”4、变量赋值立即生效,因此变量赋值不能够加延时条件5、逻辑综合时初值无效6、多个变量具有相同的数据类型和约束条件时可以在同一条变量定义语句中定义14.2022/11/262、VHDL语言客体—变量是一个局部量,只能在进程和子程序(变量定义赋值举例Variablex,y:integer;Variablex:integerrange0to255:=10;Variabletemp1,temp2:integer;变量赋值语句:变量定义语句:Temp1:=temp2;Temp1:=temp2after10ns;此语句对吗?15.2022/11/26变量定义赋值举例Variablex,y:integer;V3、VHDL语言客体—信号信号可以作为模块间的信息交流通道,与硬件中互连元件端口的的连线相对应;信号及其相关的语句描述了硬件系统的基本特征;如硬件系统运行的并行性;信号传输过程中的惯性延时特性;多驱动源的总线行为等。信号赋值不立即生效信号的定义格式如下:SIGNAL信号名:数据类型约束条件﹕=初始值;初始值仅在VHDL的行为仿真中有效,逻辑综合无效信号代入符号为“<=”,但是赋初值符号为“:=”信号赋值不立即生效,因此信号代入能够加延时条件多个信号具有相同的数据类型和约束条件时可以在同一条信号定义语句中定义具有全局性特性,可以在以下区域定义和使用:实体:作用于该实体中所有的结构体结构体:作用于整个结构体包集合:作用于调用此包集合的所有实体除了没有方向说明以外,信号与实体的端口(PORT)概念是一致的。16.2022/11/263、VHDL语言客体—信号信号可以作为模块间的信息交流通道,VHDL语言客体—信号SIGNALSys_clk:bit﹕=‘0’;--定义了一个位BIT的信号S1,初始值为低电平SIGNALground:BIT=‘0’;--定义了一个位BIT的信号ground,初始值为低电平以上两条信号定义语句可以改写成一条信号定义语句:SignalSys_clk,ground:STD_LOGIC﹕=‘0’;SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0);--定义了一个标准逻辑位矢量(数组、总线)信号,共有16个元素SIGNALS5:integerrange0to9;;--定义了一整型数据类型的信号s5,其取值只能是0到9的整数信号赋值可以加延时条件:SIGNALS1﹕bit;SIGNALs2:bit;S2<=s1after10ns;17.2022/11/26VHDL语言客体—信号SIGNALSys_clk:bit﹕4、信号、变量、常量的比较从硬件电路系统来看常量相当于电路中的恒定电平,如GND或VCC接口变量和信号则相当于组合电路系统中门与门间的连接及其连线上的信号值。从行为仿真和VHDL语句功能上看信号可以设置延时量,而变量则不能;变量只能作为局部的信息载体,而信号则可作为模块间的信息载体。变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都靠信号来完成。18.2022/11/264、信号、变量、常量的比较从硬件电路系统来看18.2022/信号、变量、常量的比较从综合后所对应的硬件电路结构来看信号将对应更多的硬件结构,变量在硬件上一般没有对应实物。VHDL综合器并不理会它们在接受赋值时存在的延时特性。VHDL仿真器允许变量和信号设置初始值,但在实际应用中,VHDL综合器并不会把这些信息综合进去。因为实际的FPGA/CPLD芯片在上电后,并不能确保其初始状态的取向。因此,对于时序仿真来说,设置的初始值在综合时是没有实际意义的。19.2022/11/26信号、变量、常量的比较从综合后所对应的硬件电路结构来看19.D触发器的四种不同描述Entitydff1isport(clk,d:inbit;q:outbit);Enddff1;Architecturebhvofdff1isBeginD1:process(clk)variableqq:bit;Beginifclk’eventandclk=‘1’thenqq:=d;q<=qq;endif;Endprocess;Endbhv;Entitydff2isport(clk,d:inbit;q:outbit);Enddff2;Architecturebhvofdff2issignalqq:bit;BeginD1:process(clk)Beginifclk’eventandclk=‘1’thenqq<=d;endif;Endprocess;q<=qq;Endbhv;dclkqDff1dclkqDff2dff1综合后的结果dff2综合后的结果20.2022/11/26D触发器的四种不同描述Entitydff1isEntitD触发器的四种不同描述Entitydff3isport(clk,d:inbit;q:outbit);Enddff3;Architecturebhvofdff3isBeginD1:process(clk)variablea,b:bit;Beginifclk’eventandclk=‘1’thena<=d;b:=a;q<=b;endif;Endprocess;Endbhv;dclkqDff3Dff4Entitydff4isport(clk,d:inbit;q:outbit);Enddff4;Architecturebhvofdff4issignala,b:bit;BeginD1:process(clk)Beginifclk’eventandclk=‘1’thena<=d;b<=a;q<=b;endif;Endprocess;Endbhv;dclkqdclkqdclkqabDff3综合后结果Dff4综合后结果21.2022/11/26D触发器的四种不同描述Entitydff3isdclkq5、信号和变量使用的区别赋值(代入)语句的符号不同::=变量赋值符号<=信号代入符号操作过程不同:变量在上一条语句赋值,下一条语句即可使用。变量不能列入进程语句的敏感表。信号代入语句的处理和代入过程是分开进行的。信号语句即使被处理也不会立即发生代入,下一条语句用到该信号,仍使用原来的信号值。在进程语句中,当进程结束或遇到wait语句时,信号代入过程才被执行。信号可以列入进程的敏感表22.2022/11/265、信号和变量使用的区别赋值(代入)语句的符号不同::=例2-5Process(A,B,C,D)Begin D<=A;
X<=B+D; D<=C;
Y<=B+D;Endprocess;Process(A,B,C)VariableD:std_logic_vector(3downto0);Begin D:=A; X<=B+D; D:=C; Y<=B+DEndprocess;例1结果:X=B+C;
Y=B+C;例2结果:X=B+A;
Y=B+C;WAITFOR10nsWAITFOR10ns注意:在同一个进程中,同一信号赋值目标有多个赋值源时,只获得最后一个赋值源的赋值。
加入WAIT语句后,信号赋值立即生效。结果同例2结果。23.2022/11/26例2-5Process(A,B,C,D)Proce2.2.2VHDL中的数据类型1、VHDL语言的数据类型的载体:常数、变量、信号VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量等都必须具有确定的数据类型,并且相同数据类型及量才能互相传递和作用。VHDL作为强类型语言的好处是使VHDL编译或综合工具很容易地找出设计中的各种常见错误。VHDL中的数据类型可以分成三大类。(不同书分类方法不完全一致)三类标准数据类型:10种用户自定义数据类型:8种IEEE预定义标准逻辑位与矢量24.2022/11/262.2.2VHDL中的数据类型1、VHDL语言的数据类型的1、标准数据类型标准数据类型是最基本的数据类型,包括:实数类型、整数类型、位类型、字符类型和时间类型等,共10种。重点:整数类型和位类型这些数据类型都已在VHDL的标准程序包standard和std_logic_1164及其他的标准程序包中作了定义,并可在设计中随时调用。25.2022/11/261、标准数据类型标准数据类型是最基本的数据类型,包括:实数类1)标准数据类型——整数(INTEGER)型取值范围是-21473647~+21473647范围:–(231–1)~
(231–1)32位对于VHDL仿真器,整数作为有符号数;对于VHDL综合器,整数作为无符号数处理;要求用RANGE子句为所定义的数限定范围,然后据此决定表示此信号或变量的二进制数的位数。如语句“SIGNALA﹕INTEGERRANGE0TO15;”规定信号A的取值范围是0~15共16个整数值,可用4位二进制数来表示,因此A将被综合成由四条信号线构成的信号。整数常量的书写方式:2--十进制整数10E4--十进制整数16#D2#--十六进制整数2#11011010#--二进制整数26.2022/11/261)标准数据类型——整数(INTEGER)型取值范围是-212)标准数据类型——实数(REAL)型类似于数学上的实数,或称浮点数。取值范围为-1.0E38~+1.0E38。通常情况下,仅能在VHDL仿真器中使用VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。实数常量的书写方式举例如下:65971.333333--十进制浮点数43.6E-4--十进制浮点数27.2022/11/262)标准数据类型——实数(REAL)型类似于数学上的实数,3)标准数据类型——位(BIT)型取值只能是1或0;位值的表示方法是:‘0’或‘1’;位数据类型的数据对象,如变量、信号等,可以参与逻辑运算,运算结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。28.2022/11/263)标准数据类型——位(BIT)型取值只能是1或0;28.24)标准数据类型——位矢量(BIT_VECTOR)型位矢量是基于BIT数据类型的数组STANDARD程序包中BIT_VETOR类型定义如下:TYPE
BIT_VETOR
IS
ARRAY(NATURALRANGE<>)OF
BIT;使用位矢量必须注明位宽----数组中的元素个数和排列方向;例如:SIGNALA﹕BIT_VECTOR(7DOWNTO
0);信号A被定义为一个具有8位位宽的矢量,它的最左位是A(7),最右位是A(0)。例如:SIGNALA﹕BIT_VECTOR(0TO
7);信号A被定义为一个具有8位位宽的矢量,它的最左位是A(0),最右位是A(7)。位矢量的表示方法是:双引号括起来的一组位数据,如:“01100”或x“00bb”十六进制表示前加x。29.2022/11/264)标准数据类型——位矢量(BIT_VECTOR)型位矢量是5)标准数据类型——布尔(BOOLEAN)型定义布尔数据类型的源代码如下:TYPEBOOLEANIS(FALSE,TRUE);取值有FALSE和TRUE两种。综合器将用一个二进制位表示BOOLEAN型变量或信号。例如,当A大于B时,在IF语句中的关系运算表达式(A>B)的结果是布尔量TRUE,反之为FALSE。综合器将其变为1或0信号值,对应于硬件系统中的一根线布尔类型的变量或信号只可以进行关系运算。例如:SIGNALflag:boolean;flag<=false;30.2022/11/265)标准数据类型——布尔(BOOLEAN)型定义布尔数据类型6)标准数据类型——字符(CHARACTER)型字符类型通常用单引号引起来如‘A’字符类型区分大小写如‘B’不同于‘b’用于仿真,不能被逻辑综合。31.2022/11/266)标准数据类型——字符(CHARACTER)型字符类型通常7)标准数据类型——字符串(STRING)型字符串数据类型是字符数据类型的一个非约束型数组,或称为字符串数组。用于仿真,不能被逻辑综合。字符串必须用双引号标明。如:VARIABLESTRING_VAR﹕STRING(1TO7);…STRING_VAR:=“ABCD”;此数组中各元素的值:STRING_VAR(1)=‘A’;STRING_VAR(2)=‘’;STRING_VAR(3)=‘B’;STRING_VAR(4)=‘’;STRING_VAR(5)=‘C’;STRING_VAR(6)=‘’;STRING_VAR(7)=‘D’;32.2022/11/267)标准数据类型——字符串(STRING)型字符串数据类型9)标准数据类型——自然数(NATURAL)和正整数(POSITIVE)自然数整数的一个子类型,非负的整数,即零和正整数。STANDARD程序包中NATURAL类型定义如下:SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;正整数是整数的一个子类型,它包括整数中非零和非负的数值。STANDARD程序包中NATURAL类型定义如下:SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER‘HIGH;33.2022/11/269)标准数据类型——自然数(NATURAL)和正整数(POS8)标准数据类型——时间(TIME)型VHDL中惟一的预定义物理类型。用于仿真系统,实际运行情况不能被逻辑综合。完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格。55ms,20ns如无空格,有的仿真器给出警告。34.2022/11/268)标准数据类型——时间(TIME)型VHDL中惟一的预定标准数据类型——时间(TIME)型STANDARD程序包中时间类型定义如下:TYPETIMEISRANGE-2147483647TO2147483647unitsfs;--飞秒,VHDL中的最小时间单位
ps=1000fs;--皮秒
ns=1000ps;--纳秒
us=1000ns;--微秒
ms=1000us;--毫秒
sec=1000ms;--秒
min=60sec;--分
hr=60min;--时enduntis;35.2022/11/26标准数据类型——时间(TIME)型STANDARD程序包10)标准数据类型——错误等级(SEVERITY_LEVEL)在VHDL仿真器中,错误等级用来指示设计系统的工作状态,共有四种可能的状态值:note(注意)、warning(警告)、error(出错)、failure(失败)。在仿真过程中,可输出这四种值来提示被仿真系统当前的工作情况。不能被逻辑综合。36.2022/11/2610)标准数据类型——错误等级(SEVERITY_LEVEL可以由用户自定义的数据类型有8种。枚举类型整数类型实数类型数组类型记录类型时间类型存取类型文件类型
用户自定义的数据类型以及子类型,其基本元素一般仍属VHDL的标准(预定义)数据类型。
VHDL仿真器支持所有的数据类型,但VHDL综合器并不支持所有的标准(预定义)数据类型和用户自定义数据类型。如real、time、file、access等数据类型。在综合中,它们将被忽略或宣布为不支持。枚举类型、整数类型、一维数组肯定能被逻辑综合。2、用户定义的数据类型37.2022/11/26可以由用户自定义的数据类型有8种。枚举类型整数类型实数类型数自定义数据类型的书写格式type
数据类型名
is
数据类型定义[of基本数据类型];设计者自定,可以是任一标示符描述所定义的数据类型的表达方式和表达内容可有可无指数据类型定义中所定义的元素的基本数据类型,一般都是取已有的预定义数据类型,如bit、std_logic或integer等38.2022/11/26自定义数据类型的书写格式type数据类型名is数据1)用户自定义类型——枚举类型枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围。VHDL中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型(若直接用数值来定义,则必须使用单引号)。type
M_state
is
(state1,state2,state3,state4,state5);signalcurrent_state,next_state:M_state;枚举类型数据的定义格式如下:Type
数据类型名
is(元素1,元素2,……);信号current_state和next_state的数据类型定义为M_state,从state1~state5共5个取值。例如:39.2022/11/261)用户自定义类型——枚举类型枚举:将变量的值一一列举出来,用户自定义类型——枚举类型在综合过程中自动编码一般将第一个枚举量(最左边的量)编码为0,以后的依次加1。在编码过程中自动将枚举元素转变成位矢量位矢的长度将取能够表达的所有枚举元素的最小值用于表达5个状态的位矢量长度应该为3位,编码默认值为如下方式:state1=‘000’;state2=‘001’;state3=‘010’;state4=‘011’;state5=‘100’;为了某些特殊的需要,编码顺序也可以人为设置40.2022/11/26用户自定义类型——枚举类型在综合过程中自动编码40.2022例如ArchitecturebehaveofmenuisType
weekis(sun,sat,fir,thu,wed,tue,mon);Typebreakfastis(porridge,milk,egg,noodle,bread, milk,egg);Signal
today:week;Signal
eatable:breakfast;Beginprocess(pin)begincasepiniswhen“000”=>today<=sun;when“001”=>today<=sat;
:
when“111”=>today<=mon;endcase;
Casetodayiswhen”sun”=>eatable<=porridge;when”sat”=>eatable<=milk;
: :
when”mon”=>eatable<=egg;endcase; ∶Endprocess;Endbehave;41.2022/11/26例如Architecturebehaveofmenu2)用户自定义类型——整数类型和实数类型目的:标准的程序包中的定义取值定义范围太大,综合器综合结果占有资源太多。用户根据实际的需要限定其取值范围,以便能使综合器更好的综合。定义格式:TYPE数据类型名IS数据类型定义约束范围;约束范围:range(数据范围)如:TYPEdigitISINTEGERRANGE0TO9;如:TYPEcurrentISREALRANGE-1E4TO1E4;42.2022/11/262)用户自定义类型——整数类型和实数类型目的:42.20223)用户自定义类型——数组类型数组:是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。可以是一维(每个元素只有一个下标)或多维(每个元素有多个下标)。VHDL仿真器都支持,但VHDL综合器只支持一维数组。VHDL允许定义两种不同类型的数组:限定性数组和非限定性数组限定性数组:下标的取值范围在数组定义时就被确定;非限定性数组:下标的取值范围需留待随后根据具体数据对象再确定。43.2022/11/263)用户自定义类型——数组类型数组:43.2022/11/2限定性数组定义语句格式如下:type数据类型名isarray
范围of
原数据类型;如:TYPEwordISARRAY(1TO8)OFSTD_LOGIC;数据类型名称是word,8个元素,下标排序是1,2,3,4,5,6,7,8,各元素的排序是word(1),word(2),…,word(7),word(8)。每个元素的数据类型为std_logic。注意:若范围一项的数据类型没有,则默认integer类型若用其它数据类型指定范围,应在指定范围前加数据类型名新定义的限定性数组类型的名称,可以是任何标识符;指出数组元素数量和排序方式,一般用整数来表示其范围;指数组各元素的数据类型用户自定义类型——数组类型:限定性数组44.2022/11/26限定性数组定义语句格式如下:type数据类型名isa用户自定义类型——数组类型:限定性数组用其它的数据类型指定范围举例:TYPEinstructionIS(ADD,SUB,INC,SRL,SRF,LDA,LDB,XFR);SUBTYPEdigitISINTEGERrange0TO9;TYPEinsflagISARRAY(instructionADDTOSRF)OFdigit;这数组有五个元素,元素的下标是ADD到SRF,每个元素数据类型是digit。数组常在总线、ROM和RAM中使用。例如:设计一个256×8的ROM存储器Subtypewordis
std_logic_vector(7dowmto0);Typememoryisarray(0to255)
ofword;Varaiblerom:memory;45.2022/11/26用户自定义类型——数组类型:限定性数组用其它的数据类型指定范用户自定义类型——数组类型:非限制性数组格式:TYPE数组名ISARRAY(数组下标类型RANGE<>) OF数据类型;TYPESTD_LOGIC_VECTORISARRAY(NATURAL RANGE<>)OFSTD_LOGIC;VARABLEVA:STD_LOGIC_VECTOR(0TO6);(具体数据对象)46.2022/11/26用户自定义类型——数组类型:非限制性数组格式:TYPE数组二维数组定义格式:Type
数据类型名isarray(行范围,列范围)
of
原数据类型;例如:TYPEmemoryISARRAY(0TO5,7DOWNTO0)OFSTD_LOGIC;CONSTANTromdata:memory:= ((‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’), (‘0’,‘1’,‘1’,‘1’,‘0’,‘0’,‘0’,‘1’), (‘0’,‘0’,‘0’,‘0’,‘0’,‘1’,‘0’,‘1’), (‘1’,‘0’,‘1’,‘0’,‘1’,‘0’,‘1’,‘0’), (‘1’,‘1’,‘0’,‘1’,‘1’,‘1’,‘0’,‘0’) (‘1’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’));Signaldata_bit:STD_LOGIC;Data_bit<=romdata(3,7);47.2022/11/26二维数组定义格式:47.2022/11/254)用户自定义类型——记录类型由已定义的、数据类型不同的对象元素构成的数组语句格式:TYPE记录类型名ISRECORD
元素名:元素数据类型;元素名:元素数据类型;
…ENDRECORD[记录类型名];48.2022/11/264)用户自定义类型——记录类型由已定义的、数据类型不同的对象用户自定义类型——记录类型举例TYPEbankISRECORD--将bank定义为四元素记录类型
addr0﹕STD_LOGIC_VECTOR(7DOWNTO0);
addr1﹕STD_LOGIC_VECTOR(7DOWNTO0);
r0﹕INTEGER; inst﹕instruction;(假设是以前定义好的枚举数据类型)ENDRECORD;SIGNALaddbus1,addbus2:STD_LOGIC_VECTOR(7 DOWNTO0);SIGNALresult:INTEGER;SIGNALalu_code:instruction;SIGNALr_bank:bank:=(“00000000”,”00000000”,0,ADD);…addbus1<=r_bank.addr1;r_bank.inst<=alu_code;49.2022/11/26用户自定义类型——记录类型举例TYPEbankISRE3、用户定义的子类型子类型是由用户对已定义的原数据类型做一些范围限制而形成的一种新的数据类型。子类型SUBTYPE的语句格式如下:Subtype
子类型名
is
基本数据类型名[范围];例如:subtypeabus
is
std_logic_vector(7downto0);
signal
aio:std_logic_vector(7downto0);
signalbio:std_logic_vector(15downto0);
signalcio:abus;
aio<=cio;
bio<=cio; 对吗?50.2022/11/263、用户定义的子类型子类型是由用户对已定义的原数据类型做一些5、数据类型的限定数据类型可以根据所描述的文字的上下关系来判断SIGNALa:STD_LOGIC_VECTOR(7DOWNTO0);a<=“01101010”;--STD_LOGIC_VECTOR有时判断不出来CASE(a&b&c)IS--无法断定(a&b&c)的类型WHEN“001”=>Y<=“01111111”;WHEN“010”=>Y<=“10111111”;…ENDCASE;限定方法SUBTYPESTD3BITISSTD_LOGIC_VECTOR(0TO2);CASESTD3BIT’(a&b&c)IS--限定(a&b&c)的类型为STD3BIT--限定方法:数据类型名’对象名51.2022/11/265、数据类型的限定数据类型可以根据所描述的文字的上下关系来判6、IEEE标准STD_LOGIC和STD_LOGIC_VECTOR在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_LOGIC
和标准逻辑矢量STD_LOGIC_VECTOR。它们是对bit和bit_vector两种数据类型的补充。Bit
只有‘0’和‘1’两种状态。标准逻辑位STD_LOGIC在STD_LOGIC_1164包集合中的定义的语句如下:TYPESTD_LOGICIS(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);‘U’--未初始化的,‘X’--强不定态,‘0’--强0,‘1’--强1,‘Z’--高阻态,‘W’--弱不定态,'L'--弱0,'H'--弱1,'-'--忽略标准逻辑矢量STD_LOGIC_VECTOR(二进制)他是由一组STD_LOGIC元素组成的一维数组;在STD_LOGIC_1164包集合中的定义的语句如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;52.2022/11/266、IEEE标准STD_LOGIC和STD_LOGIC_VE注意:(1)Bit_vector:可以是二进制数,也可以是十六进制数或八进制;还可使用“_”将二进制数隔开。(2)Std_logic_vector:只能是二进制数。(3)在使用时,必须在程序的开头说明包含着两种数据类型的包集合和包集合所在的库。Libraryieee; UseIEEE.std_logic_1164.all;53.2022/11/26注意:(1)Bit_vector:可以是二进制数,也可以是十4、数据类型的转换VHDL是一种强类型语言即使对于数据类型非常接近的数据对象,在相互操作时,也需要进行数据类型转换。类型转换函数通常由VHDL语言包集合提供54.2022/11/264、数据类型的转换VHDL是一种强类型语言54.2022/1STD_LOGIC_1164包集合
中定义的数据类型转换函数及对应的数据类型转换如下:to_stdlogicvector(A)to_bitvector(A)to_stdlogic(A)to_bit(A)
由bit_vector转换成std_logic_vector由std_logic_vector转换成bit_vector由bit转换成std_logic由std_logic转换成bit
变换函数通常由三个包集合提供:在VHDL语言中,不同类型的数据是不能进行运算和代入的,要实现这些操作必须进行数据类型的转换。4、数据类型的转换(续)55.2022/11/26STD_LOGIC_1164包集合中定义的数据类型转换函数STD_LOGIC_ARITH包集合中定义的数据类型转换函数集对应的数据类型转换如下:conv_std_logic_vector(A,位长)conv_integer(A)
由integer,unsigned和signed转换成std_logic_vector由unsigned和signed转换成integer
STD_LOGIC_UNSIGNED包集合定义的数据类型转换函数集对应的数据类型转换如下:conv_integer(A)
由std_logic_vector转换成integer4、数据类型的转换(续)56.2022/11/26STD_LOGIC_ARITH包集合中定义的数据类型转换函数数据类型转换举例LIBRARY
IEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadd5ISPORT(num:INSTD_LOGIC_VECTOR(2DOWNTO0);
…ENDadd5;ARCHITECTURErtlOFadd5ISSIGNALin_num:INTEGERRANGE0TO7;
…BEGIN
In_num<=CONV_INTEGER(num);ENDrtl;
57.2022/11/26数据类型转换举例LIBRARYIEEE;57.2022/12.2.3VHDL语言的运算操作符算术运算符:REM,MOD,/,*,-(取负),+(取正),-,+, **,ABSVHDL的各种表达式由操作数和操作符组成,其中操作数是各种运算的对象,而操作符则规定运算的方式VHDL语言的运算操作符分为4类:逻辑运算符:NOT,XOR,NOR,NAND,OR,AND关系运算符:>=,<=,>,<,/=,=并置运算符:&六种移位操作符号SLL、SRL、SLA、SRA、ROL和ROR是VHDL‘93标准新增的运算符。省略赋值操作符:(OTHERS=〉X)58.2022/11/262.2.3VHDL语言的运算操作符算术运算符:REM,MO运算符的优先级书P43页表2-5中运算符一项中每一行的优先级相同。六种移位操作符号SLL、SRL、SLA、SRA、ROL和ROR优先级高于一般的关系运算符。59.2022/11/26运算符的优先级书P43页表2-5中运算符一项中每一行的优1、逻辑运算符注意:(1)只可以对std_logic,std_logic_vector,bit,bit_vector,boolean型数据进行逻辑运算。(2)运算符的左右及代入的信号数据类型必须相同。(3)在一个语句中,若有两个以上的逻辑表达式时,有时需在相应的表达式中加括号。例如:X<=(aandb)or(notcandd);(4)如果一个逻辑表达式中只有AND,OR,XOR运算符,括号可省略。其他不行。例如:A<=((bnandc)nandd)nande;
1011A<=bnand(cnand(dnande));因为除NOT优先级最高外,其余优先级相同。同一个表达式中,具有多个优先级相同的逻辑运算符时,先完成括号内运算,否则它们的先后顺序是随机的。60.2022/11/261、逻辑运算符注意:(1)只可以对std_logic,std2、算术运算符REM,MOD,/,*,-(取负),+(取正),-,+,**,ABS-,+(负、正):一元运算操作符,操作数可以是任何数值类型在实际使用中,取负操作数需加括号。如:Z:=X*(-Y);-,+(加、减):操作数可以是任何数值类型,操作数的类型原则上必须一致。*,/:数据类型是整数和实数。对物理类型的数据对象也可以运算操作(1)乘法和除法运算是可综合的,但从优化综合、节省芯片资源的角度出发,最好不要轻易使用乘除操作符。注意:(2)只有分母操作数为2乘方的常数时,才可以综合。只有在左边为实数时,其右边才可以为负数。一般地,VHDL综合器要求乘方操作符作用的操作数的底数必须是2**:左边可以是整数或实数,但右边必须为整数。ABS:无限制MOD,REM:操作数数据类型只能是整数,运算操作结果也是整数只有分母操作数为2乘方的常数时,才可以综合。61.2022/11/262、算术运算符REM,MOD,/,*,-(取负),+3、关系运算符关系运算符:>=,<=,>,<,/=,=不同的关系运算符对两边的操作数的数据类型有不同的要求,但结果都是BOOLEAN型。
>=,<=,>,<:整数、实数、std_logic、bit及,bit_vector,std_logic_vector注意: (1)操作数的数据类型必须一致(2)位长可以不同。但可能出错。 (3)位矢量数据比较从左到右按位比较,当比较其中一位不等,则给 出结果,不再继续下一位的比较。例如:Signala:std_logic_vector(3downto0);Signalb:std_logic_vector(2downto0);若要进行位长不同的位矢量的关系运算必须加入语句
Libraryieee; useieee.std_logic_unsigned.all例如:a<=”1010”;b<=”111”;If(a>b)then62.2022/11/263、关系运算符关系运算符:>=,<=,>,<,/=,=例如:4、并置(连接)运算符&并置运算符&完成一维数组的连接;其操作过程是将右操作数连接在左操作数的后边,形成一个新的一维数组;常用于位或位矢量类型对象的连接。图2-3所示:
y(0)=b(0)anden y(1)=b(1)anden y(2)=b(2)anden y(3)=b(3)anden y(4)=a(0) y(5)=a(1) y(6)=a(2) y(7)=a(3)
从左边可以看出a,b是四位长度的矢量,而y的位长是8位,上述情况可以表示成:
tmp_b<=bAND(en&en&en&en);
y<=a&tmp_b;
注意:(1)位连接也可以用集合体的方法,将并置符“&”换成“,”即可(2)集合体的方法,不适应于有位矢量的连接。63.2022/11/264、并置(连接)运算符&并置运算符&完成一维数组的连接;图2并置(连接)运算符举例例如:tmp_b<=bAND(en,en,en,en);
y<=(a,tmp_b);
对吗?集合体可以用指定位的脚标表示:
signaltmp_c:std_logic_vector(3downto0); tmp_c<=(3=>en,2=>en,1=>en,0=>en);或 tmp_c<=(2=>’0’,others=>en);如果用此方法,others项必放最后。或 tmp_c<=(others=>en);或 tmp_c<=(3downto0=>en);64.2022/11/26并置(连接)运算符举例例如:tmp_b<=bAND(en5、省略赋值操作符(聚合赋值符)格式:others=>’X’例如:Signald1:STD_LOGIC_VECTOR(7DOWNTO0);d1<=(others=>’0’);一般用于较多位的位矢量赋值中有多位值相同时,做省略化的赋值。65.2022/11/265、省略赋值操作符(聚合赋值符)一般用于较多位的位矢量赋值中习题1、定义一个常数,数据类型为实数,数值任意。2、定义一个变量,数据类型为16位标准逻辑位矢量,然后将二进制数1111101100110000对其赋值。3、定义一个变量,数据类型为位类型且给初始值0。4、定义一个信号,数据类型为0到255的所有整数。5、定义枚举类型,类型名为state,包含元素为S1,S2,S3,S4,S5五个元素,然后用该数据类型定义信号now_state和next_state。6、改正下面标示符中错误:
#state,temp-1,signal,2apple,state__1,*Vcc,GND_7、signalA,B,C:BIT;signalD:bit_vector(0to2);signalE:bit_vector(0to5);将A、B、C连接起来赋值给D;将A、B、C、D连接起来赋值给E;66.2022/11/26习题1、定义一个常数,数据类型为实数,数值任意。将A、B、C习题续8、设计一个系统,它有3个输入端口,它们的数据类型为std_logic;
一个输出端口,类型为std_logic_vector(0to3)。试写出该系统设计实体VHDL程序框架结构。要求结构体中说明信号A、B,它们为std_logic类型。功能描述用一个process语句,其中需说明变量c,为std_logic类型。所有信号均为process语句的敏感信号。67.2022/11/26习题续8、设计一个系统,它有3个输入端口,它们的数据类型为sVHDL语言程序通常包含5部分:实体说明、构造体、配置、包集合、库实体说明构造体配置包集合和库68.2022/11/26VHDL语言程序通常包含5部分:实体说明、构造体、配置、包集2.3VHDL语言设计的基本单元及其构成VHDL语言设计的基本单元就是一个设计实体。库、程序包调用说明ENTITY(实体)说明ARCHITECTURE(结构体)说明注意:库、程序包调用说明语句不是必须的,需要则有;另外两部分是必须有的。VHDL语言描述设计实体的一般格式:69.2022/11/262.3VHDL语言设计的基本单元及其构成VHDL语言设VHDL语言一般结构举例Libraryieee;Useieee.std_logic_1164.all;EntityfredividerisPort(clock:instd_logic; clkout:outstd_logic);Endfredivider;Architecturebehavioroffredivideris signalclk:std_logic;BeginProcess(clock)Begin if(clock’eventandclock=‘1’)then clk<=notclk;endif;Endprocess;clkout<=clk;Endbehavior;库包集合使用说明实体说明构造体说明70.2022/11/26VHDL语言一般结构举例Libraryieee;库包集合使VHDL语言基本单元组成:实体说明+构造体说明例2-11:二选一电路设计单元的VHDL描述:
ENTITYmuxIS
generic(m:time:=1ns);
PORT(d0,d1,sel:inbit;q:outbit);ENDmux;Architecturedataflow
ofmuxisBegin
process(d0,d1,sel)
variabletmp1,tmp2,tmp3:bit;
begintmp1:=d0andsel;tmp2:=d1and(notsel);tmp3:=tmp1ortmp2; q<=tmp3afterm;
endprocess;End
dataflow;d0d1selq&&≥1qd0d1sel实体说明构造体说明71.2022/11/26VHDL语言基本单元组成:实体说明+构造体说明例2-11:二2.3.1实体说明
实体说明是一个设计实体的表层设计单元,描述设计实体与外部电路的接口部分;规定设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。实体说明用于定义电路的输入输出引脚,但并不描述电路的具体构造和实现的功能。ENTITYFredeviderisport(clock:instd_logic;clkout:outstd_logic);end;clockclkoutFredevider输入输出72.2022/11/262.3.1实体说明实体说明是一个设计实体的表1、实体说明格式(语句结构)实体说明的常用语句结构如下:
ENTITY
实体名IS[GENERIC(类属表);][PORT(端口表);]END【实体名】;中间在方括号内的语句描述,在特定的情况下并非是必须的。例如:构建一个VHDL仿真测试基准等情况中可以省去方括号中的语句。73.2022/11/261、实体说明格式(语句结构)实体说明的常用语句结构如下:中间实体声明格式具体说明(续)1)实体名实体名必须与文件名相同,否则编译时会出错。74.2022/11/26实体声明格式具体说明(续)1)实体名74.2022/11/2
2)类属参数
可选项。类属(GENERIC)参数是一种端口界面常数,常以一种说明的形式放在实体说明部分。是一些信息,默认的参数值。如端口大小、总线宽度、时间等。类属参数说明的一般书写格式如下:
GENERIC(类属参数名1,(类属参数名2):数据类型[:=设定值] [;常数名n:数据类型[:设定值]]);75.2022/11/26
2)类属参数
可选项。类属(GENERIC)参数是
2)类属参数(续)
例如:
ENTITYMCKIS
GENERIC(WIDTH:INTEGER:=16;
RISEW:TIME:=1ns;
FALLW:TIME:=1ns);
PORT(ADD_BUS:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0));ENDMCK;注意:(1)类属参数值可以为本实体所属的结构体使用。(2)
类属参数作为常量使用,在定义它的实体内使用时不能修改。(3)该模块被调用时从外部传入参数值。76.2022/11/26
2)类属参数(续)
例如:注意:76.2022/11/253)端口说明端口说明是对于一个设计实体与外部接口的描述。或者说:是CPLD/FPGA器件外部引脚信号的名称、数据类型和传输方向的描述。端口说明书写格式如下:Port
(端口名1:方向数据类型;--每个端口说明用分号隔开;端口名2{,端口名3}:方向数据类型;--每个端口说明可以 --说明多个端口
…
端口名n:方向数据类型);--最后一个端口说明不用分号a)端口名:是设计者为实体的每一个对外通道所取的名字;即实现该设计程序的器件外部引脚的名称——标示符77.2022/11/263)端口说明端口说明是对于一个设计实体与外部接口的描述。Pob)端口方向(端口模式)端口模式符号含义IN输入OUT输出(结构体内部不能读取)INOUT双向(输入输出)BUFFER输出(结构体内部可读取)端口模式:是指这些端口上的数据流动方式,如输入或输出 等;省略为输入(IN)。
注意:端口均为信号,不能作为变量和常量使用。端口模式符号及其含义如下表:INOUTBUFFERINOUT78.2022/11/26b)端口方向(端口模式)端口模式符号含义IN输入OUT输出c)端口数据类型标准类型:BIT和BIT_VICTOR(integer不提倡用)扩展类型:STD_LOGIC和STD_LOGIC_VECTOR扩展类型需要库和程序包的支持,并且需要在程序中指明:libararyieee;Useieee.std_logic_1164.all;注意:端口信号与类属参数的数据类型不能在entity中定义,必须在程序包package中预先定义。79.2022/11/26c)端口数据类型标准类型:BIT和BIT_VICTOR(in4)实体声明格式注意事项EntityfredividerisPort (clock:instd_logic; clkout:outstd_logic );Endfredivider;实体名与保存的文件名必须相同最后一个端口声明后无分号端口名端口模式(方向)端口数据类型80.2022/11/264)实体声明格式注意事项Entityfredivider5)实体说明举例RS触发器VHDL描述中的实体说明部分说明如下:
ENTITYrsffISPORT(set,reset:INBIT;q,qb:BUFFERBIT);ENDrsff;练习:写出下面3-8译码器的实体说明部分。(En为一位控制端)RS触发器元件图RS触
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 共有个人担保合作保证金协议
- 环保项目合作框架
- 授权经销合同的签订流程
- 无担保贷款担保合同
- 劳务分包班组的合同
- 购销合同的履行与监管要点
- 中医医院药材采购合同
- 房屋买卖合同格式市场趋势
- 生产车间承包技术成果成果保护
- 钢筋模板安装分包协议
- 中药指纹图谱和特征图谱研究及其标准建立
- 建设项目管理费用(财建2016504号)
- 小学数学一年级上册《可爱的小猫》课件
- 大学生朋辈心理辅导智慧树知到课后章节答案2023年下浙江大学
- 瑞幸咖啡案例分析
- 陶瓷托辊企业标准
- 幼儿园故事课件:《精忠报国》
- GB/T 7744-2023工业氢氟酸
- 艺术系列各专业职称资格名称一览表
- 参会嘉宾签到表【范本模板】
- 2023年中老年保健食品洞察报告-魔镜市场情报-202308
评论
0/150
提交评论