资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,讲,VHDL,语言要素(,1,),本讲知识点:,VHDL,文字规则,VHDL,的对象,VHDL,标准数据类型,1,VHDL,语言要素,VHDL,的文字规则,与其他计算机高级语言一样,,VHDL,也有自己的文字规则,1.,基本标识符,标识符主要用来为端口、信号、变量、子程序、常数和参数等命名。,2,有效的字符:包括,26,个大小写英文字母,数字包括,0,9,以及下划线“,_”,任何标识符必须以英文字母开头,下划线“,_”,的前后必须有英文字母或数字,标识符中的英语字母不分大小写,标识符的命名不能与保留字(关键字)相同,其规则如下:,例:,_Decoder_1,2FFT,sig_#n,,,return,Decoder_1,FFT,sig_n,Not_ACK,3,2.,扩展标识符(,93,标准):,以反斜杠来界定,免去了,87,标准中基本标识符的一些限制。,可以以数字打头,允许包含图形符号,允许使用,VHDL,保留字,区分字母大小写等。,如:,74LS163,、,Sig_#N,、,entity,、,ENTITY,4,注意:,写程序时,应用关键字时用大写,定义的标识符用小写。或者关键字用小写,定义的标识符用大写,以便于区分。,3.,结束标志与注释,每个逻辑行以一个分号作为结束标志。,注释语句用“”开始到本行结束的一段文字来进行一段的描述,可以放在源程序中的任何位置。,注释不是设计功能描述的一部分,所以不会被编译。,5,VHDL,对象,VHDL,是一种硬件描述语言,硬件电路的工作过程实际上是信号的传输和存储的过程,所以,VHDL,最基本的描述对象是,信号,。为了便于描述,还定义了另外三类数据对象:,变量、常量,和文件。,1.,常量(,CONSTANT,),定义,:常量也称常数,是指在设计实体中不会发生 变化的值。,作用,:增加了设计文件的可读性和可维护性。,6,常量定义的一般表述,:,CONSTANT,常量名:数据类型,:=,表达式;,例如:,CONSTANT,a,,,b,:,INTEGER,:=,2,;,注意:,常量可以在程序包、实体说明、结构体和进程的说明区域进行说明,。,常量定义的同时进行赋初值,一旦被赋值就不能再改变,常量所赋的值应与其所定义的数据类型一致,否则出错,7,常量的使用范围取决于它被定义的位置:,(1)程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;,(2)设计实体中定义的常量,其有效范围为这个实体定义的所有的结构体;,(3)设计实体中某一结构体中定义的常量只能用于此结构体;,(4)结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。,8,2.,变量(,VARIABLE,),变量主要用于对暂时数据进行存储,它不能将信息带出对它作出定义的当前单元。,定义变量的一般表述:,VARIABLE,变量名:数据类型,:=,初始值,;,例:,VARIABLE a:STD_LOGIC;,VARIABLE b,c:INTEGER:=2;,VARIABLE count1,count2,count3:INTEGER range 0 to 255:=0;,9,变量赋值格式:,变量名,:=,表达式;,例:,a:=“1010101”;-,位矢量赋值,b:=0;-,位赋值,x:=100.0;-,实数赋值,注意:,(,1,)赋值语句右边的表达式必须是一个与目标变量具有,相同数据类型,的数值。,(,2,)变量是一个,局部量,,只能在进程和子程序中使用。,10,(3),变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。,(,4,)变量的赋值是一种理想化的数据传输,是,立即发生,的,不存在任何延时的行为。,11,例,VARIABLE,x,y:,REAL;,VARIABLE,a,b:,BIT_VECTOR,(0,TO,7);,x:=100.0;,-实数赋值,,x,是实数变量,y:=1.5+x;,-运算表达式赋值,,y,也是实数变量,a:=b;,a:=”1010101”;,-位矢量赋值,,a,的数据类型是位矢量,a(3,TO,6):=(1,1,0,1);,-段赋值,a(0,TO,5):=b(2,TO,7);,a(7):=0;-,位赋值,12,3.,信号(,SIGNAL,),信号是描述硬件系统的基本数据对象,它是设计实体中并行语句模块间动态交换数据的手段。在物理上信号对应着硬件设计中的一条连接线。它除了没有数据流动方向说明以外,其他性质与实体的端口(,Port),概念一致。,信号定义语句格式:,SIGNAL,信号名:数据类型,:=,初始值,;,13,例:,SIGNAL,clk,:,std_logic,:=0;,SIGNAL a:integer range 0 to 15;,SIGNAL data:std_logic_vector(15,downto,0);,信号的使用和定义范围是实体、结构体和程序包。,注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。,14,在程序中:,(1)信号值的代入采用“=”代入符,而且信号代入时可以附加延时。,(2)变量赋值时用“:=”,不可附加延时。,(3)信号的初始赋值符号仍是“:=”。,例:,X=Y,AFTER,10 ns;,-X,Y,都是信号,且,Y,的值经过10,ns,延时以后才被代入,X。,信号是一个全局量,它可以用来进行进程之间的通信。,15,说明:,同一信号不能在两个进程中赋值。,在同一进程中,可以允许多次对同一信号赋值。即在同一进程中存在多个同名的信号被赋值。但是因为信号的赋值是有延时的,其结果只是最后的赋值语句被启动。,16,SIGNAL,a,b,c,y,z,:integer;,PROCESS,(a,b,c,),BEGIN,y=a*b;-,不对,y,进行赋值,z=,c-y,;,y=b;-y,的最后赋值,END PROCESS,;,17,信号与变量的区别,(2)赋值符不同,信号,signal count:std_logic_vector(7,downto,0);,变量,variable tema:std_logic_vector(3,downto,0);,信号在结构体中声明;变量在进程中声明,(1)声明的形式与位置不同,count=“00000000”,count=“ZZZZZZZZ”,count=,tema,;,tema,:=0000;,18,(3),赋值生效的时间不同,信号:进程结束时,变量:立即生效,(4)进程对信号敏感,对变量不敏感,(5)作用域不同,信号可以是多个进程的全局信号,变量只在定义后的顺序域可见,19,label1:,process,variable,a,b:integer,;,begin,wait until,clk,=,1,;,a:=10;,b:=20;,a:=b;,b:=a;,end process,;,signal,a,b:integer,;,label2:,process,(a,b),begin,a=10;,b=20;,wait for,10ns,a=b;,b=a;,wait for,10ns,end process,;,分析下面两个程序中,a,b,的结果,结果,:a=b=20,结果,:a=20,b=10,20,library,ieee,;,use ieee.std_logic_1164.all;,entity,bcv,is,port(a,b,c:in std_logic;,x,y:out std_logic);,end,bcv,;,architecture m2 of,bcv,is,begin,process(a,b,c),variable d:std_logic;,begin,d:=a;,x=c,xor,d;,d:=b;,y=c,xor,d;,end process;,end m2;,A,B,C,X,Y,练习,结果:,x=c,xor,b,y=c,xor,b,x=c,xor,a,y=c,xor,b,architecture m1 of,bcv,is,signal,d:std_logic,;,begin,process(a,b,c,),begin,d=a;,x=c,xor,d;,d=b;,y=c,xor,d;,end process;,end m1;,21,2.6 VHDL,数据类型和子类型,前面介绍了,VHDL,的数据对象,对于每一个对象来说,都要指定其数据类型,因此,,VHDL,需要提供用来指定对象的数据类型。,VHDL,的强类型特性,使得,VHDL,在进行硬件描述时具有很高的灵活性。,VHDL,的强类型特性主要体现在以下几个方面:,22,每一对象只能具有一个数据类型且只能具有那个数据类型的值。,对某对象进行操作的类型必须与该对象的类型相匹配。,不同类型之间的数据不能直接代入,即使数据类型相同,而位长不同也不能进行代入。,23,标量类型:,是最基本的数据类型,通常用于描述一个单值数据对象。标量类型包括:实数类型、整数类型、枚举类型和时间类型。,复合类型:,由细小的数据类型复合而成,如可由标量类型复合而成。复合类型主要有数组型和记录型。,子类型:,是上述基本类型的子集,是对已有的数据类型加以限制。,VHDL,中的数据类型可分为五大类:,24,上述五大类数据类型又可分成在现成程序包中可以随时获得的,预定义数据类型,和,用户自定义数据类型,两类。预定义数据类型是,VHDL,中最常用、最基本的数据类型,这些数据类型都已在,VHDL,的标准程序包,Standard,和,std_logic_1164,及其它的标准程序包中作了定义,可在设计中随时调用。,文件类型:,不同类型的数据和数据名组织在一起形成新的数据对象。,存取类型:,为数据对象提供存取方式。,25,2.6.1,文字,(,1,)整数,:整数都是十进制的数,如:,5,,,156E2(=15600),,,45_234_287(=45234287),(,2,)实数,:实数也都是十进制的数,但必须带有小数点,如:,88_670_551.453_909(=88670551.453909),,,1.0,,,44.99E-2(=0.4499),26,(,3,)以数值基数表示的数:,用这种方式表示的数由五部分组成:,基,#,整数,#,指数,第一部分:用十进制数标明数值进位的基数;,第二部分:数值隔离符“,#”,;,第三部分:表达的数值;,第四部分:指数隔离符“,#”,;,第五部分:用十进制数表示的指数部分,若为,0,可省略不写。,27,例如:,10#17#;,-(,表示第三部分为十进制数,等于,17),16#FE#;,-(,表示第三部分十六进制数,等于,254),2#1111_1110#;,-(,表示第三部分为二进制数,等于,254),8#376#;,-(,表示第三部分为八进制数,等于,254),16#E#1;,-,(,表示十六进制数,等于,1416,1,,等于,224),28,(,4,)字符,是用单引号括起来的,ASC,码,一般情况下,VHDL,对字母的大小写不敏感,但对字符的大小写是敏感的,,例:,A,和,a,是不同的。,(,5,)字符串,是用双引号括起来的字符序列,在,VHDL,中字符串常用来作为说明文字出现。,例:“,it is time out”,“ERROR”,,“,Both S and Q equal to 1”,注意:“,a”,和,a,是不同的,29,B,:二进制基数符号,可以省略,O,:八进制基数符号,X,:十六进制基数符号,(0,F),采用位串的优点是为了增加源代码的可读性。,例:,B1_1101_1110-,二进制数数组,位矢数组长度是,9,O,15 -,八进制数数组,位矢数组长度是,6,(,6,)位串,位串是用双引号括起来的数字序列,数字序列前面加上一个基数说明符:,30,XAD0-,十六进制数数组,位矢数
展开阅读全文