VHDL是一种强类型的语言,它不允许不同数据类型之间的相互赋值。如果想在不同数据类型之间进行赋值则需要调用函数来完成。
在VHDL语言里,基本数据对象有三种:常量,变量以及信号。
常量
常量就是常数,它的数值不能更改。它必须初始化。它的一般定义格式如下:
CONSTANT 常量名:数据类型 := 表达式; --表达式是用来初始化常量的
变量
变量的格式如下:
VARIABLE 变量名:数据类型 [:= 初值]; --初值可以不赋。
变量赋值的时候使用“:=”来赋值。变量的值可以更改。对于变量的赋值是没有延迟的。
变量只能在子程序和进程中使用,主要是用来简化运算。变量的定义和信号非常相似,但是二者在程序中出现的位置是大大不同的。
ARCHITECTURE ... OF ... IS
SIGNAL 信号1:数据类型;
--信号声明在这里,在ARCHITECTURE的BEGIN之前
BEGIN
PROCESS(...)
VARIABLE 变量1:数据类型;
--变量声明在这里,在PROCESS的BEGIN之前。
BEGIN
END PROCESS;
END;
变量是一个抽象的值,它不对应任何实际的电路连线,它的赋值是立即生效的。
信号
信号的定义格式如下:
SIGNAL 信号名:数据类型 [:= 初值]; --初值可以不赋。初值仅在仿真的时候有用,在综合的时候会被忽略
对于信号而言,我们认为它对应于一个实际物理部分。它的赋值不是立即生效的,而是有延迟的。下面是定义一个信号的例子。
SIGNAL a : BIT_VECTOR(0 TO 2);
信号a是位矢量类型,它具有3个元素,而且它的最高位是0,最低位是2。如果希望2是最高位,0是最低位。那么如下。
SIGNAL a : BIT_VECTOR(2 DOWNTO 0);
关键字TO表示从左到右是升序排列,而DOWNTO是从左向右降序排列。
信号与端口的不同
信号是用来描述电路内部的节点,而端口是描述电路外部的节点;信号没有方向,可以是输入,也可以是输出,但是端口是有方向的。可也将信号看作“实体内部不限定数据流动方向的端口”。除此之外,端口和信号并无其他区别。
信号的赋值
信号<=值;
信号的赋值不是立即生效的,他有一个延时。这点和变量是不同的。变量的赋值是立即生效的。
标准数据类型
整数(INTEGER)与数学意义上的一致。它可以作为对信号总线状态的一种抽象;在使用整数类型的时候,必须给定整数范围,使用关键字RANGE...TO...限定整数的取值范围,综合器将根据所限定的范围来决定二进制的位数。例如:
SIGNAL num : INTEGER RANGE 0 TO 15; --定义整数类型的信号,并且限定范围是0——15.
位(BIT)用来表示一个信号的状态,它有两种取值‘0’和‘1’。在实际应用中,位可以用来描述总线的值。
位矢量(BIT_VECTOR),它是一组位的集合。位矢量是用双引号括起来的一组位数据。每一位都可以取‘0’和‘1’。通常用于表示总线状态。例如:“110011000”。
布尔量(BOOLEAN),它是二值枚举。包括两种状态:“TRUE”和“FALES”。
时间(TIME),完整的时间类型数据应该包含整数和单位两个部分,整数和单位之间至少应留出一个空格,例如:50 ns.时间类型经常用在仿真中以及指定延时。
IEEE库数据类型
上面这些数据类型都是定义在STD中的,这是VHDL语言的标准。一般在VHDL语言设计中,我们还经常使用IEEE标准委员会制定的IEEE库的STD_LOGIC_1164程序包中的STD_LOGIC类型和STD_LOGIC_VECTOR类型。
STD_LOGIC类型具有9种状态, 如下所示。
其中只有0,1,-,Z是可以被综合器综合的,其他的都只能仿真,不能被综合。
通常,我们在VHDL程序设计的时候,都是使用STD_LOGIC和STD_LOGIC_VECTOR类型。而不经常使用BIT和BIT_VECTOR类型。
用户自定义数据类型
用户自定义数据类型的格式如下:
TYPE 数据类型名 IS 数据类型;
常用的有数组类型,整数类型,枚举类型,时间类型。
定义一个数组名为num的STD_LOGIC类型的数组,定义如下:
TYPE num IS ARRAY(0 TO 3) OF STD_LOGIC;
数据类型之间的转换
VHDL是一门强数据类型语言。它的数据类型之间的转换有两种方式。
强制类型转换
这种方式和C语言的非常类似,例如可以如下:
VARIABLE a:INTEGER;
VARIABLE b:REAL;
a:=INTEGER(y);