1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,VHDL,数据类型,FPGA,应用技术,二、,VHDL,数据类型与数据对象,在,VHDL,程序中,我们经常会遇到这样的语句:,Signal,A :,std_logic,;,Variable,B :,std_logic_vector(7 downto 0);,Constant,C :,integer,;,数据对象类型,数据类型,数据对象名,VHDL,语言中的基本数据类型,逻辑类型,数值类型,布尔代数,(Boolean),位,(Bit),标准逻辑,(Std_Logic),整数,(Integer),实数,(Real)
2、二、,VHDL,数据类型与数据对象,逻辑数据,类型,(,1,)布尔代数(,Boolean,)型;,(,2,)位(,Bit,);,(,3,)标准逻辑(,Std_logic,);,type,BIT,is(,0,1,);,type,BOOLEAN,is(,FALSE,TRUE,);,二、,VHDL,数据类型与数据对象,标准逻辑类型,Type Std_Logic Is,(,U,-Undefined(,未初始化,),X,-Forcing Unknown,(强未知),0,-Forcing 0,(强,0,),1,-Forcing 1,(强,1,),Z,-Hign Impedance,(高阻),W,-Wea
3、k Unknown,(弱未知),L,-Weak 0,(弱,0,),H,-Weak 1,(弱,1,),-,-Dont Care,(忽略),),二、,VHDL,数据类型与数据对象,标准逻辑类型对数字逻辑电路的逻辑特性描述更加完整,真实,因此在,VHDL,程序中,对逻辑信号的定义通常采用标准逻辑类型,逻辑序列,位序列,(Bit_Vector),标准逻辑序列,(Std_Logic_Vector),二、,VHDL,数据类型与数据对象,Signal,data,:Std_Logic_Vector(7 downto 0);,Signal,addr,:Bit_Vector(0 to 3);,序列的范围大小声明方
4、式:,To,Downto,序列的使用,二、,VHDL,数据类型与数据对象,序列的分解与合成,Signal,A,:Std_Logic_Vector(3 downto 0);,Signal,B,:Std_Logic_Vector(0 to 3);,Signal,C,:Std_Logic_Vector(0 to 1);,Signal,D,:Std_Logic_Vector(1 downto 0);,C,=,A,(2 downto 1);,B,=,A,(3),&,D,&,1;,二、,VHDL,数据类型与数据对象,数值类型,(,1,)整数,Type Integer Is Range -2,31,2,31
5、1,限定整数取值范围的方法:,Signal,A,:Integer;,Signal,B,:Integer Range 0 to 7;,Signal,C,:Integer Range-1 to 1;,二、,VHDL,数据类型与数据对象,无符号数,Unsigned,与标准逻辑序列相似,声明时必须指明其,位数。,Signal,A,:Unsigned(3 downto 0);,Signal,B,:Unsigned(7 downto 0);,注意,:,必须使用,downto,形式。,二、,VHDL,数据类型与数据对象,(,2,)实数,Type,Real,Is Range-1.7E38 to 1.7E3
6、8;,实数类型的表示可用科学计数形式或者带小数点的形式。,二、,VHDL,数据类型与数据对象,VHDL,中的运算符,二、,VHDL,数据类型与数据对象,算术运算符:,+,加,-,减*乘,/,除*乘方,mod,求模,rem,求余,abs,求绝对值,逻辑运算:,and,逻辑与,or,逻辑或,nand,与非,nor,或非,xor,异或,xnor,同或,not,逻辑非,关系运算符:,=,等于,/=,不等于,小于,大于,=,大于或等于,注:其中,=,操作符也用于表示信号的赋值操作。,&,连接符,,,将两个数据对象或矢量连接成维数更大的矢量,它可给代码书写带来方便。,例如:,vabc=a&b&c,;,如果
7、a=,1,,,b=,0,,,c=,1,,,则,vabc=,“,101,”,。,二、,VHDL,数据类型与数据对象,用户自定义数据类型:,(1),列举数据类型,Type,列举名称,is(,元素,1,,,元素,2,,,),例子:,Type,state,is(S0,S1,S2,S3);,Signal,A,:,state,;,二、,VHDL,数据类型与数据对象,(2),数组类型,Type,数组名称,is Array(,范围,)of,数据类型;,例子:,Type,Byte,is Array(7 downto 0)of,Bit,;,Signal,sdo,:,Byte,;,二、,VHDL,数据类型与数据对
8、象,数据类型的转换,在,VHDL,语言里,,不同类型的数据信号之间不能互相赋值,。当需要不同类型数据之间传递信息时,就需要,类型转换函数,将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。,二、,VHDL,数据类型与数据对象,例如:,Signal,Y:,Std_logic_vector,(7,downto,0);,Signal,X:,Integer range,0,to,255;,Y=,CONV_STD_LOGIC_VECTOR,(X,8);,二、,VHDL,数据类型与数据对象,CONV_INTEGER,将数据类型,UNSIGNED,SIGNED,转换为,INTEGER,类型,.,
9、CONV_UNSIGNED,将数据类型,INTEGER,SIGNED,转换为,UNSIGNED,类型,.,CONV_SIGNED,将数据类型,INTEGER,UNSIGNED,转换为,SIGNED,类型,.,CONV_STD_LOGIC_VECTOR,将数据类型,INTEGER,UNSIGNED,SIGNED,STD_LOGIC,转换为,STD_LOGIC_VECTOR,类型,.,二、,VHDL,数据类型与数据对象,数据对象,常 量,信 号,变 量,(Data Objects),二、,VHDL,数据类型与数据对象,(1),常量,定义格式,:,Constant,常量名称,:,数据类型,:=,给定
10、值,;,常量通常来来定义延迟和功耗等参数。,注意!常数定义的同时进行赋初值。,常数可以在实体说明、结构体描述中使用。,二、,VHDL,数据类型与数据对象,library,ieee;,use,ieee.std_logic_1164.,all,;,use,ieee.std_logic_unsigned.,all,;-,必需定义,+,entity,exam1,is,port,(ip:in std_logic_vector(3 downto 0);,op:out std_logic_vector(3 downto 0);,end,exam1;,architecture,m1 of exam1,is,c
11、onstant,num:integer:=6;,begin,op=ip+num;,end,m1;,二、,VHDL,数据类型与数据对象,(2),信号,定义格式,Signal,信号名称,:,数据类型,:=,初始值,;,信号相当于电路内部元件之间的物理连线,因,此信号的赋值有一定的延迟时间,.,二、,VHDL,数据类型与数据对象,“,信号,”,数据对象,代表电路内部信号或连接线路,其在元件之间起互连作用。,注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。,建议信号对象定义后再进行赋值。,信号为全局量。,在实体说明、结构体描述和程序包说明中使用。,信号赋值的语法格式为:,信号名,=,表达式;,
12、如:,Signal,S1,:Std_logic_vector(3 Downto 0);,S1,=“0000”;,二、,VHDL,数据类型与数据对象,(,3,)变量,定义格式,Variable,变量名称,:,数据类型,:=,初始值,;,变量只能用于“,进程,”,之中,变量的赋值是立即生效的,常用于高层次抽象的算法描述,当中。,二、,VHDL,数据类型与数据对象,“,变量,”,数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。,注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。,建议变量对象定义后再进行赋值。,变量为局部量。,仅限于进程,(Process),或子程序中使用。,
13、变量赋值的语法格式为:,目标变量,:=,表达式;,如:,Variable,S1,:Std_logic_vector(3 Downto 0);,S1,:=,“0000”;,二、,VHDL,数据类型与数据对象,信号和变量的比较,(,1,),信号和变量的对应关系不同,:信号代表电路内部信号或连接线路;而变量则不是。,(,2,),信号和变量声明的位置不同,:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。,(,3,),信号为全局量,而变量只在定义它的域中才可见,。因此,变量不能在两个进程之间传递信息。,(,4,)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次
14、赋值都会改变它的值。,(,5,),赋值不同。,在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“,=”,,变量赋值为“,:=”,。,数据对象属性,(,1,)数值类属性:,(数组类型的数据对象),数值类属性有,left,right,low,high,length,。,其中用符号,隔开对象名及其属性。,left,表示数组的左边界;,right,表示数组的右边界;,low,表示数组的下边界;,high,表示数组的上边界;,length,表示数组的长度。,如:,Signal,A,:std_logic_vector(7 downto 0);,Signal,B
15、std_logic_vector(0 to 3);,则这两个信号的属性值分别为:,Aleft=7;Aright=0;Alow=0;,Ahigh=7;Alength=8;,Bleft=0;Bright=3;Blow=0;,Bhigh=3;Blength=4;,数据对象属性,(,2,),event,属性:,event,属性,它的,值为布尔型,,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为,True,,否则为,False,。,利用此属性可识别时钟信号的变化情况,即时钟是否发生。,数据对象属性,例如:时钟边沿表示:,signal,clk,:in std_logic;,If(
16、clkevent and clk=1,)then,Q=Q+1,;,则,clkevent and clk=1,表示时钟的上升沿。即时钟变化了,且其值为,1,。,clkevent and clk=0,表示时钟的下降沿。即时钟变化了,且其值为,0,。,数据对象属性,例,2,:,设计组合逻辑电路,设计一个,1bit,全加器。,输入,X,Y,CI,输出,Z,CO,library ieee;,use ieee.std_logic_1164.all;,use ieee.std_logic_arith.all;,use ieee.std_logic_unsigned.all;,entity full_bit
17、adder is,port(a,b,ci:in std_logic;,y,cout:out std_logic);,end full_bit_adder;,architecture bh1 of full_bit_adder is,begin,y=(not a)and(not b)and ci)or,(not a)and(b)and(not ci)or,(a)and(not b)and(not ci)or,(a)and(b)and(ci);,cout=(b and ci)or(a and ci)or(a and b);,end bh1;,architecture bh2 of full_bi
18、t_adder is,begin,y=a xor b xor ci;,cout 1,0,0,0-1,1,1,D,触发器,LIBRARY,IEEE;,USE,IEEE.STD_LOGIC_1164.ALL;,ENTITY,dff,IS,PORT,(cp,d:IN STD_LOGIC;,q:OUT STD_LOGIC);,END,dff;,ARCHITECTURE,a,OF,dff,IS,BEGIN,process,(cp),begin,if,cpevent and cp=1,then,q=d;,end if,;,end process,;,END,a;,(3),计数器设计,计,数,器,CLK,Q
19、LIBRARY,ieee;,USE,ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL;,USE,ieee.std_logic_arith.ALL;,ENTITY,counter,IS,PORT,(clk:in STD_LOGIC;,q:,buffer,STD_LOGIC_vector,(3 downto 0,);,END,counter;,ARCHITECTURE,a,OF,counter,IS,BEGIN,process,(clk),begin,if,(clkevent and clk=1),then,q=q+1;,end if,;,end process,;,END,a;,无控制端四位加计数器,ARCHITECTURE,a,OF,counter,IS,BEGIN,process,(clk),begin,if,(clkevent and clk=1),then,if,(q9),then,q=q+1;,else,q=0000;,-q0);,end if,;,end if,;,end process,;,END,a;,无控制端,10,进制计数器,
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818