第二章
VHDL
语
言元
素
2.1 VHDL
语
言的客体
2.2 VHDL
语
言的数据
类
型
2.3 VHDL
数据
类
型
转换
2.4 VHDL
词
法
规则
与
标识
符
2.1 VHDL
语
言的客
体
VHDL
语
言中,可以
赋
予一个
质
的
对
象就称
为
客体
。客体主要包括以下三
种
:
变
量(
VARIABLE
)、常量(
CONSTANT
)、信号(
SIGNAL
)。
2.1.1
常量(
CONSTANT
)
(
常数
)
定
义
一个常数主要是
为
了使
设计实
体中的某些量易于
阅读
和修改
。常数
说
明就是
对
某一常数名
赋
予一个固定的
值
。通常在程序
开
始前
进
行
赋值
,
该值
的数据
类
型在
说
明
语
句中
说
明。
常数
说
明
语
句格式
为
:
CONSTANT
常数名:数据
类
型
:=
表达式;
例如:
CONSTANT Vcc : REAL := 5.0;
CONSTANT Fbus : BIT_VECTOR := “1011”
;
CONSTANT Delay : TIME := 10ns
;
注
:
常量是一个恒定不
变
的
值
,一旦做了数据
类
型和
赋值
定
义
,它在程序中就不能再改
变
。
2.1.2
变
量(
VARIABLE
)
变
量只能在
进
程和子程序中用,是一个局部量,不能将信息
带
出
对
它做出定
义
的当前
设计单
元
。与信号不同,
变
量的
赋值
是理想化数据
传输
,其
赋值
是立即生效的,不存在任何的延
时
行
为
。
变
量定
义语
句的格式
为
:
VARIABLE
变
量名
:
数据
类
型
:
约
束条件
:=
初始
值
;
例如:
VARIABLE n: INTEGER RANGE
0 TO 15 := 2;
VARIABLE a: INTEGER;
变
量
赋值语
句的格式
为
:
目
标变
量名
:=
表达式;
赋值语
句
“:=”
右
边
的表达式必
须
与目
标变
量具有相同的数据
类
型,
这
个表达式可以是一个运算表达式也可以是一个数
值
。
变
量
赋值语
句左
边
的目
标变
量可以是
单值变
量,也可以是
变
量的集合。
例如定
义变
量:
VARIABLE a
,
b := REAL
;
VARIABLE x
,
y := BIT_VECTOR
(
0 TO 7
);
2.1.3
信号(
SIGNAL
)
信号是
电
子
电
路内部硬件
连
接的抽象。它可以作
为设计实
体中的并行
语
句模
块间
交流信息的通道。
信号及其相
关
的延
时语
句
明
显
地体
现
了硬件系
统
的特征
。
信号定
义语
句的格式
为
:
SIGNAL
信号名:数据
类
型:
约
束条件
:=
表达式;
--
定义时候使用
例如:
SIGNAL gnd
:
BIT := ‘0’
;
SIGNAL data
:
STD_LOGIC_VECTOR (7 DOWNTO 0);
信号
赋值语
句表达式
为
:
目
标
信号名
<=
表达式;
--
赋值时候使用
符号
“<=”
表示
赋值
操作,即将数据信息
传
入
。数据信息
传
入
时
可以
设
置延
时过
程
,
这
与器件的
实际传
播延
时
十分接近。因此信号
值
的代入采用
“<=”
代入符,而不是像
变
量
赋值时
那
样
用
“:
=
”
。但信号定
义时
初始
赋值
符号
“:
=
”
,即仿真的
时间
坐
标
是从
赋
初始
值开
始的
。
信号
赋值语
句
举
例:
X
<= y;
a <= ‘1’
;
s1 <= s2 AFTER 10 ns
;
--
注意
:
变
量和信号都必
须
先定
义
,
后
赋值
。注意
赋值
符
“<=”
和
“:
=
”
的差
别
。
信号与
变
量的区
别
:
信号和
变
量是
VHDL
中重要的客体,他
们
之
间
的主要区
别
有:
·
信号
赋值
至少要有δ延
时
;而
变
量
赋值
没有
。
·
信号除当前
值
外有
许
多相
关
的信息,如
历
史信息和投影波形;而
变
量只有当前
值
。
·
进
程
对
信号敏感而不
对变
量敏感
。
·
信号可以是多个
进
程的全局信号;而
变
量只在定
义
他
们
的
顺
序域可
见
(共享
变
量除外)
。
·
信号是硬件中
连线
的抽象描述,他
们
的功能是保存
变
化的数据
值
和
连
接子元件,信号在元件的端口
连
接元件。
变
量在硬件中没有
类
似的
对应关
系,他
们
用于硬件特性的高
层
次建模所需要的
计
算中
。
2.2 VHDL
语
言的数据
类
型
在
对
VHDL
的客体
进
行定
义时
,都要指定其数据
类
型。
VHDL
有多
种标
准的数据
类
型,并且允
许
用
户
自定
义
数据
类
型。在
VHDL
语
言
语义约
束中,
对类
型的要求反映在
赋值语
句的目
标
与源的一致,表达式中操作的一致,子
类
型中
约
束与
类
型的一致等
许
多方面
。
2.2.1 VHDL
中
预
定
义
的数据
类
型(
编
程者可直接使用
)
预
定
义类
型在
VHDL
标
准程序包
STANDARD
中定
义
,在
应
用中自
动
包含
进
VHDL
的源文件,不需要
USE
语
句
显
示
调
用
。数据
类
型
说
明如下
。
1.
整数(
INTEGER
)
整数与数学中整数的定
义
相似,可以使用
预
定
义
运算操作符,如加
“
+
”
、减
“
-
”
、乘
“
×
”
、除
“
÷
”
进
行算
术
运算。在
VHDL
语
言中,整数的表示范
围为
-
2147483647
~
2147483647
,即从-
(231
-
1)
到
(231
-
1)
。
2.
实
数(
REAL
)
在
进
行算法研究或
实验时
,作
为对
硬件方案的抽象手段,常常采用
实
数四
则
运算。
实
数的定
义值
范
围为
-
1.0E+38
~
+1.0E+38
。
实
数有正
负
数,
书
写
时
一定要有小数点
。例如:-
1.0
,
+2.5
,-
1.0E+38
3.
位(
BIT
)
用来表示数字系
统
中的信号
值
。位
值
用字符
‘0’
或者
‘1’
(将
值
放在引号中)表示。与整数中的
1
和
0
不同,
‘1’
和
‘0’
仅仅
表示一个位的两
种
取
值
。
位数据可以用来描述数字系
统
中
总线
的
值
。位数据不同于布
尔
数据,可以用
转换
函数
进
行
转换
。
4.
位矢量(
BIT_VECTOR
)
位矢量是用双引号括起来的一
组
数据。例如:
“001100”
,
X“00bb”
。在
这
里位矢量前面的
X
表示是十六
进
制
。用位矢量数据表示
总线
状
态
最形象也最方便,在
VHDL
程序中将会
经
常遇到。
使用位矢量
时
必
须
注明位
宽
,
即数
组
中元素个数和排列,
例如:
SIGNAL s1
:
BIT_VECTOR
(
15 DOWNTO 0
);
5.
布
尔
量
(
BOOLEAN
)
一个布
尔
量具有两
种
状
态
,
“
真
”
或者
“
假
”
。
虽
然布
尔
量也是二
值
枚
举
量,但它和位不同没有数
值
的含
义
,也不能
进
行算
术
运算。它能
进
行
关
系运算
。例如,它可以在
if
语
句中被
测试
,
测试结
果
产
生一个布
尔
量
TRUE
或者
FALSE
。
6.
字符(
CHARACTER
)
字符也是一
种
数据
类
型,所定
义
的
字符量通常用
单
引号
括起来,
如
‘a’
。一般情况下
VHDL
对
大小写不敏感,但
对
字符量中的大小写
则认为
是不一
样
的
。例如,
‘B’
不同于
‘b’
。字符量中的字符可以是从
a
到
z
中的任一个字母,从
0
到
9
中的任一个数以及空格或者特殊字符,如
$
,
@
,
%
等等。包集合
standard
中
给
出了
预
定
义
的
128
个
ASC
Ⅱ
码
字符,不能打印的用
标识
符
给
出。字符
‘1’
与整数
1
和
实
数
1.0
都是不相同的,当要明确指出
1
的字符数据
时
,
则
可写
为
:
CHARACTER
(
‘ 1’
)。
7.
字符串(
STRING
)
字符串是由双引号括起来的一个字符序列,也称字符矢量或字符串
组
。字符串常用于程序的提示和
说
明。字符串
举
例如下:
VATIABLE string_1 : STRING (0TO 3);
┇
string_1:= “a b c d”;
8.
时间
(
TIME
)
时间
是一个物理量数据。完整的
时间
量数据
应
包含整数和
单
位
两部分,而且整数和
单
位之
间
至少
应
留一个空格的位置
。例如
55 sec
,
2 min
等。在包集合
STANDARD
中
给
出了
时间
的
预
定
义
,其
单
位
为
fs
,
ps
,
ns
,μ
s
,
ms
,
sec
,
min
和
hr
。例如:
20
μ
s
,
100 ns
,
3 sec
。
在系
统
仿真
时
,
时间
数据特
别
有用,用它可以表示信号延
时
,从而使模型系
统
能更逼近
实际
系
统
的运行
环
境
。
9.
错误
等
级
(
SEVERITY LEVEL
)
错误
等
级类
型数据用来表征系
统
的状
态
,共有
4
种
:
note
(注意),
warning
(警告),
error
(出
错
),
failure
(失
败
)
。在系
统
仿真
过
程中可以用
这
4
种
状
态
来提示系
统
当前的工作情况,从而使
设计
人
员
随
时
了解当前系
统
工作的情况,并根据系
统
的不同状
态
采取相
应
的
对
策
。
10.
大于等于零的整数(自然数)(
NATURAL
),正整数(
POSITIVE
)
这
两
种
数据是整数的子
类
,
NATURAL
类
数据
为
取
0
和
0
以上的正整数;而
POSITIVE
则
只能
为
正整数
。
上述
10
种
数据
类
型是
VHDL
语
言中
标
准的数据
类
型,在
编
程
时
可以直接引用。如果用
户
需使用
这
10
种
以外的数
据
类
型,
则
必
须进
行自定
义
。但大多数的
CAD
厂商已在包集合中
对标
准数据
类
型
进
行了
扩
展
。例如,数
组
型数据等,
请
同学
们
注意
。
2.2.2
用
户
自定
义
的数据
类
型
可以由用
户
定
义
的数据
类
型有:
·
枚
举
(
ENUMERATED
)
类
型;
·
整数(
INTEGER
)
类
型;
·
实
数
(
REAL
)、浮点数(
FLOATING
)
类
型;
·
数
组
(
ARRAY
)
类
型;
·
存取(
ACCESS
)
类
型;
·
文件(
FILE
)
类
型;
·
记录
(
RECORDE
)
类
型;
·
时间
(
TIME
)
类
型(物理
类
型)
。
2.2.3 IEEE
预
定
义标
准
1.
标
准化数据
类
型
IEEE‘93
增加了多
值逻辑
包
STD_LOGIC_1164
,使得
“STD_LOGIC”
数据具有
9
种
不同的
值
。其定
义
如下所示:
TYPE STD_LOGIC IS
(
‘U’
,
- -
初始
值
‘X’
,
- -
不定
‘0’
,
- - 0
‘1’
,
- - 1
‘Z’
,
- -
高阻
‘W’
,
- -
弱信号不定
‘L’
,
- -
弱信号
0
‘H’
,
- -
弱信号
1
‘—’
- -
不可能情况
);
--9
种不同的值
2.3 VHDL
数据
类
型
转换
在
VHDL
程序
设计
中不同的数据
类
型的
对
象之
间
不能代入和运算。
实现
他
们
之
间
数据
类
型的
转换
有
3
种
方法:
·
类
型
标记
法
;
·
函数
转换
法
;
·
常数
转换
法
。
2.3.1
用函数
进
行
类
型
转换
VHDL
语
言中,程序包中提供了
变换
函数
,
这
些程序包有
3
种
,
每
个程序包中的
变换
函数不一
样
。
现
列表如下
。
·STD_LOGIC_1164
包集合函数
函数
TO_ STDLOGICVECTOR
(
A
)
由
BIT_VECTOR
转换为
STD_LOGIC_VECTOR
函数
TO_ BITVECTOR
(
A
)
由
STD_LOGIC_VECTOR
转换为
BIT_VECTOR
函数
TO_ STDLOGIC
(
A
)
由
BIT
转换为
STD_LOGIC
函数
TO_ BIT
(
A
)
由
STD_LOGIC
转换为
BIT
.STD_LOGIC_ARITH
包集合函数
函数:
CONV_STD_LOGIC_VECTOR (A,
位
长
)
由
UNSINGED
,
SINGED
转换为
INTEGER
STD_LOGIC_ UNSINGED
包集合
函数:
CONV_INTEGER (A)
由
STD_LOGIC_VECTOR
转换为
INTEGER
·STD_LOGIC_ UNSINGED
包集合
函数:
CONV_INTEGER (A)
由
INTEGER
,
UNSINGED
,
SINGED
转换为
STD_LOGIC_VECTOR
2.3.2
类
型
标记
法
实现类
型
转换
类
型
标记
就是
类
型的名称。
类
型
标记
法适合那些
关
系密切的
标
量
类
型之
间
的
类
型
转换
,即整数和
实
数的
类
型
转换
。
例如:
VARIABLE I
:
INTEGER
;
VARIABLE R
:
REAL
;
I := INTEGER
(
R
);
R := REAL
(
I
);
2.3.3
常数
实现类
型
转换
就模
拟
效率而言,利用常数
实现类
型
转换
比利用
类
型
转换
函数的效率更高
。
下面的例子使用常数把
类
型
为
STD_LOGIC
的
值转换为
BIT
型的
值
。
例
:
LIBRARY IEEE
;
USE IEEE. STD_LOGIC_1164.ALL
;
ENTITY typeconv IS
END
;
ARCHITECTURE arch OF typeconv IS
TYPE typeconv_type IS ARRAY
(
STD_ULOGIC
)
OF BIT
;
--
定义一个类型
CONSTANT typecon_con
:
typeconv_type
:
=
(
‘0’/‘L’=>‘0’
,
‘1’/‘H’ =>1’
,
OTHERS=>‘0’
);
SIGNAL b
:
BIT
;
SIGNAL b
:
BIT
;
SIGNAL s
:
STD_ULOGIC
;
BEGIN
b<= typecon_con (s)
;
--
常数实现类型转换
2.4 VHDL
操作符
与其他程序
设计语
言相似,
VHDL
中的表达式也是由运算符将基本元素
连
接起来形成。
这
里的基本元素包括
对
象名、文字、函数
调
用及用括号括起来的表达式。
在
VHDL
语
言中共有
4
类
操作符
,可以分
别进
行
逻辑
运算
(
LOGICAL
)、
关
系运算
(
RELATIONAL
)、算
术
运算
(
ARITHMETIC
)和并置运算(
CONCATENATION
)
。需要指出的是操作符操作的
对
象是操作数,且操作数的
类
型
应该
和操作符所要求的
类
型相一致
。另外,运算操作符是有
优
先
级
的
,例如,
逻辑
运算符
not
,在所有操作符中
优
先
级
最高
。
1.
逻辑
运算符
在
VHDL
语
言中,共有
6
种逻辑
运算符,他
们
分
别
是:
NOT
取反;
AND
与;
OR
或;
NAND
与非;
NOR
或非;
XOR
异或。
这
6
种逻辑
运算符可以
对
“STD_LOGIC ”
和
“BIT”
等
逻辑
型数据、
“STD_LOGIC _VECTOR”
逻辑
型数
组
及
布
尔
数据
进
行
逻辑
运算
。
必
须
注意,运算符的左
边
和右
边
,以及代入的信号的数据
类
型必
须
是相同的
。
2.
算
术
运算符
VHDL
语
言中有
5
类
算
术
运算符,他
们
分
别
是:
·
求和操作符:
+(加)、-(减)
·
求
积
操作符
:*
(乘)、
/
(除)、
MOD
(求模)、
REM
(取余)
·
符号操作符:
+(正)、-(
负
)
·
混合操作符:
**
(指数)、
ABS
(取
绝对值
)
·
移位操作符:
S
LL
(
逻辑
左移)、
SRL
(
逻辑
右移)、
SLA
(算
术
左移)、
SRA
(算
术
右移)、
ROL
(
逻辑
循
环
左移)、
ROR
逻辑
循
环
右移
)
3.
关
系运算符
VHDL
语
言中有
6
种关
系运算符,他
们
分
别
是:
=
等于;
/=
不等于;
<
小于;
<=
小于等于;
>
大于;
>=
大于等于;
4.
并置运算符
&
连
接
SIGNAL g
,
h
,
i
:
STD_LOGIC
;
SIGNAL c
,
d
,
e
:
STD_LOGIC _VECTOR
(
1 TO 0
);
┇
d <= i & NOT h
;
- -
元素与元素并置,形成
长
度
为
2
的数
组
a <= c & d
;
- -
数
组
与数
组
并置,形成
长
度
为
4
的数
组
5.VHDL
操作符的
优
先
顺
序
运算符
优
先
级
NOT
,
ABS
,
**
最高
优
先
级
*
,
/
,
MOD
,
REM
+
(正号),-(
负
号)
+
,-,
&
SLL
,
SLA
,
SRL
,
SRA
,
ROL
,
ROR
=
,
/=
,
<
,
>
,
<=
,
>=
AND
,
OR
,
NAND
,
NOR
,
XOR
,
XNOR
最低
优
先
级
2.4 VHDL
词
法
规则
与
标识
符
2.4.1
词
法
规则
1.
注
释
为
了提高
VHDL
源程序的可
读
性,在
VHDL
中可以写入注
释
。注
释
以
- -
开头
直到本行末尾的一段文字。在
MUX+PLUS
Ⅱ中可以看
见
,
敲入
- -
之后,后面字体的
颜
色就
发
生改
变
。注
释
不是
VHDL
设计
描述的一部分,
编译
后存入数据
库
中的信息不包含注
释
。
注
释举
例:
Q
:
OUT STD_LOGIC _VECTOR
(
11 DOWNTO 0
);
--A/D
转换
数据
输
出
显
示(
行注
释
)
--SRAM
数据写入控制状
态
机(
段注
释
)
WRIT_STATE
:
PROCESS
(
clk
,
rst
)
--SRAM
写入控制状
态
机
时
序
电
路
进
程
2.
数字
数字型文字可以有多
种
表达方式:可以是十
进
制数,也可以表示
为
二
进
制、八
进
制或十六
进
制
等
为
基的数,可以是整数,也可以是含有小数点的浮点数。
现举
例如下。
·
十
进
制整数表示法:如
012 5 78_456 (=78456) 2E6
在相
邻
数字之
间
插入下划
线
,
对
十
进
制数
值
不
产
生影响,
仅仅
是
为
了提高文字的可
读
性
。允
许
在数字之前冠以若干个
0
,但不允
许
在数字之
间
存在空格
。
·
以基表示的数:用
这种
方式表示的数由五个部分
组
成。第一部分,用十
进
制数
标
明数
值进
位的基数;第二部分,数
值
隔离符号
“#”
;第三部分,表达的文字;第四部分,指数隔离符号
“#”
;第五部分,用十
进
制表示的指数部分,
这
一部分的数如果
为
0
可以省去不写。
如
2#111_1011# 8#1473# 16#A8#E1 016#F.01#E+4
对
以基表示的数而言,相
邻
数字
间
插入下划
线
不影响数
值
。基的最小数
为
2
,最大数
为
16
,以基表示的数中允
许
出
现
A
至
F
的字母,大小写字母意
义
无区
别
。
·
实
数:
实
数必
须带
有小数点
。如
12.0 0.0 3.14 6_741_113.666 52.6 E
-
2
·
物理量文字:
综
合器不支持物理量
文字的
综
合
。如
60 s
(秒)
100 m
(米)
177 A
(安培)
3.
字符和字符串
字符是用
单
引号引起来的
ASC
Ⅱ字符,可以是数
值
,也可以是符号或字母,如
‘E’
,
‘e’
,
‘$’
,
‘23’
,
‘A’…
字符串是一
维
的字符数
组
,需放在双引号中。有两
种类
型的字符串:文字字符串和位矢量字符串。
文字字符串是用双引号引起来的一串文字。如
“FALSE”
,
“X”
,
“THIS IS END”
位矢量字符串是被双引号引起来的
扩
展的数字序列,数字序列前冠以基数
说
明符。基数符有
“B”
、
“O”
、
“X”
,他
们
的含
义
如下。
B
:二
进
制基数符号,表示二
进
制位
0
或
1
,在字符串中
每
一个位表示一个
BIT
。
O
:八
进
制基数符号,在字符串中
每
一个数代表一个八
进
制数,即代表一个
3
位(
BIT
)的二
进
制数。
X
:十六
进
制基数符号,代表一个十六
进
制数,即代表一个
4
位二
进
制数。
例如:
B“1011_1111”
,
O“152”
,
X“F821”
4.
下
标
名
下
标
名用于指示数
组
型
变
量或信号的某一元素
。
SIGNAL a
,
b
:
BIT _VECTOR
(
0 TO 3
);
SIGNAL s
:
INTEGER RANGE 0 TO 2
;
SIGNAL x
,
y
:
BIT;
x <= a (s);
y <= b (3);
上例中,
a (s)
为
一下
标语
句,
s
是不可
计
算的下
标
名,只能在特定情况下
进
行
综
合;
b (3)
的下
标为
3
,可以
进
行
综
合
。
2.4.2
标识
符
标识
符是最常用的操作符,可以是常数、
变
量、信号、端口、子程序或参数的名字。
标识
符
规则
是
VHDL
语
言中符号
书
写的一般
规则
,
为
EDA
工具提供了
标
准的
书
写
规
范。
VHDL’93
对
VHDL’87
版本的
标识
符
语
法
规则进
行了
扩
展,通常称
VHDL’87
版本
标识
符
为
短
标识
符,
VHDL’93
版
标识
符
为扩
展
标识
符。
1.
短
标识
符
VHDL
短
标识
符需遵守以下
规则
:
(
1
)必
须
以
英文字母
开头
;
(
2
)英文字母、数字(
0
~
9
)和下划
线
都是有效的字符;
(
3
)短
标识
符不区分大小写;
(
4
)下划
线
(
_
)的前后都必
须
有英文字母或数字
。
一般的,在
书
写程序
时
,
应
将
VHDL
的保留字大写或黑体,
设计
者
自己定
义
的字符小写
,以使得程序便于
阅读
和
检查
。尽管
VHDL
仿真
综
合
时
不区分大小写,但一个
优
秀的硬件程序
设计师应该养
成良好的
习惯
。
例:
一些合法的
标识
符:
S_MACHINE
,
present_state
,
sig3
不合法的
标识
符:
present-state
,
3states
,
cons_,_now
2.
扩
展
标识
符
扩
展
标识
符的
识别
和
书
写有下面的
规则
:
(
1
)用反斜杠来界定
扩
展
标识
符,
如
/control_machine/
,
/s_block/
等都是合法的
扩
展
标识
符;
(
2
)
扩
展
标识
符允
许
包含
图
形符号和空格,如
/s&33/
,
/legal$state/
是合法的
扩
展
标识
符;
(
3
)两个反斜杠之
间
的字可以和保留字相同,如
/SIGNAL/
,
/ENTITY/
是合法的
标识
符,与
SIGNAL
、
ENTITY
是不同的;
(
4
)两个反斜杠之
间
的
标识
符可以用数字
开头
,如
/15BIT/
,
/5ns/
是合法的;
(
5
)
扩
展
标识
符是区分大小写的,如
/a/
与
/ A/
是不同的
标识
符;
(
6
)
扩
展
标识
符允
许
多个下划
线
相
邻
,如
/our_ _entity/
是合法的
扩
展
标识
符(
不推荐
这种
方式
);
(
7
)
扩
展
标识
符的名字中如果含有一个反斜杠,
则
用相
邻
的两个反斜杠来代表它,如
/te//xe/
表示
该扩
展
标识
符的名字
为
te/xe
(共
5
个字符);
原文地址:http://blog.csdn.net/skyyunmi/article/details/1572343