VHDL语言介绍
VHDL(VHSIC Hardware Description Language)是美国国防部在80年代后期推出的面向多层次的硬件描述语言,它是70年代末、80年代初VHSIC(Very High Speed Integrated Circuit)计划的产物。VHDL支持硬件的设计、综合、验证和测试,言于1987年被定为IEEE1076标准,1993年升级为IEEE1164标准。目前几乎所有的EDA工具都不同程度上支持VHDL语言。
1 VHDL语言的语法
1.1基本文法
(1)源文件由各种语句组成;
(2)关键词、标识符和常量之间至少要有一个空格。
(3)字符常数或字符串常数对大小写敏感。
(4)每行以换行符、垂直进格符或换页符结束,逻辑行以“;”作结束标记。
(5)注释以双划线“--”开始,到行结束符为止。
1.2标识符、数据对象和数据类型
一标识符
标识符用来标识信号、变量、实体、结构体、元件等。标识符可由字母、数字和下划线构成,且首写字符必须为字母,下划线不能出现在标识符最后,不能连续出现2个下划线。标识符对字母的大小写不敏感。另外,VHDL语言中的关键字不能作为标识符用。
VHDL语言中定义的保留字如下所示:
例,不合法的标识符有:
2COUNT ——以数字开头;
_count ——以下划线开头;
m&m ——采用了&字符;
my__count ——连用2个下划线;
count_ ——以下划线结尾;
when ——采用了保留字。
二数据对象(Data Object)
数据对象主要有常数(CONSTANT)、信号(SIGNAL)、变量(V ARIABLE)和文件(FILE)四种。
■常数:常数说明格式为:
CONSTANT 常数名:数据类型:=表达式;
常数赋值一般放在程序的开头部分,常数引入的目的是为了增加程序的可读性。例,
CONSTANT Vcc:Real :=5。0;
其含义为定义标识符VCC为常数,数据类型为实数,大小为5.0。
■变量:变量说明的格式为:
V ARIABLE 变量名:数据类型[约束条件:=表达式];(注:方括号内的部分可省略,下同)
变量不与硬件电路中的某个节点相对应,它主要用于电路逻辑功能的行为描述,赋给它的值立即生效,
没有时间延迟。变量只能用在进程(PROCESS)、过程(PROCEDURE)和函数(FUNCTION)之中,它是一个局部量。例,
V ARIABLE X:INTEGER RANGE 0 TO 255 :=10;
其含义为定义标识符X为变量,数据类型为整数,范围为0至255,大小为10。■信号:信号说明格式为:
SIGNAL 信号名:数据类型[约束条件:=表达式];
每个信号都与硬件电路中的某个节点相对应,因此其赋值过程一定会有延迟,不会立即生效。例,
SIGNAL SYS_CLK:BIT :=‘0’;
其含义为定义标识符SYS_CLK为信号,数据类型为位(可取逻辑值‘0’或‘1’),当前值为‘0’。
注:(1)在程序中信号的赋值符为“<=”;
(2)一般变量值可传递给信号,而信号值不能传递给变量。
■文件
三数据类型
1.基本数据类型
基本数据类型如表1.1所示
表1.1基本数据类型
数据类型含义
整数(Integer) 32位整数,-2 147 483 647~2 147 483 647
实数(Real)浮点数,-1.0E+38~+1.0E+38
位(Bit)逻辑‘0’或‘1’
位矢量(BIT_vector)位矢量,例“0110”
布尔量(Boolean)逻辑“真”或“假”
字符(Charater) ASCII字符,例‘A’用于存放创建后则不变的字符串常量
字符串(String)字符矢量,例“ABC”
时间(Time)时间值+时间单位,例10NS,3S
错误等级(Severity level) Note,waring,error或failure
自然数(Natural)大于等于0的整数
正整数(Positive)大于0的整数
注:字符常量用单引号括起来,如‘A’;字符串常量则要用双引号括起来,例“STOP HERE”。
2.用户定义的数据类型
用户定义数据类型有以下几种:
■枚举类型定义格式为:
TYPE 数据类型名 IS (元素1,元素2,……);
例,TYPE week IS(SUN,MON,TUE,WED,THU,FRI,SAT);
■整数/实数类型定义格式为:
TYPE 数据类型名 IS INTEGER(或REAL)RANGE … TO …;
例,TYPE DIGIT IS INTEGER RANGE 0 TO 9;
■数组(ARRAY)定义格式为:
TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型;
例,TYPE word IS ARRAY (1 TO 8 )OF STD_LOGIC;
数组类型还可以定义多维数组,例,
ARRAY(0 TO 5,7 DOWN TO 0) OF BIT;定义一个6行7
IS
toarray
TYPE
列的二维数组,数组中每个元素的数据类型为BIT。
■物理类型例,
TYPE current IS RANGE 0 TO 1000000
UNITS
uA;
mA=1000uA;
A=1000mA
UNITS
END
■记录(RECORD)定义格式为:
TYPE 数据类型名 IS RECORD (元素1:数据类型,元素2:数据类型,……)
END
RECORD;
当要提取记录中的元素时必须用“.”约束符。
■用户定义的子类型(SUBTYPE)
用户定义的子类型是用户对已定义的数据类型作一范围定义而产生的一种新的数据类型,目的为便于程序的书写、增加可读性。其定义格式为:
SUBTYPE 子类型名 IS 数据类型名<;范围>;
例,SUBTYPE my_word IS STD_LOGIC_VECTOR(7 DOWNTO 0);
3.“STD_LOGIC”和“STD_LOGIC_VECTOR”数据类型
标准数据类型中的BIT 和BIT_VECTOR是一个逻辑数据,只能取“1”或“0”,不能仿真任意态“X”,及高阻“Z”等。IEEE1164标准定义了STD_LOGIC类数据,它是在基本类型数据基础上定义的一个枚举类数据类型,其定义为:
TYPE STD_LOGIC IS (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);
其含义分别为初始值、不定态、逻辑0、逻辑1、高阻、弱信号不定、弱信号0,弱信号1和不可能状态。
四属性
数值、信号、数据类型、数据范围及函数等都有其属性。详细的属性描述可参见[1]。属性的描述格式为:
客体名‘属性名;
常用的属性有‘LEFT,‘RIGHT,’LOW,‘HIGH,’LENGTH,‘EVENT等。例,若
TYPE COUNT IS INTEGER 0 TO 127;
TYPE WORD IS ARRAY (15 DOWNTO 0) OF STD_LOGIC;
则,COUNT‘LEFT=0,COUNT‘RIGHT=127,WORD’LEFT=15,WORD’LENGTH=16。
‘EVENT属性表示在当前一个相当小的时间间隔内若事件发生,则为真,反之为假。它常用来来检测时钟信号的边沿,例:
IF(CLK‘EVENT)AND(CLK=‘1’)THEN ……,即当检测到时钟上升沿,则……。
1.3运算符
VHDL语言包含算术、逻辑、关系、赋值和并置运算等操作,各种运算的表达方式如表1.2所示。
表1.2各种运算关系
运算符 功能 运算符
功能 + 加
> 大于 - 减
<= 小于等于 * 乘
关系运算符>= 大于等于 /
除 AND
与 MOD 取模
OR 或 REM 取余
NAND 与非 SLL 逻辑右移
NOR 或非 SRL 逻辑左移
NXOR 同或 SLA 算术左移
NOT 非 SRA 算术右移
逻辑运算符XOR 异或
ROL 逻辑循环左移 <= 信号代入(赋值) ROR 逻辑循环右移 赋值运算符:= 变量赋值 ** 乘方 关联运算符=> 实参替形参
算术运算
ABS 取绝对值 + 正 = 等于 - 负 /= 不等于 & 连接 关系运算符 <
小于
其它运算符
注:并置运算用于位的连接。若对4个位作并置运算即可构成1个4位矢量。例,
SIGNAL en BIT ;
SIGNAL q BIT ——VECTOR (3 DOWNTO 0);
V ARIABLE temp BIT_VECTOR (3 DOWNTO 0) :=“1101”; BEGIN
q<=temp AND (en&en&en&en); ……
2 VHDL 语言的基本结构
VHDL 语言程序具有模块化结构,其基本结构如下所示:
库说明;
包集合的引用;
[用户包集合说明及包集合体]; 实体说明部分; 构造体部分;
[配置部分];
除库说明之外,其它各部分都可以单独编译,然后被其它部分引用。(用方括号括
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论