您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > VHDL数据类型(vhdl语法)
VHDL数据类型FPGA应用技术二、VHDL数据类型与数据对象在VHDL程序中,我们经常会遇到这样的语句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;数据对象类型数据类型数据对象名VHDL语言中的基本数据类型逻辑类型数值类型布尔代数(Boolean)位(Bit)标准逻辑(Std_Logic)整数(Integer)实数(Real)二、VHDL数据类型与数据对象逻辑数据类型(1)布尔代数(Boolean)型;(2)位(Bit);(3)标准逻辑(Std_logic);typeBITis(‘0’,‘1’);typeBOOLEANis(FALSE,TRUE);二、VHDL数据类型与数据对象标准逻辑类型TypeStd_LogicIs(‘U’,--Undefined(未初始化)‘X’,--ForcingUnknown(强未知)‘0’,--Forcing0(强0)‘1’,--Forcing1(强1)‘Z’,--HignImpedance(高阻)‘W’,--WeakUnknown(弱未知)‘L’,--Weak0(弱0)‘H’,--Weak1(弱1)‘-’,--Don’tCare(忽略))二、VHDL数据类型与数据对象标准逻辑类型对数字逻辑电路的逻辑特性描述更加完整,真实,因此在VHDL程序中,对逻辑信号的定义通常采用标准逻辑类型.逻辑序列位序列(Bit_Vector)标准逻辑序列(Std_Logic_Vector)二、VHDL数据类型与数据对象Signaldata:Std_Logic_Vector(7downto0);Signaladdr:Bit_Vector(0to3);序列的范围大小声明方式:To,Downto序列的使用二、VHDL数据类型与数据对象序列的分解与合成SignalA:Std_Logic_Vector(3downto0);SignalB:Std_Logic_Vector(0to3);SignalC:Std_Logic_Vector(0to1);SignalD:Std_Logic_Vector(1downto0);C=A(2downto1);B=A(3)&D&‘1’;二、VHDL数据类型与数据对象数值类型(1)整数TypeIntegerIsRange-231~231-1限定整数取值范围的方法:SignalA:Integer;SignalB:IntegerRange0to7;SignalC:IntegerRange-1to1;二、VHDL数据类型与数据对象无符号数Unsigned与标准逻辑序列相似,声明时必须指明其位数。SignalA:Unsigned(3downto0);SignalB:Unsigned(7downto0);注意:必须使用downto形式。二、VHDL数据类型与数据对象(2)实数TypeRealIsRange-1.7E38to1.7E38;实数类型的表示可用科学计数形式或者带小数点的形式。二、VHDL数据类型与数据对象VHDL中的运算符二、VHDL数据类型与数据对象算术运算符:+加-减*乘/除**乘方mod求模rem求余abs求绝对值逻辑运算:and逻辑与or逻辑或nand与非nor或非xor异或xnor同或not逻辑非关系运算符:=等于/=不等于小于=小于或等于大于=大于或等于注:其中‘=’操作符也用于表示信号的赋值操作。&连接符,将两个数据对象或矢量连接成维数更大的矢量,它可给代码书写带来方便。例如:vabc=a&b&c;如果a=‘1’,b=‘0’,c=‘1’,则vabc=“101”。二、VHDL数据类型与数据对象用户自定义数据类型:(1)列举数据类型Type列举名称is(元素1,元素2,…)例子:Typestateis(S0,S1,S2,S3);SignalA:state;二、VHDL数据类型与数据对象(2)数组类型Type数组名称isArray(范围)of数据类型;例子:TypeByteisArray(7downto0)ofBit;Signalsdo:Byte;二、VHDL数据类型与数据对象数据类型的转换在VHDL语言里,不同类型的数据信号之间不能互相赋值。当需要不同类型数据之间传递信息时,就需要类型转换函数将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。二、VHDL数据类型与数据对象例如:SignalY:Std_logic_vector(7downto0);SignalX:Integerrange0to255;Y=CONV_STD_LOGIC_VECTOR(X,8);二、VHDL数据类型与数据对象CONV_INTEGER将数据类型UNSIGNED,SIGNED转换为INTEGER类型.CONV_UNSIGNED将数据类型INTEGER,SIGNED转换为UNSIGNED类型.CONV_SIGNED将数据类型INTEGER,UNSIGNED转换为SIGNED类型.CONV_STD_LOGIC_VECTOR将数据类型INTEGER,UNSIGNED,SIGNED,STD_LOGIC转换为STD_LOGIC_VECTOR类型.二、VHDL数据类型与数据对象数据对象常量信号变量(DataObjects)二、VHDL数据类型与数据对象(1)常量定义格式:Constant常量名称:数据类型:=给定值;常量通常来来定义延迟和功耗等参数。注意!常数定义的同时进行赋初值。常数可以在实体说明、结构体描述中使用。二、VHDL数据类型与数据对象libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--必需定义+entityexam1isport(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0));endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop=ip+num;endm1;二、VHDL数据类型与数据对象(2)信号定义格式Signal信号名称:数据类型[:=初始值];信号相当于电路内部元件之间的物理连线,因此信号的赋值有一定的延迟时间.二、VHDL数据类型与数据对象“信号”数据对象,代表电路内部信号或连接线路,其在元件之间起互连作用。注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。信号为全局量。在实体说明、结构体描述和程序包说明中使用。信号赋值的语法格式为:信号名=表达式;如:SignalS1:Std_logic_vector(3Downto0);S1=“0000”;二、VHDL数据类型与数据对象(3)变量定义格式Variable变量名称:数据类型[:=初始值];变量只能用于“进程”之中,变量的赋值是立即生效的,常用于高层次抽象的算法描述当中。二、VHDL数据类型与数据对象•“变量”数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。•变量为局部量。•仅限于进程(Process)或子程序中使用。•变量赋值的语法格式为:目标变量:=表达式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;二、VHDL数据类型与数据对象信号和变量的比较(1)信号和变量的对应关系不同:信号代表电路内部信号或连接线路;而变量则不是。(2)信号和变量声明的位置不同:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。(3)信号为全局量,而变量只在定义它的域中才可见。因此,变量不能在两个进程之间传递信息。(4)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次赋值都会改变它的值。(5)赋值不同。在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“=”,变量赋值为“:=”。数据对象属性(1)数值类属性:(数组类型的数据对象)数值类属性有’left,’right,’low,’high,’length。其中用符号’隔开对象名及其属性。left表示数组的左边界;right表示数组的右边界;low表示数组的下边界;high表示数组的上边界;length表示数组的长度。如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);则这两个信号的属性值分别为:A’left=7;A’right=0;A’low=0;A’high=7;A’length=8;B’left=0;B’right=3;B’low=0;B’high=3;B’length=4;数据对象属性(2)’event属性:’event属性,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为True,否则为False。利用此属性可识别时钟信号的变化情况,即时钟是否发生。数据对象属性例如:时钟边沿表示:signalclk:instd_logic;If(clk’eventandclk=’1’)thenQ=Q+1;则clk’eventandclk=’1’表示时钟的上升沿。即时钟变化了,且其值为1。clk’eventandclk=’0’表示时钟的下降沿。即时钟变化了,且其值为0。数据对象属性例2:设计组合逻辑电路设计一个1bit全加器。输入X,Y,CI输出Z,COlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityfull_bit_adderisport(a,b,ci:instd_logic;y,cout:outstd_logic);endfull_bit_adder;architecturebh1offull_bit_adderisbeginy=((nota)and(notb)andci)or((nota)and(b)and(notci))or((a)and(notb)and(notci))or((a)and(b)and(ci));cout=(bandci)or(aandci)or(aandb);endbh1;architecturebh2offull_bit_adderisbeginy=axorbxorci;cout=(aandb)or(aandci)or(bandci);endbh2;configurationcon1offull_bit_adderisforbh2endfor;endcon1;(1)触发器设计DQCPCPDQ无上升沿XQn-10-1000-111D触发器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffISPORT(cp,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff;ARCHITECTUREaOFdffISBEGINprocess(cp)beginifcp'eventandcp='1'thenq=d;endif;endprocess;ENDa;(3)计数器设计计数器CLKQLIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;USEieee.std_logic_arith.ALL;ENTITYcounterISPORT(clk:inSTD_LOGIC;q:bufferSTD_LOGIC_vector(3downto0));ENDcounter;ARCHITECTUREaOFcount
本文标题:VHDL数据类型(vhdl语法)
链接地址:https://www.777doc.com/doc-7032824 .html