在系统可编程技术
第 10讲
VHDL语言的数据类型
VHDL数据对象( Data Objects)
Constant width,integer,= 7;
Constant Vcc,REAL:=5.0;
Constant D2:Std_Logic_Vector(width Downto 0):=,0000”;
? 不能在程序中改变;
? 增强程序的可读性,便于修改程序;
? 常量的使用范围取决于其定义位置,可在 Library,Entity、
Architecture,Process中进行定义,其有效范围也相应限定。
1、常数( Constant)
定义格式为,
Constant 常数名:数据类型, =表达式;
2,信号
信号数据对象,代表电路内部线路,其在元件之间起互连
作用,没有方向性,可给它赋值,也可当作输入。
定义格式为,
Signal 信号名:数据类型 [,=设定值 ];
如,
Signal A, Std_logic_vector(3 Down to 0),=,0000”;
注意:设定的初始值在综合时没有用, 只是在仿真时在开始设定一个起始值 。
信号赋值语句的语法格式为,
目标信号名 <=表达式(设定值);
A <=,1010”
VHDL数据对象( Data Objects)
3,变量
变量是一个局部量,用于对中间数据的临时存储,并不一
定代表电路的某一硬件,没有物理意义。
定义格式为,
Variable 变量名:数据类型 [,=设定值 ];
如,Variable a,integer,= 0;
变量赋值语句的语法格式为,
目标变量名,= 表达式 ( 设定值 ) ;
如,a,= b and c;
VHDL数据对象( Data Objects)
信号、变量、常数对比
一、定义
Signal clk,std_logic;
Variable data,std_logic_vector(7 downto 0);
Constant width,integer,=7 ;
二、赋值方式
clk <= ?1?; (非立即)
data,=,1010”; (立即)
三、定义区域
信号:实体、结构体、程序包
变量:进程、子程序
常数:实体、结构体、程序包、块、进程、子程序
四、适用范围
信号:实体、结构体、程序包
变量:定义了变量的进程、子程序的顺序语句中
常数:视其定义的位置而定
若常数定义在实体中,适用范围是实体所对应的所
有结构体。
若常数定义在结构体中,适用范围就是本结构体。
信号、变量、常数对比
信号赋值( 非立即 )
信号和变量赋值区别举例
Architecture abc of example is
signal tmp:std_logic;
Begin
process(a,b,c)
begin
tmp<=a;
x<=c and tmp;
tmp<=b;
y<=c and tmp;
end process;
End abc;
变量赋值( 立即 )
Architecture abc of example is
Begin
process(a,b,c)
variable tmp:std_logic;
begin
tmp:=a;
x<=c and tmp;
tmp:=b;
y<=c and tmp;
end process;
End abc;
执行结果,x=c and b
y=c and b
执行结果,x=c and a
y=c and b
VHDL数据类型
1、逻辑数据类型
( 1)布尔代数( Boolean)型
定义位置:在 std库的 standard程序包中进行定义。
取值,FALSE,TRUE
( 2)位( Bit)
定义位置:在 std库的 standard程序包中进行定义。
取值,0,1 (低电平,高电平 )
( 3)位矢量( Bit_Vector)
定义位置:在 std库的 standard程序包中进行定义。
Signal A,bit_vector(0 to 7);
Signal B,bit_vector(7 downto 0);
A<=“00001010”;
B<=“00001010”;
VHDL数据类型
位矢量是基于“位”数据类型的数组
A(7)=0 A(6)=1 A(5)=0 A(4)=1 A(3)=0 A(2)=0 A(1)=0 A(0)=0
B(7)=0 B(6)=0 B(5)=0 B(4)=0 B(3)=1 B(2)=0 B(1)=1 B(0)=0
( 4)标准逻辑型( Std_Logic )
定义位置:在 IEEE库的 std_logic_1164程序包中进行定义
VHDL数据类型
使用这类数据信号,必须包含下面两条声明语句,
Library IEEE;
Use IEEE.std_logic_1164.all;
“U” 初始值,X” 不定
“0” 0,1” 1
Z 高阻,W” 弱不定
“L” 弱 0,H” 弱 1
“-” 忽略
VHDL数据类型
该类型能比较全面地包括数字电路中信号的几种状态, 比
位, bit”信号对于数字逻辑电路的逻辑特性描述更完整, 更真
实 。 所以在 VHDL的程序里, 对于逻辑信号的定义, 通常都是采
用这个, 标准逻辑, 信号形式, 不再使用, BIT”。
( 5)标准逻辑数组类型( Std_Logic_vector)
定义位置:在 ieee库的 std_logic_1164程序包中进行定义。
Bit_Vector与 Std_Logic_vector的区别在于数组的
每一位前者为 BIT型 ( 0,1) 后者为 Std_Logic型
Signal A,STD_LOGIC_VECTOR(0 to 7);
Signal B,STD_LOGIC_VECTOR (7 downto 0);
A<=“10100000”;
B<=“00001010”;
A(7)=? B(7)=?
VHDL数据类型
逻辑数据类型赋值举例
Variable a,b, std_logic;
Signal data, std_logic_vector(0 to 3);
a,= ?1?;
b,= ?0?;
data<=“1100”; 一位值用单引号 多位值用双引号
1、直接整体赋值
2,段赋值
Signal data, std_logic_vector(0 to 3);
data(1 to 2) <=“10”;
data(0) <=?1?;
3,块赋值
Signal a,b,c,d, std_logic;
Signal data, std_logic_vector(3 downto 0);
data<=,0100” ;
(a,b,c,d) <= bus ;
位置关联
逻辑数据类型赋值举例
数值数据类型
( 1) 整数 ( Integer)
定义位置:在 std库的 standard程序包中进行定义 。
即数值范围为 -231~231。
整数不能用于逻辑运算, 只能用于算术运算 。
VHDL数据类型
Signal day,integer range 0 to 31;
Variable a,b,c,interger;
C=a+b;
有符号类型数据代表有符号数值, 即可以是正数, 0,负数;编
译器将有符号数类型作为一个补码的二进制数, 最左边的位为
符号位 。
无符号类型数据代表无符号数值,即代表 0或正数;最左边的位
为最高位。如,Unsigned(“0110”)代表 ; +6
+ 10
Unsigned(“1010”)代表
如,signed(“0110”)代表 +6; signed(“1010”)代表 -2。
VHDL数据类型
( 2) 无符号 ( Unsigned) 和有符号 ( Signed) 类型
定义位置:有符号 ( Signed) 和无符号 ( Unsigned) 逻辑
信号定义在库 IEEE的程序包 std_logic_arith中 。
字符串 (STRING)数据类型
双引号引起来字符串数组, 一般用于程序的提示和结果说明,
VARIABLE string_yin, STRING (1 TO 7 ) ;
string_yin,= "a b c d" ;
字符 (CHARACTER)数据类型
单引号引起来, 如,‘ A’ ‘a’
字符分大小写 。 ’A’不等于 ’ a’
VHDL数据类型
时间 (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 ;
VHDL数据类型
Q<=a and b or c AFTER 10ns;
用户定义的数据类型
格式,
TYPE 数据类型名 数据类型定义
1、枚举类型
格式,
TYPE 数据类型名 IS(元素 1,元素 2,……);
例,TYPE week IS (sun,mon,tue,wed,thu,fri,sat);
2、数组类型
格式,
TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型
例,TYPE word IS ARRAY (0 TO 7) OF STD_LOGIC;
3、记录 Record Types
– 相同或不同类型的元素组成,类似 C中的结构
– 描述总线或功能块
Type iocell is record
Enable,bit;
Data,bit_vector(7 downto 0);
end record;
singal bus, iocell;
bus.Enable <= ?1?;
bus.Data <=,00110110”;
用户定义的数据类型
用户定义的子类型
用户对已定义的数据类型,作一些范围限制而形成新的数据类型
格式,
SUBTYPE 子类型名 IS 数据类型名 范围
例,SUBTYPE data IS STD_LOGIC_VECTOR(7 DOWNTO 0);
SUBTYPE digit IS INTEGER RANGE 0 TO 9;
能进行逻辑运算的数据类型,
bit,bit_vector,boolean,std_logic,std_logic_vector
VHDL语言的操作符( operator)
一、逻辑操作符
= 等于 任何数据类型
/= 不等于 任何数据类型
< 小于 枚举与整数类型,及对应的一维数组
> 大于 枚举与整数类型,及对应的一维数组
<= 小于等于 枚举与整数类型,及对应的一维数组
关系操作符
>= 大于等于 枚举与整数类型,及对应的一维数组
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
+ 正 整数符号操作符
- 负 整数
signal d1,d2,s, integer;
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 ;
,.,
s<=a and b; -- integer 不能进行逻辑运算
a<=b AND c; -- 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 ; -- 数据类型不同,表达错误。
数据类型必须一致
表达式中有多个运算符时一般要加括号,但 and,or,xnor除外
VHDL语言的操作符( operator)
二、关系运算符
? =和 /=的操作对象可以是任何数据类型构成的
操作数。
? 其它关系运算符对数据类型有一定的限制。(整
数、实数、枚举型、位矢量)
VHDL语言的操作符( operator)
= 等于 任何数据类型
/= 不等于 任何数据类型
< 小于 枚举与整数类型,及对应的一维数组
> 大于 枚举与整数类型,及对应的一维数组
<= 小于等于 枚举与整数类型,及对应的一维数组
关系操作符
>= 大于等于 枚举与整数类型,及对应的一维数组
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
+ 正 整数符号操作符
- 负 整数
三、算术运算符
VHDL语言的操作符( operator)
类 型 操作符 功 能 操作数数据类型
+ 加 整数
- 减 整数
& 并置 一维数组
* 乘 整数和实数 ( 包括浮点数 )
/ 除 整数和实数 ( 包括浮点数 )
MOD 取模 整数
REM 取余 整数
SLL 逻辑左移 BIT 或布尔型一维数组
SRL 逻辑右移 BIT 或布尔型一维数组
SLA 算术左移 BIT 或布尔型一维数组
SRA 算术右移 BIT 或布尔型一维数组
ROL 逻辑循环左移 BIT 或布尔型一维数组
ROR 逻辑循环右移 BIT 或布尔型一维数组
** 乘方 整数
算术操作符
ABS 取绝对值 整数
VHDL语言的操作符( operator)
Variabe data,std_logic_vector(3 donto 0),=“1011”;
Data SLL 1; --”0110”
Data SRL 3; --”0001”
Data ROL 1; --”0111”
c<=a&b&c&d;
x:=(-y);
C<=a*4;
A<=d/4
+、-,*可以构成逻辑电路;
/,MOD,REM当分母的操作数是 2的 N次方时,才可
过程逻辑电路。