在VHDL中,信号、常数、变量通常称为数据对象,数据对象有确定的物理含义。在VHDL中,数据对象与数据类型是紧密相关的。标准的VHDL数据类型有10种,用户也可以根据需要定义自己需要的数据类型。
数据对象是VHDL中各种运算的载体,而VHDL又是强数据类型语言,不同数据类型之间的数据对象不能直接参与运算,并且VHDL中数据类型非常丰富,因此,能否掌握数据类型及其使用方法,对设计和调试程序至关重要。
1.VHDL中数据的文字规则
(1)数字型文字
●整数文字:整数文字都是十进制数,如10、32、0、34E2(3400)、234_287、(234687)。数字间的下画线仅仅是为了提高文字的可读性,不影响文字本身的数值。
●实数文字(有小数点):由于目前在CPLD/FPGA的应用中,综合器不支持实数类型,因此,这里就不做介绍了。
(2)以数制基数表示的文字
用这种方式表示的数字由以下5个部分组成:
●十进制数标明数制进位的基数。
●数制隔离符号“#”。
●表达的文字(实际要表达的具体数字)。
●指数隔离符号“#”。
●用十进制表示的指数部分,如果这一部分为0,则可以省略,如下所示。
10#170# --(170)
10#170#E2 --(17000指数形式)
16#FE# --(254)
2#1111_1110# --(254)
8#376# --(254)
16#E#E1 --(E×16)=(224)
(3)字符型文字
字符是用单引号括起来的ASCII字符,可以是数值,也可以是符号或字母,例如,'R'、'a'、'*'、'Z'、'U'、'0'、'n'、'_'、'L'等。可用字符定义一个新的数据类型:
TYPE STD_Ulogicis('U','X','0','1','w','L','H','_')
(4)字符串
字符串是用双引号括起来的一串字符,如"ENTER"、"BothSandQ"等。字符串在VHDL中主要用来做注释或信息提示。
数字字符串称为矢量,分别代表二进制、八进制、十六进制的数组。如下所示。
B"1_1101_1110" --二进制数数组,9位
O"15" --八进制数数组,6位
X"AB0" --十六进制数数组,12位
注:若以b或b_vector或std_logic_vector赋值时,则可以用二进制、八进制、十六进制,但如果std_logic_vector类型中含有“Z”、“X”、“U”、“_”等值时,只能使用二进制数组方式表示。二进制作为默认的方式一般情况下B可以省略,如B"1_1101_1110"可以直接写成"1_1101_1110"。但在赋值语句中使用十六进制和八进制时,赋值语句两边的信号“位”宽应相等,如果不等则需要用并置操作符“&”补齐。如下所示。
【例4-1】数字字符串的使用。
2.数据对象的使用(www.zuozong.com)
在VHDL中,有信号、常数、变量3种数据对象,它们在VHDL中定义的位置、使用方法和作用范围各不相同,如表4-1所示。
表4-1 VHDL数据对象定义位置和作用范围
(1)常数(constant)
常数在VHDL中是固定的值。所谓常数就是对某一标识符(常数名)赋予一个固定的值。格式如下:
例如:
常数可以在ARCHITECTURE、PACKAGE、ENTITY、PROCESS、FUNCTION、PROCEDURE等说明区域进行定义,并且在定义时就赋初值,常数赋值只能在此进行,常数一旦赋值则不能改变,且所赋的值应和常数所对应的数据类型一致。
(2)变量(variable)
变量只能在进程、函数、过程等顺序语句模块中定义和使用。变量是一个局部量,它的作用范围仅限于该模块,在模块之外该变量是不可见的,因此,不同进程定义并使用同一个变量名称不会发生冲突。变量运算和赋值没有延时效应,赋值立即生效。格式如下:
例如:
其中,Range 0 to 255为约束条件,10为变量的初值。
(3)信号(signal)
信号是电子电路内部硬件连接的抽象表述。它除了没有数据流动的方向说明以外,其他的性质和“端口”概念一致。信号通常在构造体、程序包和实体中说明。格式如下:
例如:
信号和变量的初值是可选项,初值的赋值符号为“:=”,但综合器在VHDL综合时,一般忽略初值。信号的赋值采用代入符“<=”。
(4)信号与变量的区别
1)说明的位置不同:信号可以在实体、构造体、包集合中说明,变量则在进程、子程序中说明。
2)赋值符号不同:信号为“<=”,而变量为“:=”。
3)赋值后的结果不同:变量赋值立即生效,因此,在执行下一条语句时,变量的值即为上一句所赋的值。信号的赋值则需经过∆t延时时间后才能有效,因此在顺序语句中如果对同一信号多次赋值,只有最后一次赋值有效。
4)信号在整个构造体内有效,变量只在定义的进程或子程序内有效。如果在进程或子程序之外使用变量的值,需要在退出进程或子程序之前,将变量的值赋给信号。
【例4-2】信号与变量的区别。
运行结果为:x=b+c;y=b+c;
运行结果为:x=b+a;y=b+c;
从上例的运行结果可以看出,变量的赋值立即生效;而在一个进程中如果对信号多次赋值,由于信号无法克服惯性延时,因此,只有最后一次的赋值是有效的,退出进程后,没有别的赋值情况存在,因此,可以克服惯性延时而使赋值生效。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。