第 5章
VHDL语言的对象和数据类
型及运算操作符
EDA技术讲义
5.1 VHDL文字规则
5.1.1 数字
整数,整数都是十进制的数,如:
5,678,0,156E2(=15600),45_234_287 (=45234287)
实数,实数也都是十进制的数, 但必须带有小数点, 如:
1.335,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499)
以数制基数表示的文字,用这种方式表示的数由五个部分组成 。
SIGNAL d1,d2,d3,d4,d5, INTEGER RANGE 0 TO 255;
d1 <= 10#170# ; -- (十进制表示, 等于 十进制 170)
d2 <= 16#FE# ; -- (十六进制表示, 等于 十进制 254)
d3 <= 2#1111_1110#; -- (二进制表示, 等于 十进制 254)
d4 <= 8#376# ; -- (八进制表示, 等于 十进制 254)
d5 <= 16#E#E1 ; -- (十六进制表示, 等于 十进制 224)
物理量文字 (VHDL综合器不接受此类文字 )。 如:
60s (60秒 ),100m (100米 ),kΩ(千欧姆 ),177A(177安培 )
EDA技术讲义
5.1 VHDL文字规则
5.1.2 字符串
( 2) 文字字符串
( 3)数位字符串
用单引号括起来的 ASCII字符,如:‘ R?,?a?,?1?,?-?
B,二进制基数符号,表示二进制位 0或 1,在字符串中的每位表示一个 Bit。
O,八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个 3
位 (BIT)的二进制数。
X,十六进制基数符号 (0~ F),代表一个十六进制数,即一个 4位的二进制数。
data1 <= B"1_1101_1110" -- 二进制数数组, 位矢数组长度是 9
data2 <= O"15" -- 八进制数数组, 位矢数组长度是 6
data3 <= X"AD0" -- 十六进制数数组, 位矢数组长度是 12
data4 <= B"101_010_101_010" -- 二进制数数组, 位矢数组长度是 12
data5 <= "101_010_101_010" --表达错误, 缺 B。
data6 <= "0AD0" --表达错误, 缺 X。
( 1) 字符
"ERROR", "Both S and Q equal to 1", "X", "BB$CC"
EDA技术讲义
5.1 VHDL文字规则
5.1.3 标识符
标识符是最常用的操作符, 可以是常数, 变量, 信号, 端口, 子程序
或参数的名字 。 VHDL基本标识符的书写需遵循如下 规则:
l有效的字符:包括 26个大小写英文字母, 数字包括 0~ 9 以及下划线, _”

