您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > VHDL基础快速入门教程
1第二章VHDL基本数据类型与命令语句2.2VHDL数据对象定义2.1VHDL基本数据类型2.3并行同时语句(When-Else,With-Select)2.4顺序语句一(Process,If-Else,Wait)2.5顺序语句二(Case-When,Null)22.1基本数据类型(逻辑信号、数值信号)在VHDL中每一个数据对象都必须具有确定的数据类型。只有在相同数据类型的数据对象之间,才能进行数据交换。⑴布尔代数数据类型(BOOLEAN);⑵位逻辑数据类型(BIT);⑶位逻辑序列数据类型(BIT_VECTOR);⑷标准逻辑数据类型(STD_LOGIC);⑸标准逻辑序列数据类型(STD_LOGIC_VECTOR);3⑹整数数据类型(INTEGER);⑺实数数据类型(REAL);⑻字符串数据类型(STRING);⑼字符数据类型(CHARACTER);⑽无符号整数数据类型(UNSIGNED);今后在逻辑设计中最常用到两种:标准逻辑数据类型STD_LOGIC和标准逻辑序列数据类型STD_LOGIC_VECTOR。其语法格式:在实体中是跟在端口模式(方向)后面,在结构体中是跟在数据对象后面。42.1.1逻辑信号的数据类型⑴布尔代数数据类型(BOOLEAN)布尔代数数据类型(BOOLEAN)属于双值数据类型,其值只有“TRUE”(真)、“FALSE”(假)两种状态,常用来表示关系运算和关系运算的结果。⑵位逻辑数据类型(BIT)位逻辑数据类型(BIT)也属于双值数据类型,其值只有‘1’、'0'(用单引号表示)两种状态,常用来表示某一管脚的逻辑值。5⑶标准逻辑数据类型(STD_LOGIC)标准逻辑数据类型(STD_LOGIC)也属于双值数据类型,但它比“BIT”对于数字逻辑电路的逻辑特性的描述更完整、更真实。因此在VHDL中通常都是采用这种数据类型。它的取值共有九种形式:①'U'——初始值;②'X'——不定值;③'0'——低电位0;④'1'——高电位1;⑤'Z'——高阻抗;⑥'W'——弱信号不定值;⑦'L'——弱信号0;⑧'H'——弱信号1;⑨'–'——不可能情况,不必理会。6⑷标准逻辑序列数据类型(STD_LOGIC_VECTOR)标准逻辑序列数据类型(STD_LOGIC_VECTOR)也属于双值数据类型,但它描述的是一组序列信号的数据类型。如:数据总线、地址总线等(排线)上面的数值。⑸位逻辑序列数据类型(BIT_VECTOR)位逻辑序列数据类型(BIT_VECTOR)也属于双值数据类型,其值只有1、0(用双引号表示)两种状态,常用来表示某一组管脚的位逻辑值。7⑹逻辑信号的运算配合逻辑信号的基本运算符,通常包含有两种:andornandnorxorxnornot与门或门与非门或非门异或门同或门非门①逻辑运算符②关系运算符=/===等于不等于小于小于等于大于大于等于注意:“=”符号与赋值符号相同,由上下文来区别。82.1.2数值信号的数据类型⑴整数数据类型(Integer)整数数据类型的数有正整数、负整数和0,在VHDL中其取值范围是-2147483647~2147483646。即:。)12(~)2(3131⑵无符号整数数据类型(UNSIGNED);无符号整数数据类型的数与标准逻辑序列相似,定义时也必须指明这个无符号整数的位数。[例1]假若A中的内容是3(11)2,B中的内容是2(10)2,试分析下程序运行后,C和D中的内容是多少?9LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCH2_1_3isPORT(A:INStd_Logic_Vector(1DOWNTO0);B:INUnsigned(1DOWNTO0);C:OUTUnsigned(7DOWNTO0);D:OUTStd_Logic_Vector(1DOWNTO0));ENDCH2_1_3;ARCHITECTUREaOFCH2_1_3ISSIGNALE,F,G:Unsigned(1DOWNTO0);SIGNALH:Unsigned(7DOWNTO0);10BEGINE=Unsigned(A);--(1)F=B;--(2)H(1DOWNTO0)=E+F;--(3)H(3DOWNTO2)=E-F;--(4)H(7DOWNTO4)=E*F;--(5)G(0)=E(0)ANDF(0);--(6)G(1)=E(1)ORF(1);--(7)C=H;--(8)D=Std_Logic_Vector(G);--(9)ENDa;因为A中的内容是3(11)2,B中的内容是2(10)2,故:①E=Unsigned(A)后,E=3(11)2;②F=B后,F=2(10)2;11BEGINE=Unsigned(A);--(1)F=B;--(2)H(1DOWNTO0)=E+F;--(3)H(3DOWNTO2)=E-F;--(4)H(7DOWNTO4)=E*F;--(5)G(0)=E(0)ANDF(0);--(6)G(1)=E(1)ORF(1);--(7)C=H;--(8)D=Std_Logic_Vector(G);--(9)ENDa;因为E=3(11)2,F=2(10)2,故:③H(1Downto0)=E+F后,H=5(101)2=1(01)2;④H(3Downto2)=E−F后,H=1(01)2;12BEGINE=Unsigned(A);--(1)F=B;--(2)H(1DOWNTO0)=E+F;--(3)H(3DOWNTO2)=E-F;--(4)H(7DOWNTO4)=E*F;--(5)G(0)=E(0)ANDF(0);--(6)G(1)=E(1)ORF(1);--(7)C=H;--(8)D=Std_Logic_Vector(G);--(9)ENDa;因为E=3(11)2,F=2(10)2,故:⑤H(7Downto4)=E*F后,H(7Downto4)=6(0110)2;所以:H(7Downto0)为(01100101)2=(65)16;13BEGINE=Unsigned(A);--(1)F=B;--(2)H(1DOWNTO0)=E+F;--(3)H(3DOWNTO2)=E-F;--(4)H(7DOWNTO4)=E*F;--(5)G(0)=E(0)ANDF(0);--(6)G(1)=E(1)ORF(1);--(7)C=H;--(8)D=Std_Logic_Vector(G);--(9)ENDa;因为E=3(11)2,F=2(10)2,故:⑥G(0)=E(0)ANDF(0)后,G(0)=0;⑦G(1)=E(1)ORF(1)后,G(1)=1;14BEGINE=Unsigned(A);--(1)F=B;--(2)H(1DOWNTO0)=E+F;--(3)H(3DOWNTO2)=E-F;--(4)H(7DOWNTO4)=E*F;--(5)G(0)=E(0)ANDF(0);--(6)G(1)=E(1)ORF(1);--(7)C=H;--(8)D=Std_Logic_Vector(G);--(9)ENDa;因为H(7Downto0)为(65)16,G(1Downto0)为2(10)2,故:⑧C=H后,C(7Downto0)为(65)16=(01100101)2;⑨D=Std_Logic_Vector(G)后,D(1Downto0)为2(10)215程序运行后:C(7Downto0)为(65)16=(01100101)2;D(1Downto0)为2(10)2。仿真结果如下图所示:A中的内容是3(11)2,B中的内容是2(10)2,仿真的结果是:C中的内容为65,D中的内容为2。16注意1、无符号整数(Unsigned)与标准逻辑序列(Std_Logic_Vector)信号之间是可以作转换的;2、无符号整数(Unsigned)信号的序列编号是由高至低的,所以一定要使用Downto的序列形式来定义。17⑶实数数据类型(Real)VHDL的实数数据类型(Real)与数学中的实数浮点数相似,只是范围限定为:-1.0E38~1.0E38,并且在书写时一定要有小数。如下程序段所示:ARCHITECTUREaOFTestISSIGNALA,B,C:Real;BEGINA=1.5;--带小数点B=5.0;C=3.0E8;--科学计数ENDa;182.2数据对象定义(常数、信号、变量)2.2.1常数(Constant)将数据对象定义为常数(Constant),是希望该常数所代表的数据部分不会被改变。这样一来,程序的可读性和维护性相对提高。其语法格式为:Constant常数名称:数据类型:=设置值;常数名称的命名规则:⑴第一个字符必须是英文字母;19ConstantZero:Std_Logic_Vector(3Downto0):=0000;⑵最后一个字符不可以是下划线符号,中间也不能有两个连续下划线相连;⑶常数名称不可以与VHDL的语法字相同。注意:设置值一旦设定,就不能再更改。[例2]定义Zero为一个四位长的标准逻辑序列数据类型的常数零。[例1]定义V为一个正整数(INTEGER)数据类型的8。ConstantV:INTEGER:=8;202.2.2信号(Signal)信号(Signal)是VHDL中的一种重要的数据对象。主要用于描述硬件电路中的一条硬件连接线或指定电路内部的某一节点(补充的端口)。其语法格式为:Signal信号名[,信号名…]:数据类型[:=表达式];注意:⑴在VHDL语言程序中,信号赋值的符号与上面不同,不能用“:=”运算符,应为“=”运算符。21⑵如果在说明信号的时候没有赋予初始值,那么则认为它取默认值,即指定数据类型的最左值或者是最小值。⑶信号可以在程序包、实体和结构体中说明(定义),但说明(定义)的信号只能在本结构中或向下结构中使用。[例]试用VHDL对CPLD或FPGA编程,实现右图电路的逻辑功能。当A=1,B=1,C=0仿真结果F为多少?ABCDEF22LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCH2_2_1isPORT(A:INStd_Logic;B:INStd_Logic;C:INStd_Logic;F:OUTStd_Logic);ENDCH2_2_1;ABCDEF23⑴由于A、B、C、F是外部引脚,所以它们要在实体中说明(定义),而不是在结构体中说明。⑵而D、E是电路的内部节点,因此须放在结构体中用信号的方式来说明(定义)。ARCHITECTUREaOFCH2_2_1ISSIGNALD,E:Std_Logic;BEGIND=AandB;--A与B后送入DE=notC;--将C取非后送入EF=DorE;--D或E后送到FENDa;ABCDEF24ABCDEF当A=1,B=1,C=0时,F=1。见下面的仿真后的结果。252.2.3变量(Variable)这种数据对象仅限用于进程、过程、函数语句和子程序(后面将要介绍)中,在程序其它部分是无效的,它没有物理意义。因此变量主要功能是做局部数据的暂时存储。其语法格式为:注意:Variable变量名[,变量名…]:数据类型[:=表达式];⑴在进程中若使用变量数据对象进行设置时,只能用“:=”运算符,而不是“=”。26⑵变量的赋值是直接的,一经赋值立即生效,因此在变量赋值语句中,不允许出现附加延时。⑶若要将变量的值用于它的范围之外,必须先要将变量的值赋给一个相同类型的信号,然后再由该信号带出去才行。补充:信号和变量的区别⑴对信号赋值是有一定延迟的,而对变量赋值是没有延迟的。⑵对于进程语句来说,进程
本文标题:VHDL基础快速入门教程
链接地址:https://www.777doc.com/doc-1611041 .html