VHDL硬件描述语言(三)——基本数据对象和数据类型

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88367468

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);

函数转换法

猜你喜欢

转载自blog.csdn.net/zy010101/article/details/88367468
今日推荐