l任何标识符必须以英文字母开头。
l必须是单一下划线,_”,且其 前后 都必须有英文字母或数字。
l标识符中的英语字母不分大小写。
l允许包含图形符号 (如回车符、换行符等 ),也允许包含空格符。
合法的标识符:
A,fft,and_4,max2uc
非法的标识符:
21A,_fft,and_ _4,max#2uc,a-b,return
EDA技术讲义
5.1 VHDL文字规则
5.1.4 下标名
下标名用于指示数组型变量或信号的某一元素 。
格式,标识符 (表达式 )
标识符 必须 是数组型的变量或信号的名字, 表达式所代表的值必须是数
组下标范围中的一个值, 这个值将对应数组中的一个元素 。 如果这个表达
式是一个可计算的值, 则此操作数可很容易地进行综合 。 如果是不可计算
的, 则只能在特定的情况下综合 。
下例的两个下标名中一个是 m,属不可计算, 另一个是 3,属可计算的 。
SIGNAL a,b, BIT_VECTOR (0 TO 3) ;
SIGNAL m, INTEGER RANGE 0 TO 3 ;
SIGNAL y,z, BIT ;
y <= a(m) ; -- 不可计算型下标表示
z <= b(3) ; -- 可计算型下标表示
EDA技术讲义
5.2 数据类型
标量型 (Scalar Type)
复合类型 (Composite Type)
存取类型 (Access Type)
文件类型 (Files Type)
EDA技术讲义
5.2.1 VHDL的预定义数据类型
1,布尔 (BOOLEAN)数据类型
2,位 (BIT)数据类型
如,constant a,bit,=?1?;
variable q,bit,=?0?;
signal a,b,bit;
3,位矢量 (BIT_VECTOR)数据类型
如,signal s,bit_vector (15 downto 0);
constant q,bit_vector (3 downto 0),=“0110”;
EDA技术讲义
5.2.1 VHDL的预定义数据类型
4,字符 (CHARACTER)数据类型 通常用单引号括起来,区分大小写。
6,实数 (REAL)数据类型
如,variable q,real range 0.0 to 255.0;
constant a,real,=1.0; 1.0 十进制浮点数0.0 十进制浮点数
65971.333333 十进制浮点数
65_971.333_3333 与上一行等价
8#43.6#e+4 八进制浮点数
43.6E- 4 十进制浮点数
5,字符串 (STRING)数据类型
如,VARIABLE string_var,STRING (0 TO 3 ) ;
string_var,= "a b c d" ;
EDA技术讲义
8,时间 (TIME)数据类型
TYPE time IS RANGE - 2147483647 TO 2147483647
units
fs ; -- 飞秒,VHDL中的最小时间单位
ps = 1000 fs ; -- 皮秒
ns = 1000 ps ; -- 纳秒
us = 1000 ns ; -- 微秒
ms = 1000 us ; -- 毫秒
sec = 1000 ms ; -- 秒
min = 60 sec ; -- 分
hr = 60 min ; -- 时
end units ;
5.2.1 VHDL的预定义数据类型
7,整数 (INTEGER)数据类型
如,signal b,integer range –7 to 7;
variable a, integer,=5;
EDA技术讲义
5.2.2 IEEE预定义标准逻辑位与矢量
1,标准逻辑位 STD_LOGIC数据类型
2,标准逻辑矢量 (STD_LOGIC_VECTOR)数据类型
5.2 数据类型
EDA技术讲义
5.2.3 其他预定义数据类型
1,无符号数据类型 (UNSIGNED TYPE)
2,有符号数据类型 (SIGNED TYPE)
5.2 数据类型
十进制的 8可以作如下表
示:
UNSIGNED'("1000")
两则无符号数据定义的示例:
VARIABLE var, UNSIGNED(0 TO 10) ;
SIGNAL sig, UNSIGNED(5 TO 0) ;
例如:
SIGNED'("0101") 代表 +5,5
SIGNED'("1011") 代表 –5
EDA技术讲义
5.2.4 用户自定义数据类型
1,枚举类型
2,物理类型
5.2 数据类型
如:
Type year is(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
Signal thismoth,year;
result<=?1?when thismoth >= sep else ?0?;
如:
Type voltage is range 0 to 1000000000
Units
uv; (基本单位 )
mv=1000uv;
v=1000mv;
End units;
EDA技术讲义
5.2.5 数组类型
5.2 数据类型
限定性数组
限定性数组定义语句格式如下:
TYPE 数组名 IS ARRAY (数组范围 )OF 数据类型 ;
如,type word is array(0 to 7)of std_logic;
非限定性数组
非限制性数组的定义语句格式如下:
TYPE 数组名 IS ARRAY (数组下标名 RANGE ??)OF 数据类型 ;
如,type word is array (natural range<>)of bit;
EDA技术讲义
5.2.5 数组类型
5.2 数据类型
数组的元素可以是任何一种数据类型, 用以定义数
组元素的下标范围子句决定了数组中元素的个数, 以
及元素的排序方向, 既下标数是由高到低, 或是由低
到高 。
如子句, 0 TO 7”是 由低到高 排序的 8个元素;
即,a(0)a(1)a(2)…… a(7)。
,15 DOWNTO 0”是 由高到低 排序的 16个元素 ;
即,a(15)a(14)a(13) …… a(0) 。
EDA技术讲义
5.3 VHDL操作符
5.3.1 逻辑操作符
类 型 操作符 功 能 操作数数据类型
+ 加 整数
- 减 整数
& 并置 一维数组
* 乘 整数和实数 ( 包括浮点数 )
/ 除 整数和实数 ( 包括浮点数 )
MOD 取模 整数
REM 取余 整数
SLL 逻辑左移 BIT 或布尔型一维数组
SRL 逻辑右移 BIT 或布尔型一维数组
SLA 算术左移 BIT 或布尔型一维数组
SRA 算术右移 BIT 或布尔型一维数组
ROL 逻辑循环左移 BIT 或布尔型一维数组
ROR 逻辑循环右移 BIT 或布尔型一维数组
** 乘方 整数
算术操作符
ABS 取绝对值 整数
表 5-1 VHDL操作符列表
EDA技术讲义
表 5-1 VHDL操作符列表
类 型 操作符 功 能 操作数数据类型
= 等于 任何数据类型
/= 不等于 任何数据类型
< 小于 枚举与整数类型,及对应的一维数组
> 大于 枚举与整数类型,及对应的一维数组
<= 小于等于 枚举与整数类型,及对应的一维数组
关系操作符
>= 大于等于 枚举与整数类型,及对应的一维数组
AND 与 BIT, B OOLEAN, STD_LOGIC
OR 或 BIT, B OOLEAN, STD_LOGIC
NAND 与非 BIT, B OOLEAN, STD_LOGIC
NOR 或非 BIT, B OOLEAN, STD_LOGIC
XOR 异或 BIT, B OOLEAN, STD_LOGIC
XNOR 异或非 BIT, B OOLEAN, STD_LOGIC
逻辑操作符
NOT 非 BIT, B OOLEAN, STD_LOGIC
+ 正 整数符号操作符
- 负 整数
接上页
EDA技术讲义
运算符 优先级
NOT, ABS, ** 最高优先级
*, /, MOD, R E M
+ ( 正号 ), - ( 负号 )
+, -, &
SLL, S L A, S R L, S R A, R O L, R O R
=, / =, <, < =, >, > =
AND, O R, N A N D, N O R, X O R, X N O R 最低优先级
表 5-2 VHDL操作符优先级
5.3.1 逻辑操作符
EDA技术讲义
【 例 5-4】
SIGNAL a, b,c, STD_LOGIC_VECTOR (3 DOWNTO 0) ;
SIGNAL d,e,f,g, STD_LOGIC_VECTOR (1 DOWNTO 0) ;
SIGNAL h,I,j,k, STD_LOGIC ;
SIGNAL l,m,n,o,p, BOOLEAN ;
...
a<=b AND c; --b,c 相与后向 a赋值,a,b,c的数据类型同属 4位长的位矢量
d<=e OR f OR g ; -- 两个操作符 OR相同,不需括号
h<=(i NAND j)NAND k ; -- NAND不属上述三种算符中的一种,必须加括号
l<=(m XOR n)AND(o XOR p); -- 操作符不同,必须加括号
h<=i AND j AND k ; -- 两个操作符都是 AND,不必加括号
h<=i AND j OR k ; -- 两个操作符不同,未加括号,表达错误
a<=b AND e ; -- 操作数 b 与 e的位矢长度不一致,表达错误
h<=i OR l ; -- i 的数据类型是位 STD_LOGIC,而 l的数据类型是
..,-- 布尔量 BOOLEAN,因而不能相互作用, 表达错误 。
5.3.1 逻辑操作符
EDA技术讲义
5.3.2 关系操作符
【 例 5-5】
ENTITY relational_ops_1 IS
PORT ( a,b, IN BIT_ VECTOR (0 TO 3) ;
m, OUT BOOLEAN) ;
END relational_ops_1 ;
ARCHITECTURE example OF relational_ops_1 IS
BEGIN
output <= (a = b) ;
END example ;
【 例 5-6】
ENTITY relational_ops_2 IS
PORT (a,b, IN INTEGER RANGE 0 TO 3 ;
m, OUT BOOLEAN) ;
END relational_ops_2 ;
ARCHITECTURE example OF relational_ops_2 IS
BEGIN
output <= (a >= b) ;
END example ;
六种关系运
算操作符:
,=, (等于 )、
,/=” (不等于 )、
,>” (大于 )、
,<, (小于 )、
,>=” (大于等
于 )
,<=” (小于等
于 )
EDA技术讲义
5.3.3 算术操作符
类 别 算 术 操 作 符 分 类
1 求和操作符 (Adding operators) +( 加 ),- ( 减 ), ? ( 并置 )
2 求积操作符 (Multiplying operators) *, /, MOD, REM
3 符号操作符 (Sign operators) +( 正 ), - ( 负 )
4 混合操作符 (Miscellaneous operators) **, ABS
5 移位操作符 (Shift operators) SLL, SRL, SLA, SR A, ROL, ROR
表 5-3 算术操作符分类表
1,求和操作符
【 例 5-7】
VARIABLE a,b, c,d, e,f, INTEGER RANGE 0 TO 255 ;
...
a,= b + c ; d,= e – f ;
EDA技术讲义
【 例 5-8】
PROCEDURE adding_e (a,IN INTEGER ; b,INOUT INTEGER )IS
...
b,= a + b ;
【 例 5-9】
PACKAGE example_arithmetic IS
TYPE small_INt IS RANGE 0 TO 7 ;
END example_arithmetic ;
USE WORK.example_arithmetic.ALL ;
ENTITY arithmetic IS
PORT (a,b, IN SMALL_INT ;
c, OUT SMALL_INT) ;
END arithmetic ;
ARCHITECTURE example OF arithmetic IS
BEGIN
c <= a + b ;
END example ;
EDA技术讲义
2,求积操作符
5.3.3 算术操作符
3,符号操作符
求积操作符包括 * (乘 ),/ (除 ),MOD(取模 )
和 RED(取余 )四种操作符。
符号操作符, +” 和, -, 的操作数只有
一个
EDA技术讲义
5.3.3 算术操作符
4,混合操作符
【 例 5-10】
SIGNAL a,b, INTEGER RANGE - 8 to 7 ;
SIGNAL c, INTEGER RANGE 0 to 15 ;
SIGNAL d, INTEGER RANGE 0 to 3 ;
a <= ABS(b) ;
c <= 2 ** d ;
混合操作符包括乘方, **” 操作符和
取绝对值, ABS”操作符两种
EDA技术讲义
SLL——逻辑左移
SRL——逻辑右移
移空的位补零
SLA——算术左移
SRA——算术右移
移空的位由最初首位补
ROL——逻辑循环左移
ROR——逻辑循环右移
移出的位依次填补移空的位
5.3.3 算术操作符
5,移位操作符
移位操作符的语句格式是:
标识符 移位操作符 移位位数 ;
例:
,1001001” SLL 1=“0010010”
,1001001” SRL 1=“0100100”
,1001001” SLA 1=“0010011”
,1001001” SRA 1=“1100100”
,1001001” ROL 1=“0010011”
,1001001” ROR 1=“1100100”
EDA技术讲义
5.4 VHDL数据对象( Data Objects)
常量( Constant)
固定值,不能在程序中被改变
增强程序的可读性,便于修改程序
可在 Package,Entity,Architecture,Process、
Function,Procedure中进行定义,其有效范围也相应
限定
书写格式:
Constant 常量名 [,常量名 …],数据类型 [,=表达式 ];
例,Constant data_bus_width,integer,= 8;
EDA技术讲义
5.4 VHDL数据对象( Data Objects)
信号( Signals)
代表连线,Port也是一种信号
没有方向性,可给它赋值,也可当作输入
在 Package,Entity,Architecture中定义
设定的初始值在综合时没有用,只是在仿真时在开
始设定一个起始值。
用 <= 进行赋值
用, = 进行初始化
signal count,bit_vector(3 downto 0):=“0011”;
EDA技术讲义
5.4 VHDL数据对象( Data Objects)
变量( Variable)
临时数据,没有物理意义
只能在 Process,Function,Procedure中定义,并只
在其内部有效,
要使其全局有效,先转换为 Signal。
用,= 进行赋值
用,= 进行初始化
variable result, std_logic,= ?0?;
EDA技术讲义
信号与变量的区别
architecture rtl of start is
signal count, integer range 0 to 7;
begin
process(clk)
begin
if (clk'event and clk='1') then
count <= count + 1;
if(count=0) then
carryout <= '1';
else
carryout <= '0';
end if;
end if;
end process;
end rtl;
architecture rtl of start is
begin
process(clk)
variable count, integer range 0 to 7;
begin
if (clk'event and clk='1') then
count,= count + 1;
if(count=0) then
carryout <= '1';
else
carryout <= '0';
end if;
end if;
end process;
end rtl;
EDA技术讲义
信号与变量的区别
architecture a of start is
signal tmp, std_logic;
begin
process(a_bus)
begin
tmp <= '1';
for i in 3 downto 0 loop
tmp <= a_bus(i) and tmp;
end loop;
carryout <= tmp;
end process;
end a;
architecture a of start is
begin
process(a_bus)
variable tmp:std_logic;
begin
tmp,= '1';
for i in 3 downto 0 loop
tmp,= a_bus(i) and tmp;
end loop;
carryout <= tmp;
end process;
end a;