用来保持数据的信号,变量和常量,在VHDL语言中称为目标。
在VHDL中有三类目标:信号、变量和常量。
目标的一般形式如下:
< 目标种类> < 目标< , 目标...>> : < 目标类型> :=< 表达式> ;
目标种类:信号、变量和常量
目标类型:规定目标的特征。
信号、变量和常量的区别:
信号和变量可以赋予一系列的值,而常量一次仅被分配一个值。
变量和信号又有不同,赋予信号的数值要到未来的某个时刻,才接受当前的数值,而赋予变量的数值,它立即接受当前的数值。
定义 分类 全局化和局部化
学习指导:
本知识点的学习时,对于与其它编程语言相同的类型不在强调,主要学习与其它编程语言不同的数据类型,如物理类型和枚举类型。
VHDL是一种非常严格的数据类型化语言,规定每个信号、常量、变量或每个表达式有确定的数据类型,一般说,在表达式中分配数值给目标时的数据类型不可以被混用。每个目标和表达式的类型可在仿真之前静态地确定。
类型说明部分规定类型名和类型范围,它的一般形式是:
TYPE < 类型名> IS < 类型范围> ;
TYPE和IS是关键字,用大写字母表示。
类型范围包容了整数类型、实数类型、物理类型、枚举类型到文件类型的任何值。
一、标量类型
标量数据类型是基本的数据类型,它包括整数、实数、物理和枚举类型。一个目标的数值有可能经常更换或者说是包含多个值,但一个信号一次只能被一种类型说明。
1.整数类型与算术类型相似,它可以定义一个连续性的整数范围用来预定算术函数等,还可用来作次序上升和下降的循环迭代。如:VARIABLE b:INTEGER;——变量b是整形变量。
2.实数类型可以代替或模仿数学上实数的目标,它可用来表示带小数点的数或带小数点的浮点数,它的最大范围是从-1.0E+38到+1.0E+38。如: SIGNAL a1:REAL;——信号a是实型。
3.物理类型可用来表示距离、电流和时间等物理量,物理类型要提供一个基本单位,然后在这个基本单位上定义多个或零个次级单位,每个次级单位都是基本单位的整数倍。如
PACKAGE scale IS |
——PACKAGE... IS 是自定义封装库,库名 scale;
——定义电流的基本单位是na,定义三个次级单位ua、ma、a。 |
4.枚举类型在形式上是定义括弧内的字符串文字表,一个字符串文字在枚举类型定义中只能出现一次,但允许同样一个字符串文字出现在不同的枚举类型的字符串文字表中,枚举类型的字符串文字表中的文字是由设计者定义的,这些值可以是单个字母,也可以是一个字符串,例如:BREAKFAST, Lunch, a等。
下面我们看一个枚举类型数据类型的例子
例5:
PACKAGE meals_pkg IS
TYPE meal IS(breakfast,lunch,dinner);
END meals_pkg;
USE work . meals_pkg . all;
ENTITY meals IS
PORT(previous_meal:IN meal;
next_meal:OUT meal);
END meals;
ARCHITECTURE meals_arc OF meals IS
BEGIN
WITH previous_meal SELECT
next_meal <= breakfast; WHEN dinner,
lunch WHEN breakfast,
dinner WHEN lunch;
END meals_arc;
自定义程序包中,定义了枚举类型数据为meal,枚举类型表中有三个符号,代表着枚举信号breakfast(早饭)、lunch(午饭)和dinner(晚饭)。
在实体中定义的端口信号是两个,一个是输入枚举信号previous_meal,另一个是输出枚举信号next_meal。在结构体中,判断输入是枚举数据的哪一个(刚餐过哪一顿饭),然后将另一个枚举型数据送到输出(准备再餐哪一顿饭)。
二、复合数据类型
复合类型是由数组类型和记录类型组成,它们的元素是标量类型的元素。数组类型是由相同的标量元素组成,即同构复合类型,数组可以是一维二维或多维。例如
TYPE word IS ARRAY(15 DOWNTO 0) OF BIT;
TYPE column IS RANGE 1 TO 40;
TYPE row IS RANGE 1 TO 10;
CONSTANT; ROM : BIT_VECTOR(0 ; TO; 15);
TYPE matrix; ARRAY(row,column) OF std_logIC;
TYPE r_ma IS ARRAY( 1 TO 10, 1 TO 40) OF std_logic;
第一行到第四行举了三个一维数组类型的说明,第五和第六行是两维限定性数组的定义,表示行的范围1到10,列的范围是1到40。下面举一个VHDL程序说明一维数组实现16×4的ROM。
例7:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY rom IS
PORT(cs,x1,x2,x3,x4:IN std_logic;
d0,d1,d2,d3:OUT std_logic);
END rom;
ARCHITECTURE rom_arc OF rom IS
BEGIN
PROCESS(cs,x1,x2,x3,x4)
VARIABLE n:NATURAL RANGE 0 TO 15;
CONSTANT rom0:std_logic_vector(0 TO 15):="0101010101010101";
CONSTANT rom1:std_logic_vector(0 TO 15):= 0011001100110011;
CONSTANT rom2:std_logic_vector(0 TO 15):= 0000111100001111;
CONSTANT rom3:std_logic_vector(0 TO 15):= 0000000011111111;
BEGIN
IF cs= '1' THEN n:=0;
IF x1 = '1' THEN n:= n+1; END IF;
IF x2 = '1' THEN n:= n+2; END IF;
IF x3 = '1' THEN n: = n+4; END IF;
IF x4 = '1' THEN n:= n+8; END IF;
d0 <= rom0(n) AFTER 10 ns;
d1 <= rom1(n) AFTER 10 ns;
d2 <= rom2(n) AFTER 10 ns;
d3 <= rom3(n) AFTER 10 ns;
ELSE
d0 <= 'Z' AFTER 10 ns;
d1 <= 'Z' AFTER 10 ns;
d2 <= 'Z' AFTER 10 ns;
d3 <= 'Z' AFTER 10 ns;
END IF;
END PROCESS;
END rom_arc;
在实体中定义了四位输入地址x1、x2、x3、x4和四位数据输出d0、d1、d2、d3。在进程说明区中说明了四个一维数组rom0、rom1、rom2、rom3,每个存放16×1规模的数据。程序的行为描述分析如下:当cs= '1'时,将地址指向的一行数组数据送到输出端口d0~d3;当cs= '0'时,将三态'Z'送到输出端口d0~d3。如果新规定rom尺寸的大小,就要改变设置的地址位数、数据位数,和重新输入rom的数据,并且要重新编辑ROM的模块。
数据类型的全局化和局部化
VHDL描述语言的组成是由程序包、实体、结构体(结构体中有进程)、以及子程序等组成,不同的目标可以在不同的组成部分内加以说明。如果一个目标在实体说明区被说明,那么在本实体和本实体内部的任何结构体和任何进程中都可以引用,称此目标为全局信号;在结构体说明区(ARCHITECTURE和BEGIN之间)被说明的目标,仅可以在此结构体中引用或在结构体中的任何进程语句中被引用,称此目标为局部信号。
VHDL中不同的目标和类型规定在不同的构造中可以被说明:
信号:实体、结构体说明区、程序包和子程序。
变量:进程语句说明区和子程序。
常量:实体、结构体、进程语句说明区和程序包和子程序。
标量类型:实体、结构体、进程语句说明区和程序包和子程序。
复合类型:实体、结构体、进程语句说明区和程序包和子程序。
文件类型:子程序和进程语句说明区。
寻址类型:进程语句说明区。
VHDL的属性
学习指导:
本知识点的学习时,注意函数类属性的正确描述和应用。
值类属性 函数类属性
VHDL的属性可归纳为:信号类属性、函数类属性、值类属性、类型类属性和范围类属性。这里主要介绍值类属性及函数信号类属性。
值类属性
值类属性用于返回数组的边界或长度,首先举一例数组边界的例子说明类型属性。
<目标类型> ' <值类型属性>
值类属性的关键字是LEFT RIGHT HIGH LOW
例11:
TYPE bit IS ARRAY(63 DOWNTO 32) OF BIT; ┇ 如程序中的第一到第四行。数组bit范围是整数63到32,63位于数组的左面,而32位于数组的右面,所以当第一行要求将目标类型bit的左边界送到left_range时,即63送到left_range。同时右边界32送入right_range,上边界和下边界与左边界和右边界相对应,得到相同的值。目标类型和值类属性之间有一“′”号,这个符号是属性的特定符号。 |
例12:一个值类数组属性的例子,得到返回数组范围的总长度。
┇ TYPE bit IS ARRAY(0 TO 7) OF BIT; ┇ 此程序是将数组bit中元素的总数量赋值于len1,另外数组bit1中的元素总数量赋值给len2。 |
函数信号属性
函数信号属性用来返回有关信号行为功能的信息,它反映一个信号是否正好有值的变化或事件的发生,如clk′EVENT,这个属性为“EVENT”,对检查时钟边沿触发是很有效的。它可用来检查一个刚刚发生变化的信号,即推断出在信号上发生了一个跳变。下面举一个例子,说明函数信号属性的用法。
例13:
上述语句中用到了函数信号属性clk’EVENT,说明如果时钟信号clk为高电平且事件刚刚发生,即时钟上升沿,此时q得到d的信号。 |