一、文字规则
1.1 标识符
标识符主要用来为端口、信号、变量、子程序、常数和参数等命名。
其规则如下:
- 有效的字符:包括26个大小写英文字母,数字包括0~9 以及下划线“_”
- 任何标识符必须以英文字母开头
- 下划线“_”的前后必须有英文字母或数字
- 标识符中的英语字母不分大小写
- 标识符的命名不能与保留字相同
1.2 数字
(1)整数:整数都是十进制的数
5
678
0
156E2(=15600)
45_234_287 (=45234287)
(2)实数:实数也都是十进制的数,但必须带有小数点
1.335
88_670_551.453_909(=88670551.453909)
1.0
44.99E-2(=0.4499)
(3)以数值基数表示的数
用这种方式表示的数由五部分组成:基 # 整数 # [指数]
- 第一部分:用十进制数标明数值进位的基数;
- 第二部分:数值隔离符“#”;
- 第三部分:表达的数值;
- 第四部分:指数隔离符“#” ;
- 第五部分:用十进制数表示的指数部分,若为0可省略不写。
10#170# (170)
16#FE# (254)
2#1111_1110# (254)
8#376# (254)
16#E#1 (224)
1.3 字符和字符串
(1) 字符是用单引号括起来的ASCⅡ码
一般情况下VHDL对字母的大小写不敏感,但对字符的大小写是敏感的,
例:‘A’ 和 ‘a’ 是不同的。
(2) 字符串是用双引号括起来的字符序列
在VHDL中字符串常用来作为说明文字出现。
例:“it is time out”, “ ERROR ”,“Both S and Q equal to 1”
注意:“a” 和 ‘a’是不同的
1.4 位串
位串是用双引号括起来的数字序列,数字序列前面加上一个基数说明符:
B | 二进制基数符号,可以省略 |
---|---|
0 | 八进制基数符号 |
X | 十六进制基数符号(0~F) |
采用位串的优点是为了增加源代码的可读性
B"1_1101_1110" -- 二进制数数组,位矢数组长度是9
O"15" -- 八进制数数组,位矢数组长度是6
X"AD0" -- 十六进制数数组,位矢数组长度是12
"101_010_101_010" -- 二进制数数组,位矢数组长度是12
"0AD0" -- 表达错误,缺X
1.5 结束标志与注释
- 每个逻辑行以一个分号作为结束标志。
- 注释语句用 "–"开始到本行结束的一段文字来进行一段的描述
- 注释不是设计功能描述的一部分,所以不会被编译。
二、数据对象
VHDL是一种硬件描述语言,硬件电路的工作过程实际上是信号的传输和存储的过程,所以VHDL最基本的描述对象是信号。为了便于描述,还定义了另外三类数据对象:变量、常量和文件。
2.1 常量(CONSTANT)
常量是指在设计实体中不会发生变化的值
常量定义的一般表述
constant 常量名:数据类型 := 表达式 ;
注:
- 常量可以在程序包、实体说明、结构体和进程的说明区域进行说明
- 常量一旦被赋值就不能再改变
- 常量所赋的值应与其所定义的数据类型一致,否则出错
2.2 变量(VARIABLE)
变量主要用于对暂时数据进行存储,它不能将信息带出对它作出定义的当前单元。
定义变量的一般表述:
VARIABLE 变量名:数据类型 [:= 初始值];
变量赋值格式:变量名 := 表达式;
例如:
a := “1010101” ; ------位矢量赋值
b := ‘0’ ; ------------位赋值
x := 100.0 ; ----------实数赋值
注:
- 赋值语句右边的表达式必须是一个与目标变量具有相同数据类型的数值。
- 变量是一个局部量,只能在进程和子程序中使用。
- 变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时的行为。
2.3 信号(SIGNAL)
信号是描述硬件系统的基本数据对象,它是设计实体中并行语句模块间动态交换数据的段。在物理上信号对应着硬件设计中的一条连接线。
信号与端口都描述了电路中实际存在的节点(Node),只是信号描述的是实体内部的节点,而端口则描述实体与外界的接口。在语法上,信号的声明与端口的声明很相似。
信号定义语句格式:
SIGNAL 信号名: 数据类型 [:= 初始值] ;
信号赋值采用如下格式: 信号名 <= 表达式;
例如:
x <= 9;
y <= x;`
注:
- 同一信号不能在两个进程中赋值。
- 在同一进程中,可以允许多次对同一信号赋值。即在同一进程中存在多个同名的信号被赋值。但是因为信号的赋值是有延时的,其结果只是最后的赋值语句被启动
2.4 信号与变量赋值语句功能的比较
变量VARIABLE
- 基本用法:在进程中作为局部数据存储单元使用
- 适用范围:只能在所定义的进程中使用
- 行为特性:
- 赋值是没有延迟的
- 在进程中是立即赋值
信号SIGNAL
- 基本用法:在电路中作为信号连线使用
- 适用范围:在整个结构体内的任何地方都能适用
- 行为特性:
- 赋值具有一定的延迟
- 在进程中,只在进程的的最后才对信号赋值
三、数据类型
对于VHDL的每一个数据对象来说,都要指定其数据类型,因此,VHDL需要提供用来指定对象的数据类型。
VHDL的强类型特性,使得VHDL在进行硬件描述时具有很高的灵活性。
VHDL的强类型特性主要体现在以下几个方面:
- 每一对象只能具有一个数据类型且只能具有那个数据类型的值。
- 对某对象进行操作的类型必须与该对象的类型相匹配。
- 不同类型之间的数据不能直接带入,即使数据类型相同,而位长不同也不能进行带入。
VHDL中的数据类型可分为五大类:
- 标量类型:是最基本的数据类型,通常用于描述一个单值数据对象。标量类型包括:实数类型、整数类型、枚举类型和时间类型。
- 复合类型:由细小的数据类型复合而成,如可由标量类型复合而成。复合类型主要有数组型和记录型。
- 子类型:是上述基本类型的子集,是对已有的数据类型加以限制。
- 文件类型:不同类型的数据和数据名组织在一起形成新的数据对象。
- 存取类型:为数据对象提供存取方式。
上述五大类数据类型又可分成在现成程序包中可以随时获得的预定义数据类型和用户自定义数据类型两类。
3.1 预定义数据类型
预定义数据类型是VHDL中最常用、最基本的数据类型,这些数据类型都已在VHDL的标准程序包Standard和std_logic_1164及其它的标准程序包中作了定义,可在设计中随时调用。
3.1.1VHDL的预定义数据类型
- 整数(INTEGER)数据类型:正整数、负整数和零。可以使用预定义的运算操作符,但不能按位访问,也不能进行逻辑操作。
- 实数(REAL)数据类型:类似于数学中的实数,或称为浮点数,通常情况下实数类型仅能用于VHDL的仿真,综合器一般不支持实数。
- 位(BIT)数据类型:属于枚举型,取值只能是‘1’和‘0’。
- 位矢量(BIT_VECTOR)数据类型:是BIT的数组,使用位矢量必须注明位宽。
- 布尔(BOOLEAN)数据类型:属于枚举型,取值为false和true。
- 字符(CHARACTER)数据类型:字符类型通常用单引号引起来。
- 字符串(STRING)数据类型:字符串必须用双引号标明。
- 时间(TIME)数据类型VHDL中唯一的预定义物理类型是时间。完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格
- 错误等级(severity level)错误等级类型数据用来表征系统的状态共有4种:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)。
- 自然数(natural),正整数(positive)
3.1.2 IEEE预定义标准逻辑位与矢量
- 标准逻辑位STD_LOGIC数据类型
- 标准逻辑矢量(STD_LOGIC_VECTOR)数据类型。std_logic_vector是std_logic的数组形式。
注:std_logic和std_logic_vector是ieee的预定义数据类型,使用时必须先打开ieee库。即:library ieee; use ieee.std_logic_1164.all;
std_logic是一个9值的逻辑:
U | 未初始化状态 |
---|---|
X | 不定态 |
0 | 逻辑0 |
1 | 逻辑1 |
Z | 高阻态 |
W | 弱不定态 |
L | 弱0 |
H | 弱1 |
- | 无关态 |
3.2用户自定义数据类型
除标准的预定义数据类型外,VHDL还允许用户自行定义新的数据类型,由用户定义的数据类型可以有多种,如枚举类型、整数类型、实数类型、数组类型、记录类型和时间类型等
- TYPE语句用法:
TYPE 数据类型名 IS 数据类型定义 [OF 基本数据类型] ;
注:
- 数据类型名由设计者自定;
- 数据类型定义部分用来描述所定义元素的表达方式和表达内容;基本数据类型是指数据类型定义中所定义的基本数据类型,一般都是取已有的预定义数据类型。
数组类型:TYPE 数组名 IS ARRAY (数组范围) OF 数据类型 ;
type st1 is array (0 to 15) of std_logic;
枚举数据类型: TYPE 枚举名 IS (枚举内容)
如:在状态机描述中,使用枚举类型为每个状态命名,增加程序可读性。
type State_type is (Start,Step1,Step2,Final);
signal State : State_type;
- SUBTYPE语句用法:
SUBTYPE是TYPE所定义的数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型
SUBTYPE 格式如下:
SUBTYPE 子类型名 IS 基本数据类型 range 约束范围;
注:
- 子类型名由设计者自定;
- 基本数据类型必须是前面已有过type定义的类型。
例:
subtype dig is integer range 0 to 9;
四、运算符
VHDL中共有四类操作符:逻辑操作符、关系操作符、算术操作符和连接操作符
4.1 逻辑运算符:
操作符 | 功能 | 操作数类型 |
---|---|---|
AND | 与 | std_logic、 bit、 boolean |
OR | 或 | std_logic、 bit、 boolean |
NOT | 取反 | std_logic、 bit、 boolean |
NAND | 与非 | std_logic、 bit、 boolean |
NOR | 或非 | std_logic、 bit、 boolean |
XOR | 异或 | std_logic、 bit、 boolean |
XNOR | 同或 | std_logic、 bit、 boolean |
4.2 算术运算符
操作符 | 功能 | 操作数类型 |
---|---|---|
+ | 加法 | 整数 |
- | 减法 | 整数 |
* | 乘法 | 整数和实数 |
SLL等 | 移位 | bit或布尔类型的一维数组 |
4.3 关系运算符:
操作符 | 功能 | 操作数类型 |
---|---|---|
= | 等于 | 任何数据类型 |
/= | 不等于 | 任何数据类型 |
< | 小于 | integer、real、 bit、 std_logic等及其一维向量 |
<= | 小于等于 | integer、real、 bit、 std_logic等及其一维向量 |
> | 大于 | integer、real、 bit、 std_logic等及其一维向量 |
>= | 大于等于 | integer、real、 bit、 std_logic等及其一维向量 |
注:
- 关系运算符运算的最后结果总是布尔类型
- 关系运算符两边的数据类型必须相同,但是位的长度不一定相同。
- 对位矢量数据进行比较时,比较从最左边的位开始,自左至右进行比较的
4.4 并置运算符(连接运算符)
并置运算符又称连接运算符,其符号为:&
功能是进行位的连接。