版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FPGA设计及应用西安科技大学通信与信息工程学院VHDL硬件描述语言基础
VHDL代码结构与要素
VHDL数据对象
VHDL数据类型
VHDL操作符
VHDL预定义属性
VHDL词法规则一个完整的VHDL设计实例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux21aIS
PORT(a,b:INBIT;s:INBIT;y:OUTBIT);END
ENTITYmux21a;ARCHITECTUREoneOFmux21aIS
BEGINy<=aWHENs='0'ELSEb;ENDARCHITECTUREone;实体结构体2选1多路选择器的VHDL描述程序包
VHDL结构与要素VHDL代码的完整结构
VHDL结构与要素
VHDL基本结构
一个相对完整的VHDL程序(或称为设计实体)具有如下图所示的比较固定的结构,即至少应包括三个基本组成部分:
库、程序包使用说明;实体说明;与实体对应的结构体说明;配置说明*
VHDL结构与要素库(Library)
专门存放预编译程序包的地方;包集合(Package)存放各个设计模块共享的数据类型、常数和子程序等;实体(Entity)
用于描述所设计的系统的外部接口信号或引脚;
构造体(Architecture)用于描述系统内部的结构和行为;建立输入和输出之间的时序逻辑关系;
配置(Configuration)安装具体元件到实体—结构体对,可以被看作是设计的零件清单;
VHDL结构与要素库声明库(library)和包的建立和使用有利于设计的重用和代码共享,同时可以使代码结构更加清晰。库的种类
IEEE库;
STD库;
WORK库;VITAL;用户自定义库;
VHDL结构与要素程序包分为包头和包体两部分包头格式:PACKAGE程序包名IS[包头说明语句]END程序包名;调用程序包的通用格式如下:USE库名.程序包名.ALL;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;包体格式:PACKAGEBODY程序包名IS[包体说明语句]END程序包名;
VHDL结构与要素实体说明单元的常用语句结构如下:ENTITY
实体名
IS[GENERIC(类属表);][PORT(端口表);]
END[ENTITY][实体名];实体语句结构
VHDL结构与要素
类属(GENERIC)说明语句
类属(GENERIC)参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分,说明内部电路结构和规模。
类属说明的一般书写格式如下:
GENERIC([常数名1:数据类型:=设定值1];
[常数名n:数据类型n:=设定值n]);
VHDL结构与要素【例】ENTITYMCKIS
GENERIC(WIDTH:INTEGER:=16);--类属说明
PORT(ADD_BUS:OUT
--端口说明STD_LOGIC_VECTOR(WIDTH-1DOWNTO0););END
ENTITYMCK;在这里,GENERIC语句对实体MCK的作为地址总线的端口ADD_BUS的数据类型和宽度作了定义,即定义ADD_BUS为一个16位的位矢量。
VHDL结构与要素
由PORT引导的端口说明语句是对于一个设计实体界面的说明。实体端口说明的一般书写格式如下:
PORT(端口名1:端口模式1数据类型1;
[端口名n:端口模式n数据类型n]);
PORT端口说明
VHDL结构与要素端口模式端口模式说明(以设计实体为主体)IN输入,只读模式,将变量或信号信息通过该端口读入。OUT输出,单向赋值模式,将信号通过该端口输出。BUFFER具有读功能的输出模式,可以读或写,只能有一个驱动源。INOUT双向,可以通过该端口读入或写出信息。端口模式:IEEE1076标准包中定义了四种常用的端口模式,各端口模式的功能及符号分别见表
VHDL结构与要素【例】全加器端口full_adder的VHDL的描述:ENTITYfull_adderISPORT(a,b,c:INBIT;sum,carry:OUTBIT);ENDENTITYfull_adder;上述示例表示全加器有三个输入端口a、b、c,两个输出端口sum、carry,数字类型均为BIT型。
VHDL结构与要素【例】2输入与门的实体描述。LIBRARYIEEE;
USEIEEE.STD_LOGIC.1164.ALL;
ENTITYAND2IS
GENERIC(RISEW:TIME:=1ns;
FALLW:TIME:=1ns);
PORT(A1:INSTD_LOGIC;A0:INSTD_LOGIC;Z0:OUTSTD_LOGIC);
ENDENTITYAND2;
VHDL结构与要素【例】2n计数器实体描述
entitycounter_nis
generic(n:integer:=4);
port(data:instd_logic_vector(n
-1
downto0); clk,rst:instd_logic; q:outstd_logic_vector(n-1
downto0));
endcounter_n;
VHDL结构与要素LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYm60IS
PORT
(clk:INstd_logic;
clear:INstd_logic;
qh:bufferstd_logic_vector(3downto0);
ql:bufferstd_logic_vector(3downto0)
);
ENDm60;
【例】
VHDL结构与要素
VHDL结构与要素entitycounter_nis
generic(n:integer:=4);
port(data:instd_logic_vector(n-1downto0);clk,rst:instd_logic; q:outstd_logic_vector(n-1downto0));--不可缺少endcounter_n;Testbench代码:entityTestBenchis
--tb代码实体内部为空EndTestBench;
VHDL结构与要素EITITY设计时注意点实体名与文件名要一样文件存放位置取名要规范(实体名、端口信号名)合理确定设计所需的端口信号
VHDL结构与要素ARCHITECTURE的基本结构构造体用于描述系统内部的结构和行为构造体是实体的一个重要部分,每一个实体都有一个或一个以上的结构体。完整的结构体由两个基本层次组成:
对数据类型、常数、信号、子程序和元件等元素的说明部分;描述实体逻辑行为的,以各种不同的描述风格表达的功能描述语句。
VHDL结构与要素
VHDL结构与要素结构体的一般语句格式ARCHITECTURE结构体名
OF实体名
IS
[说明语句;]BEGIN
[功能描述语句;]END[ARCHITECTURE][结构体名];
VHDL结构与要素
结构体说明语句结构体中的说明语句是对结构体的功能描述语句中说明的语句:信号(SIGNAL)常数(CONSTANT)数据类型(TYPE)元件(COMPONENT)函数(FUNCTION)、过程(PROCEDURE)等
VHDL结构与要素功能描述语句功能描述语句结构可以含有五种不同类型的、以并行方式工作的语句结构
每一语句结构的内部可能含有并行运行的逻辑描述语句(如BLOCK结构内部语句)或顺序运行的逻辑描述语句(如PROCESS结构内部语句)。
VHDL结构与要素各语句结构的基本组成和功能分别是:块语句由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个模块。
进程语句定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其他的信号进行赋值。
VHDL结构与要素
信号赋值语句将设计实体内的处理结果向定义的信号或界面端口进行赋值。子程序调用语句用于调用一个已设计好的子程序。元件例化语句对其他的设计实体作元件调用说明,并将此元件的端口与其他的元件、信号或高层次实体的界面端口进行连接。
VHDL结构与要素【例】多路选择器VHDL描述方式。ENTITYmuxIS
PORT(a,
b:
INBIT;s:
INBIT;q:
OUTBIT);ENDENTITYmux;ARCHITECTUREbehaveOFmuxISBEGIN
q<=(aAND(NOTs))OR(bANDs);ENDARCHITECTUREbehave;实体mux含输入a、b、s和输出q。结构体behave用逻辑式q=(NOTsANDa)OR(sANDb)实现2选1多路选择器:s=0时q=a,s=1时q=b。
VHDL结构与要素
配置语句用于在多构造体中的实体中选择构造体,配置语句格式:CONFIGURATION配置名
OF实体名
IS
[说明语句]END配置名;例如,在做RS触发器的实体中使用了两个构造体,目的是研究各个构造体描述的RS触发器的行为性能如何,但是究竟在仿真中使用哪一个构造体的问题就是配置问题。例:最简单的配置CONFIGURATION
配置名OF
实体名IS
FOR
被选构造体名
ENDFOR;END配置名;
两个构造体,可以用配置语句进行设置:CONFIGRATIONrsconOFrsIS
--选择构造体FORrsff1END
FOR;ENDrscon;
ENTITYrsISPORT(set,reset:INBIT;q,qb:BUFFERBIT);ENDrs;ARCHITECTURErsff1OFrsISCOMPONENTnand2PORT(a,b:INBIT;
c:OUTBIT);ENDCOMPONENT;BEGIN
U1:nand2PORTMAP(a=>set,b=>qb,c=>q)
U2:nand2PORTMAP(a=>reset,b=>q,c=>qb)ENDrsff1;
ARCHITECTURErsff2OFrsISBEGIN
q<=NOT(qbANDset);qb<=NOT(qANDreset);ENDrsff2例1带有异步复位端的D触发器—纯时序逻辑功能描述:rst=‘1’时,输出q置低电平;否则,时钟信号上升沿时输入的值传递给输出q;注意:时序电路电路随着时钟节拍一步一步地顺序工作顺序执行的代码例题
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYdffIS
PORT(d,clk,rst:INSTD_LOGIC;q:OUTSTD_LOGIC);
ENDdff;
ARCHITECTUREbehaviorOFdffIS
BEGIN
PROCESS(rst,clk)
BEGIN
IF(rst=‘1’)THENq<=‘0’;
ELSIF(clk’EVENTANDclk=‘1’)THENq<=d;
ENDIF;
ENDPROCESS;
ENDbehavior;注意:VHDL不区分大小写!例2D触发器+与非门---组合逻辑与时序逻辑相结合的电路功能描述:无复位端rst;时钟信号上升沿时aNANDb的结果传递给输出q;LIBRARYieee;USEieee.std_logic_1164.all;ENTITYdffnandIS
PORT(a,b,clk:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdffnand;ARCHITECTUREbhvOFdffnandIS
BEGINq<=(anandb)WHEN
clk'eventandclk='1';ENDbhv;
VHDL词法规则VHDL的语言要素,作为硬件描述语言的基本结构元素,主要有:
VHDL文字(包括VHDL标识符)数据对象数据类型各类操作数及运算操作符
而这些基本元素都是由VHDL文字组成,而VHDL文字主要包括词法构成(注释,数字,字符(串),下标)和标识符。数字型文字(1)整数文字。整数文字都是十进制的数。例如:2,5,624,135E2(=13500),25_768_12(=2576812)数字之间的下画线是为了提高文字的可读性,没有任何逻辑运算意义,相当于一个间隔符,不影响文字本身的数值。
VHDL词法规则(2)实数文字。实数文字也都是十进制的数,但必须带有小数点。例如:168.49,26.92,58_2.389(=582.389),2.0,61.3E-2(0.613)(3)物理量文字。例如:110m(110米),30s(30秒),3.3V(3.3伏)需要注意的是,VHDL综合器是不接受此类文字的,只能用于仿真。
VHDL词法规则(4)以数制基数表示的文字:以数制基数表示的文字由五个部分组成,可以表示如下:
基数#基于该基数的整数#E指数其中,第一部分是用十进制数标明数制进位的基数;第二部分是数制隔离符号“#”;第三部分是表达的文字,可以为整数,也可以为实数;第四部分是指数隔离符号“#”;第五部分用字符“E”加十进制表示的指数部分,这一部分的数如果是0,则可以省略不写
VHDL词法规则
基数#基于该基数的整数#E指数例如:SIGNALV1,V2,V3,V4,V5:INTEGERRANGE0TO255;V1<=2#1011#;--(二进制表示,对应十进制数为11)V2<=8#123#;--(八进制表示,对应十进制数为83)V3<=10#101#;--(十进制表示,对应十进制数为101)V4<=16#AD#;--(十六进制表示,对应十进制数为173)V5<=16#E#E1;--(十六进制表示,对应十进制数为224)
VHDL词法规则字符串型文字
字符是用单引号引起来的ASCII字符,既可以是数值,也可以是符号或字母。例如:'A','d','*','3','-'字符串是一维的字符数组,需要放在双引号中。在VHDL中有两种类型的字符串:文字字符串和数位字符串。(1)文字字符串:文字字符串是用双引号引起来的一串文字。例如:"ERROR","WAIT","BOTHAANDFEQUALTOH","DD$EE"
VHDL词法规则
(2)数位字符串:数位字符串(位矢量)用前缀B、O、X分别表示二进制、八进制、十六进制,后跟双引号内的对应数值,其长度等于等效二进制位数。B:二进制基数符号,表示二进制位0或1,在字符串中每一个位表示一个BIT。O:八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。X:十六进制基数符号,代表一个十六进制数,即代表一个4位二进制数。
VHDL词法规则例如:
DATA1<=B"1011"--二进制数组,位矢量长度为4DATA2<=O"24"--八进制数组,位矢量长度为6DATA3<=X"EAAE"--十六进制数组,位矢量长度为16
VHDL词法规则标识符标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。标识符规则是VHDL语言中符号书写的一般规则,为EDA工具提供了标准的书写规范。
VHDL’87版本标识符为短标识符VHDL’93版标识符为扩展标识符。
VHDL词法规则例:合法的标识符:S_MACHINE,present_state,sig3不合法的标识符:present-state,3states,cons_,_now,
entity,_sig为什么它们是不合法的?
VHDL词法规则
短标识符VHDL短标识符需遵守以下规则:
标识符必须为有效的字符,包括26个大小写英文字母,数字0~9以及下画线“_”;必须以英文字母开头;下画线的前后都必须有英文字母或数字;
EDA工具综合、仿真时,短标识符不区分大小写。
VHDL词法规则非法标识符的示例:_Temp1--不能以下画线为起始字符Add1_--标识符的最后不能是下画线5DATA--不能以数字为起始字符WAIT__1--标识符中不能有双下画线SIGNAL--关键字不能作为标识符
VHDL词法规则
扩展标识符扩展标识符的识别和书写有下面的规则:用反斜杠来界定扩展标识符如\control_machine\,\s_block\等都是合法的扩展标识符扩展标识符允许包含图形符号和空格如\s&33\,\legal$state\是合法的扩展标识符两个反斜杠之间的字可以和保留字相同如\SIGNAL\,\ENTITY\是合法的标识符,与SIGNAL、ENTITY是不同的;
VHDL词法规则两个反斜杠之间的标识符可以用数字开头
如\15BIT\,\5ns\是合法的;扩展标识符是区分大小写的如\a\与\A\是不同的标识符;扩展标识符允许多个下划线相邻
如\our__entity\是合法的扩展标识符(不推荐这种方式);扩展标识符的名字中如果含有一个反斜杠,则用相邻的两个反斜杠来代表它如\te\\xe\表示该扩展标识符的名字为te\xe(共5个字符);
VHDL词法规则
VHDL词法规则
下标名与下标段名下标名用于指示数组型变量或信号的某一元素;下标段名则用于指示数组型变量或者信号的某一段元素。SIGNALa,b,c:BIT_VECTOR(0TO7);SIGNALm:INTEGERRANGE0TO3;SIGNALx,y:BIT;x<=a(m);--m是不可计算型下标表示y<=b(3);--3是可计算型下标表示c(0TO3)<=a(4TO7);--以段的方式进行赋值c(4TO7)<=a(0TO3);--以段的方式进行赋值
VHDL词法规则
保留字保留字是在语言中具有特殊含义的单词,在语言中不能作为其他的用途来使用,只能按照标准规定的含义来使用。VHDL有97个保留字和33个增补保留字。例如:entity、architecture、process、if、else
VHDL数据对象在VHDL语言中数据对象有:静态数据对象:非静态数据对象常量(CONSTANT)变量(VARIABLE)信号(SIGNAL)
VHDL数据对象
常量(CONSTANT)常量是在仿真和综合过程中固定不变的值,可通过标示符来引用。常量定义和设置的主要目的是使设计实体中的常数更容易阅读和修改!常量定义的一般格式如下:CONSTANT常数名:数据类型:=表达式;CONSTANTDELAY
:TIME
:=50ns;
--定义DELAY为常量,时间型,值为50
nsCONSTANTVCC
:REAL
:=
5.0;
--定义VCC为常量,实型,值为5.0
VHDL数据对象常量的特点如下:常量一旦被赋值,在仿真与综合中不能改变;常量所赋的值应和定义的数据类型一致;常量的作用范围取决于它定义的位置。常量可以在包集、实体或结构体中声明:包集中:全局;实体中:对该实体内的所有结构体而言是全局的;结构体中:结构体内是全局的。
VHDL数据对象
变量(variable)变量代表电路单元内部的操作,代表暂存的临时数据。与信号和常量相比,变量仅用于局部的电路描述,只能用于进程、函数和过程内部。注意:对变量的赋值是立即生效的,无需等待进程结束。新的值可以在下一行代码中立即使用。变量的赋值符号“:=”,语法结构:VARIABLE变量名:数据类型:=初始值;注意:对变量赋初值的操作也是不可综合的,通常只用于仿真。
VHDL数据对象VARIABLENumber:INTEGERRANGE0TO8;VARIABLEDATA1:STD_LOGIC_VECTOR(7DOWNTO0):=“00000000”;变量定义:变量赋值:VARIABLEx,y:REAL;VARIBALEa,b:STD_LOGIC_VECTOR(7DOWNTO0)x:=50.0;
--实数赋值,x是实数变量y:=5.5+x;--运算表达式赋值,y也是实数变量a:=“10111011”;--位矢量赋值a(0TO5):=b(2TO7);--段赋值
VHDL数据对象
信号(single)VHDL中‘信号’代表电路单元、功能模块间的硬件连线,也可表示电路单元的IN/OUT端口;信号的定义格式如下:SIGNAL信号名:数据类型:=初始值;例:SIGNALs1:STD_LOGIC:='0'
--定义信号s1,类型位标准逻辑,初始值为'0'SIGNALa,b:STD_LOGIC_VECTOR(0to3);
--定义两个信号a,b,为标准逻辑矢量
VHDL数据对象信号赋值格式:目标信号名<=表达式数据的传入可以设置延时量,目标信号获得传入的数据并不是即时的。即使是零延时,也是经历了一个特定的延时。顺序赋值(进程内):仅当进程激活且最后一条有效。并行赋值(结构体内):各语句独立并行执行。例:v1<='1';s1<=s2AFTER20ns;其中v1、s1和s2都是信号,AFTER后面是延迟时间,即s2经过20ns后才把值赋给s1。
VHDL数据对象常量、变量、信号比较
作用域:常量全局;变量仅进程/子程序;信号全局。硬件意义:常量=固定电平;变量/信号≈连线及信号值。行为差异:信号可延时、跨模块通信;变量即时、局部过渡。综合结果:多数情况下信号与变量都可综合成寄存器,延时特性被忽略。初始值:仿真可用,综合无效(芯片上电状态不确定)。
VHDL数据类型在对VHDL的客体进行定义时,都要指定其数据类型。VHDL有多种标准的数据类型,并且允许用户自定义数据类型。
在VHDL语言语义约束中,对类型的要求赋值语句的目标与源的一致;表达式中操作的一致子类型中约束与类型的一致等许多方面。
VHDL数据类型预定义类型在VHDL标准程序包STANDARD中定义,在应用中自动包含进VHDL的源文件,不需要USE语句显示调用。数据类型说明如下
VHDL数据类型标准数据类型(10类)
VHDL数据类型实数(REAL)在进行算法研究或实验时,作为对硬件方案的抽象手段,常常采用实数四则运算。实数的定义值范围为-1.0E+38~+1.0E+38。实数有正负数,书写时一定要有小数点。例如:-1.0,+2.5,-1.0E+38例:SIGNAL
VCC:REAL
-3.3TO3.3
--定义信号VCC,类型为实数,取值范围为-3.3~3.3CONSTANTADD:REAL:=8.2
--定义实数常量ADD,值为8.25
VHDL数据类型整数(INTEGER)整数与数学中整数的定义相似,可以使用预定义运算操作符,如加“+”、减“-”、乘“×”、除“÷”进行算术运算。在VHDL语言中,整数的表示范围为-2147483647~2147483647,即从-(231-1)到(231-1)。例:CONSTANTLENGTH:INTEGER:=4;--定义整数常量LENGTH,值为4SINGNALV1:INTEGERRANGE0TO5;--定义信号V1,整型,取值范围是0~5VARIABLESUM:INTEGER:=10;--定义变量SUM,整型,初值为10
VHDL数据类型自然数(NATURAL)和正整数(POSITIVE)数据类型自然数是整数的一个子类型,包括零和正整数。正整数也是整数的一个子类型,是大于零的整数。自然数和正整数在STANDARD程序包中的定义:SUBTYPENATURALISINTEGERRANGE0TOINTEGER’HIGH;SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER’HIGH;
VHDL数据类型布尔数据类型(BOOLEAN)布尔数据类型是一个二值枚举型数据类型,它的取值只有TRUE和FALSE两种。它不能用于计算,只能通过比较等关系运算获得,表示一些逻辑结构或逻辑状态。综合器用一位二进制位表示BOOLEAN型变量或信号。程序包STANDARD中定义布尔数据类型:TYPEBOOLEANIS(FALSE,TRUE);
VHDL数据类型位(BIT)位数据类型也属于枚举型,取值只能是1或0,用来表示逻辑电平1和逻辑电平0。位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,可以用转换函数进行转换。位矢量(BIT_VECTOR)位矢量只是基于BIT数据类型的数组。例如:SIGNALV1,V2:BIT_VECTOR(7DOWNTO0);--定义信号v1,v2,数据类型为 BIT_VECTOR,位宽为8V1(7DOWNTO4)<="1100"--将V1的高4位赋值为"1100"V2(3DOWNTO0)<=V1(7DOWNTO4)--将V1的高4位赋给V2的低4位
VHDL数据类型字符(CHARACTER)字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘a’。一般情况下VHDL对大小写不敏感,但对字符量中的大小写则认为是不一样的。例如,‘B’不同于‘b’。字符串类型(STRING)字符串数据类型是字符数据类型的一个非约束型数组,或者称为字符串数组,字符串必须用双引号标明。例如:VARIABLESTR1:STRING(0TO3):="A1C2"--定义STR1为字符串数据变量,初值为A1C2VARIBALESTR2:STRING(1TO7);--定义STR2为字符串数据变量STR2:="DBCA"--将DBCA赋给变量STR2
VHDL数据类型时间(TIME)时间是VHDL中唯一的预定义物理类型。完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格,例如:15ms,60s。在系统仿真时,可以表示信号延时,从而使模型系统能更逼近实际系统的运行环境。错误等级(SEVERITYLEVEL)错误等级类型数据用来表征系统的状态,共有4种:note(注意),warning(警告),error(出错),failure(失败)。用这4种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。
VHDL数据类型综合器不支持的数据类型介绍虽然在VHDL的标准程序包中定义了非常多的数据类型,但是有些是不可以综合的,其中一些只能用于仿真中,或者根本不存在相应的硬件结构。(1)物理类型。综合器不支持物理类型的数据,如具有量纲型的数据类型,包括时间类型,都只能用于仿真过程。
(2)浮点型。如REAL型。(3)Access型。综合器不支持存取型结构的数据,因为不存在对应的硬件结构。(4)File型。综合器不支持磁盘文件型的数据,硬件对应的文件仅为RAM和ROM。
VHDL数据类型IEEE预定义标准标准化数据类型标准逻辑位数据类型(STD_LOGIC)的定义如下:TYPESTD_LOGICIS('U','X','0','1','Z','W','L','H','_');这里定义的9个值的含义如下:U
--未初始化的X
--强未知的0
--强01
--强1Z
--高阻态W
--弱未知的L
--弱0H
--弱1_
--忽略
VHDL数据类型标准逻辑矢量数据类型(STD_LOGIC_VECTOR)标准逻辑矢量数据类型是STD_LOGIC_1164程序包中定义的一维数组,元素均为标准逻辑位数据类型;必须指定位宽与方向,且仅当位宽、类型完全一致时才能相互赋值。例如:SIGNALv1,v2:STD_LOGIC_VECTOR(7DOWNTO0);v1(7DOWNTO4)<="1100";--将v1的高4位赋值为"1100"v2(3DOWNTO0)<=v1(7DOWNTO4);--将v1的高4位赋值给v2的低4位
VHDL数据类型有符号数和无符号数在ieee库中有一个名为std_logic_arith的包集,其中包括有符号数(signed)和无符号数(unsigned)例:
VARIABLEv1:UNSIGNED(0TO3);--定义变量v1为无符号数据类型,位宽为4
VARIABLEv3:SIGNED(4DOWNTO1);--定义变量v3为有符号数据类型,位宽为4注意:signed和unsigned的合法和非法运算,同时和标准逻辑位和逻辑位矢量一样,应用前必须进行包声明。
VHDL数据类型
用户自定义的数据类型可以由用户定义的数据类型有:枚举(ENUMERATED)类型;TYPEstateIS(idle,forward,backward,stop);TYPEmy_logicIS(‘0’,’1’,’z’);TYPEcolorIS(red,green,blue,white);
VHDL数据类型整数(INTEGER)类型例如:TYPENUM1IS
INTEGER
RANGE5TO100
--7位二进制原码TYPENUM2ISINTEGERRANGE-100TO100
--8位二进制补码定义为整数或实数的数据对象的具体的数据类型必须由用户根据实际的需要重新定义,并限定其取值范围
VHDL数据类型子类型在原有的已定义数据类型基础上加上一些约束条件,可以定义数据类型的子类型。SUBTYPEnaturalISINTEGERRANGE0TOINTEGER’SHIGH;SUBTYPEDIGITSINTEGERRANGE0TO99;--定义整数子类型DIGITS,取值0~99SUBTYPEmy_logicISSTD_lOGICRANGE‘0’TO‘z’;
VHDL数据类型数组(ARRAY)类型
数组(array)是将相同数据类型的数据结合在一起形成的一种新的数据类型,它可以是一维的,也可以是二维的。数组定义语句格式如下:TYPE数组名
ISARRAY(数组范围)OF数据类型;限定性数组和非限定性数组:TYPEDINIS
ARRAY(7DOWNTO0)OFSTD_LOGIC;VARIABLEva:BIT_LOGIC(1TO6);第一句中定义的数组类型名称是DIN,它有8个元素。第二句是非限定性的举例,数组的取值范围是1~6。
VHDL数据类型记录(RECORDE)类型记录类型和数组类型有些相似,RECORD类型内部可以包含不同类型的数据,而ARRAY只能包含相同类型的数据。例
TYPEbirthday ISRECORDday:INTEGERRANGE1TO31month:month_name;ENDRECORD;
VHDL数据类型时间(TIME)类型时间类型数据用于表示时间,在仿真时使用。其语句格式如下:TYPE数据类型名IS范围UNITS基本单位;单位ENDUNITS;
VHDL数据类型数据类型转换
为了实现正确的运算操作,必须将要操作的数据进行类型转换。数据类型的转换有三种方法:函数转换法、类型标记转换法和常数转换法。函数转换法:程序包函数名功能STD_LOGIC_1164TO_STD_LOGIC_VECTOR(A)由BIT_VECTOR转换成STD_LOGIC_VECTORTO_BIT_VECTOR(A)由STD_LOGIC_VECTOR转换成BIT_VECTORTO_STD_LOGIC(A)由BIT转换成STD_LOGICTO_BIT(A)由STD_LOGIC转换成BITSTD_LOGIC_ARITHCONV_STD_LOGIC_VECTOR(A,位长)由INTEGER、UNSIGNED、SIGNED转换成STD_LOGIC_VECTORCONV_INTEGER(A)由UNSIGNED、SIGNED转换成INTEGERSTD_LOGIC_UNSIGNEDCONV_INTEGER(A)由STD_LOGIC_VECTOR转换成INTEGER
VHDL数据类型数据类型转换类型标记转换法:类型标记就是类型的名称。类型标记法适合那些关系密切的标量类型之间的类型转换,即整数和实数的类型转换。例如:VARIABLEI:INTEGER;VARIABLER:REAL;I:=INTEGER(R);R:=REAL(I);
常数转换法:常数转换法是指在程序中用常数将一种数据类型转换成另一种数据类型。该方法的转换效率是比较高的,但是不经常使用。
VHDL操作符赋值操作符逻辑操作符关系操作符算术操作符重载操作符与其他程序设计语言相似,VHDL中的表达式也是由运算符将基本元素连接起来形成。VHDL有4类基本的操作符,分别是赋值操作符、逻辑操作符、关系操作符和算术操作符。另外还有重载操作符,这是用户自定义的操作符。
VHDL操作符在VHDL中,赋值操作符用于将值赋给信号或变量。根据赋值对象的不同,赋值操作符分为:信号赋值操作符和变量赋值操作符。“<=”,“:=”。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYvariable_assignment_exampleIS
PORT(
a,b:ININTEGER;
c:OUTINTEGER
);ENDENTITYvariable_assignment_example;ARCHITECTUREbehaviorOFvariable_assignment_exampleISBEGIN
PROCESS(a,b)
VARIABLEtemp:INTEGER;
BEGIN
temp:=a+b;
--变量赋值
c<=temp;
--信号赋值
ENDPROCESS;ENDARCHITECTUREbehavior;赋值操作符
VHDL操作符赋值操作符在VHDL语言中,共有7种逻辑运算符,他们分别是:
NOT取反;
AND与;
OR或;
NAND与非;
NOR或非;
XOR异或;XNOR同或。
这7种逻辑运算符可以对“BIT”和“STD_LOGIC”等逻辑型数据、“STD_LOGIC_VECTOR”逻辑型数组及布尔数据进行逻辑运算。必须注意:
运算符的左边和右边,以及代入的信号的数据类型必须是相同的。
VHDL操作符【例】SIGNALa,b,c:STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALh,i,j,k:STD_LOGIC;
SIGNALl,m,n,o,p:BOOLEAN;
...a<=bANDc;--b、c相与后向a赋值,a、b、c的数据类型同属4位长的位矢量
d<=eORfORg;--两个操作符OR相同,不需括号
h<=(iNANDj)NANDk;--NAND不属上述三种算符中的一种,必须加括号
l<=(mXORn)AND(oXORp);--操作符不同,必须加括号
h<=iANDjANDk;--两个操作符都是AND,不必加括号
h<=iANDjORk;--两个操作符不同,未加括号,表达错误
a<=bANDe;--操作数b与e的位矢长度不一致,表达错误
h<=iORl;--i的数据类型是位STD_LOGIC,而l的数据类型是
...--布尔量BOOLEAN,因而不能相互作用,表达错误。
VHDL操作符关系操作符【例】
ENTITYrelational_ops_1IS
PORT(a,b:INBIT_VECTOR(0TO3);output:OUTBOOLEAN);ENDrelational_ops_1;
ARCHITECTUREexampleOFrelational_ops_1ISBEGINoutput<=(a=b);ENDexample;【例】
ENTITYrelational_ops_2IS
PORT(a,b:ININTEGERRANGE0TO3;output:OUTBOOLEAN);
ENDrelational_ops_2;
ARCHITECTUREexampleOFrelational_ops_2IS
BEGINoutput<=(a>=b);
ENDexample;六种关系运算操作符:“=”(等于)、“/=”(不等于)、“>”(大于)、“<”(小于)、“>=”(大于等于)“<=”(小于等于)
VHDL操作符算数操作符VHDL语言中有4类算术运算符,他们分别是:求和操作符:+、-、&求积操作符:*、/、MOD、REM混合操作符:**、ABS移位操作符:SLL、SRL、SLA、SRA、ROL、ROR
VHDL操作符【例】VARIABLEa,b,c,d,e,f:INTEGERRANGE0TO255;...a:=b+c;d:=e–f;【例】PROCEDUREadding_e(a:ININTEGER;b:INOUTINTEGER)IS...b:=a+b;求和操作符
VHDL操作符例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYConcatISPORT(a:INSTD_LOGIC_VECTOR(3downto0);b:INSTD_LOGIC_VECTOR(3downto0);result:OUTSTD_LOGIC_VECTOR(7downto0));ENDConcat;ARCHITECTUREBehavioralOFConcatISBEGINPROCESS(a,b)BEGINresult<=a&b;ENDPROCESS;ENDARCHITECTUREBehavioral;在结构体Behavioral中,使用并置操作符(&)将信号a和b连接起来,并将结果赋值给result。信号a的四位将作为结果的高四位,信号b的四位将作为结果的低四位。
VHDL操作符求积操作符求积操作符包括*(乘)、/(除)、MOD(取模)和REM(取余)四种操作符。混合操作符包括乘方“**”操作符和取绝对值“ABS”操作符两种混合操作符【例】SIGNALa,b:INTEGERRANGE-8to7;SIGNALc:INTEGERRANGE0to15;SIGNALd:INTEGERRANGE0to3;a<=ABS(b);c<=2**d;
VHDL操作符移位操作符移位操作符的语句格式是:
标识符移位操作符移位位数;SLL(逻辑左移)SRL(逻辑右移)SLA(算术左移)SRA(算术右移)ROL(逻辑循环左移)ROR(逻辑循环右移)
例:“1011”SLL1
=
“0110”
“1011”SRL1
=
“0101”“1011”SLA1
=
“0111”
“1011”SRA1
=
“1101”“1011”ROL1
=
“0111”
“1011”ROR1
=
“1101”
VHDL操作符重载操作符即用户自定义操作符,可以与预定义的操作符具有相同的名称。对已存在的操作符重新定义,可进行不同类型操作数之间的运算。例:对一个整数和一个1位的二进制数进行加法运算
function“+”(a:integer;b:bit)returnintegerisbeginif(b=‘1’)thenreturna+1;
elsereturna;endif;end“+”;
VHDL操作符的优先顺序
运算符
NOT,ABS,***,/,MOD,REM+(正号),-(负号)+,-,&SLL,SLA,SRL,SRA,ROL,ROR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院慈善医疗服务工作总结
- 乡村流动人口关怀关爱宣传活动总结
- 第3章 钢筋模型的构建
- 农村乱占耕地建房整治分类办法
- 薄膜工艺技术培训大纲
- 家庭小型暗物质探测仪误报排查指南
- 2026年起重工(技师)职业技能鉴定理论考试核心题(新版)
- 自然语言处理(第1章)教案 预备知识
- 2026年事业单位联考D类《综合应用能力》(小学)真题及参考答案
- 2026年上半年小学教师资格证考试《教育教学知识与能力》真题及答案
- (高清版)DG∕TJ 08-7-2021 建筑工程交通设计及停车库(场)设置标准
- T-CITSA 35-2023 交通信息采集 激光交通流检测器
- 音乐与舞蹈的课件
- 第五章净选加工课件
- 审计基础原理与实务教案
- 《妇产科学》课程教学大纲
- 医院手术委托书模版
- T-GDNAS 059-2024 应用翻身床翻身技术
- 2024-2025成都各区初二年级下册期末数学试卷
- 17α-羟化酶缺乏症病因介绍
- 画法几何及工程制图教案
评论
0/150
提交评论