1
第三章 硬件描述语言( VHDL)
2
VHDL,
VHSIC (Very High Speed Integrated
Circuit)
Hardware
Description
Language
§ 3.1 概述
一、什么是 VHDL?
3
80年代初由美国国防部在实施超高速集成电
路( VHSIC)项目时开发的。
1987年由 IEEE 协会批准为 IEEE 工业标准,
称为 IEEE1076-1987。
各 EDA公司相继推出支持 VHDL的设计环境。
1993年被更新为 93 标准,即 IEEE1076-1993。
进一步提高抽象描述层次,扩展系统描述能力。
二,VHDL的历史
4
1,VHDL打破软、硬件的界限
传统的数字系统设计分为,
硬件设计(硬件设计人员)
软件设计(软件设计人员)
VHDL是电子系统设计者和 EDA工具之
间的界面。
三,VHDL的作用
EDA工具及 HDL的流行,使电子系统向集
成化、大规模和高速度等方向发展。
美国硅谷约有 80%的 ASIC和 FPGA/CPLD
已采用 HDL进行设计。
5
2,VHDL与 C,C++的比较,
C,C++ 代替汇编等语言
VHDL 代替原理图、逻辑状态图等
3,VHDL与电原理图描述的比较,
VHDL具有较强的抽象描述能力,可进行系统
行为级别的描述。描述简洁,效率高。
VHDL描述与实现工艺无关。
电原理图描述需给出完整、具体的电路结构
图,不能进行抽象描述。描述繁杂,效率低。
电原理图描述与实现工艺有关。
6
1,VHDL具有强大的语言结构,系统硬件描述能
力强、设计效率高;具有较高的抽象描述能力。
如:一个可置数的 16位计数器的电原理图,
四,VHDL语言特点
7
用 VHDL描述的可置数 16位计数器,
8
2,VHDL语言可读性强,易于修改和发现错误。
3,VHDL具有丰富的仿真语句和库函数,可对
VHDL源代码进行早期功能仿真,有利于大
系统的设计与验证。
4,VHDL设计与硬件电路关系不大。
5,VHDL设计不依赖于器件,与工艺无关 。
6、移植性好。
7,VHDL体系符合 TOP-DOWN和 CE(并行工程)设计
思想。
8,VHDL设计效率高,产品上市时间快,成本低。
9、易于 ASIC实现。
9
五,VHDL与其它硬件描述语言的比较
VHDL,
具有较强的系统级抽象描述能力,适
合行为级和 RTL级的描述。设计者可不必
了解电路细节,所作工作较少,效率高。
但对综合器的要求高,不易控制底层电路
的生成。 IEEE标准,支持广泛。
行为级 RTL级 门电路级
RTL,Register Translate Level
10
Verilog HDL,
系统级抽象描述能力比 VHDL稍差;门级开
关电路描述方面比 VHDL 强。适合 RTL级和门
电路级的描述。设计者需要了解电路细节,所
作工作较多。 IEEE标准,支持广泛。
ABEL,PALASM,AHDL(Altera HDL),
系统级抽象描述能力差,一般作门级 电
路描述。要求设计者对电路细节有详细的了解。
对综合器的性能要求低,易于控制电路资源。
支持少。
11
VHDL主要用于描述数字系统的结构、行
为、功能和接口。
VHDL将一个设计(元件、电路、系统)
分为,
外部(可视部分、端口)
内部(不可视部分、内部功能、算法)
六,VHDL设计简述
12
外部与内部,
器件或
子系统
ARCHITECTURE
Process Process
ENTITY
Sequential
Process
Combinational
Process ports ports
component
ports ports
13
2选 1选择器的 VHDL描述,
14
? VHDL语言由保留关键字组成;
? 一般,VHDL语言对字母大小写不敏感;
例外,‘ ’, ? ? 所括的字符、字符串;
? 每条 VHDL语句由一个分号(;)结束;
? VHDL语言对空格不敏感,增加可读性;
? 在 ? --”之后的是 VHDL的注释语句;
? VHDL有以下描述风格,
行为描述;
数据流(寄存器传输 RTL)描述;
结构化描述;
VHDL语言的一些基本特点,
15
基本结构包括,
? 实体( Entity)
? 结构体( Architecture)
? 配置( Configuration)
? 库( Library),程序包( Package)
§ 3.2 VHDL程序基本结构
16
库、程序包
实体( Entity)
结构体
( Architecture)
进程
或其它并行结构
配置( Configuration)
17
一、实体(说明)
实体(说明),
定义系统的输入输出端口
语法,
ENTITY <entity_name> IS
Generic Declarations
Port Declarations
END <entity_name>; (1076-1987 version)
END ENTITY <entity_name> ; ( 1076-1993
version)
18
1、类属说明
类属说明,
确定实体或组件中定义的局部常数。模
块化设计时多用于不同层次模块之间信息的
传递。可从外部改变内部电路结构和规模。
类属说明必须放在端口说明之前。
Generic (
常数名称:类型 [,= 缺省值 ]
{常数名称:类型 [,= 缺省值 ]}
);
19
类属常用于定义,
实体端口的大小,
设计实体的物理特性,
总线宽度,
元件例化的数量等。
例,
entity mck is
generic(width,integer:=16);
port(add_bus:out std_logic_vector
(width-1 downto 0));
…
20
例,2输入与门的实体描述
entity and2 is
generic(risewidth,time:= 1 ns;
fallwidth,time:= 1 ns);
port(a1,in std_logic;
a0,in std_logic;
z0,out std_loigc);
end entity and2;
注:数据类型 time 用于仿真模块的设计。
综合器仅支持数据类型为整数的类属值。
21
其中,端口模式,
in,输入型,此端口为只读型。
out,输出型,只能在实体内部对其赋值。
inout:输入输出型,既可读也可赋值。
buffer,缓冲型,与 out 相似,但可读。
Port (
端口名称 {,端口名称 }:端口模式 数据类型;
…
端口名称 {,端口名称 }:端口模式 数据类型
);
2、端口声明
端口声明:确定输入、输出端口的数目和类型。
22
out 和 buffer 的区别,
inout 和 buffer 的区别,
23
指端口上流动的数据的表达格式。为预先定
义好的数据类型。
如,bit,bit_vector,integer,
std_logic,std_logic_vector 等。
例,
entity nand2 is entity m81 is
port ( port(
a,b:in bit; a:in bit_vector(7 downto 0);
z,out bit sel:in bit_vector(2 downto 0);
) ; b:out bit);
end entity nand2; end entity m81;
3、数据类型,
24
作用:定义系统(或模块)的行为、元件及内部
的连接关系,即描述其逻辑功能。
两个组成部分,
? 对数据类型、常数、信号、子程序、元件等
元素的 说明 部分。
? 以各种不同的描述风格描述的系统的逻辑功
能实现的部分。常用的描述风格有:行为描
述、数据流描述,结构化描述。
二、结构体
25
结
构
体
结
构
体
说
明
结
构
体
功
能
描
述
常数说明
数据类型说明
信号说明
例化元件说明
子程序说明
块语句
进程语句
信号赋值语句
子程序调用语句
元件例化语句
26
实体与结构体的关系,
设计实体
结构体 1
结构体 2
结构体 3
结构体 n
。
。
。
一个设计实体可有多个结构体,代表实体
的多种实现方式。各个结构体的地位相同。
27
注:同一实体的结构体不能同名。定义语句中的
常数、信号不能与实体中的端口同名。
architecture 结构体名称 of 实体名称 is
[说明语句 ]内部信号、常数,
数据类型、子程序(函数、过程),
元件等的说明;
begin
[并行处理(功能描述)语句 ];
end [architecture] 结构体名称;
结构体的语法,
28
例:结构体中错误的信号声明
29
例:一个完整描述( 3 bit 计数器)
30
3bit计数器的等效描述( out与 buffer的区别),
31
三、配置
设计实体
结构体 1
结构体 2
结构体 3
结构体 n
。
。
。 一个设计实体的多
种实现方式
配置:从某个实体的多种结构体描述方式中选择
特定的一个。
32
configuration 配置名 of 实体名 is
for 选配结构体名
end for ;
end 配置名;
简单配置的语法,
33
library ieee;
use ieee.std_logic_1164.all;
entity nand is
port(a,in std_logic;
b,in std_logic;
c,out std_logic);
end entity nand;
architecture art1 of nand is
begin
c<=not (a and b);
end architecture art1;
例:一个与非门不同实现方式的配置如下,
34
architecture art2 of nand is
begin
c<=?1? when (a=?0?) and (b=?0?) else
?1? when (a=?0?) and (b=?1?) else
?1? when (a=?1?) and (b=?0?) else
?0? when (a=?1?) and (b=?1?) else
?0?;
end architecture art2;
35
configuration first of nand is
for art1;
end for;
end first;
configuration second of nand is
for art2
end for;
end second;
36
例:一个对计数器实现多种形式的配置如下,
37
38
程序包,
已定义的常数、数据类型、元件调用说明、
子程序的一个集合。
目的:方便公共信息、资源的访问和共享。
库,
多个程序包构成库。
四,程序包、库
39
程序包说明的内容,
常量说明;
VHDL数据类型说明;
元件说明;
子程序说明;
程序包的结构包括,
程序包说明(包首)
程序包主体(包体)
40
包声明项可由以下语句组成,
use 语句(用来包括其它程序包);
类型说明;子类型说明;常量说明;
信号说明;子程序说明;元件说明。
package 程序包名 is
{ 包说明项 }
end 程序包名;
1、程序包说明(包首)
语法,
41
例:程序包说明
42
包体说明项可含,
use 语句;子程序 说 明; 子程序主体 ;
类型 说 明;子类型 说 明;常量 说 明。
package body 程序包名 is
{ 包体说明项 }
end 程序包名;
2、程序包包体
程序包的内容:子程序的实现算法。
包体语法,
43
程序包首与程序包体的关系,
程序包体并非必须,只有在程序包中要说明
子程序时,程序包体才是必须的。
程序包首可以独立定义和使用。如下,
44
package seven is
subtype segments is bit_vector(0 to 6);
type bcd is range 0 to 9;
end seven;
library work;
use work.seven.all;
entity decoder is
port(input,in bcd;
drive,out segments);
end decoder;
architecture art of decoder is
begin
45
with input select
drive<=B“1111110” when 0,
B“0110000” when 1,
B“1101101” when 2,
B“1111001” when 3,
B“0110011” when 4,
B“1011011” when 5,
B“1011111” when 6,
B“1110000” when 7,
B“1111111” when 8,
B“1111011” when 9,
B“0000000” when others;
end architecture art;
a
b
c
d
e
f
g
46
3、库的种类
VHDL库可分为 5种,
1) IEEE 库
定义了四个常用的程序包,
? std_logic_1164 (std_logic types &
related functions)
? std_logic_arith (arithmetic functions)
? std_logic_signed (signed arithmetic
functions)
? std_logic_unsigned (unsigned
arithmetic functions)
47
Type STD_LOGIC,
9 logic value system (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,
‘L’,‘H’,‘-’)
? ‘W’,‘L’,‘H” weak values (Not supported
by Synthesis)
? ‘X’ - (not ‘x’)used for unknown
? ‘Z’ - (not ‘z’) used for tri-state
? ‘-’ Don’t Care
48
2) STD 库(默认库)
库中程序包为,standard,
定义最基本的数据类型,
Bit,bit_vector, Boolean,
Integer,Real,and Time
注,Type Bit
2 logic value system (‘0’,‘1’)
3)面向 ASIC的库
4) WORK库(默认库)
5)用户定义库
49
4、库及程序包的使用
库及程序包的说明总是放在实体单元前面,
默认库及程序包可不作说明。用关健字 library
说明要使用的库,用关健字 use 说明要使用的
库中的程序包。
库及程序包的作用范围:仅限于所说明的设
计实体。
每一个设计实体都必须有自已完整的库及程
序包说明语句。
50
库、程序包
实体( Entity)
结构体
( Architecture)
进程
或其它并行结构
配置( Configuration)
51
库的使用语法,
程序包的使用有两种常用格式,
例,
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.conv_integer;
library 库名;
use 库名.程序包名.项目名
use 库名.程序包名,All;
52
2 选 1 选择器,
53
2选 1的另一种描述
54
四类语言要素,
数据对象( Data Object)
数据类型( Data Type)
操作数( Operands)
操作符( Operator)
§ 3.3 VHDL语言要素
55
一,VHDL文字规则
1、数字型文字
1)整数文字:十进制整数
如,5,678,156E2( =15600),
45_234_287 ( =45234287)
2)实数文字:带小数的十进制数
如,23.34,2.0,44.99E-2( =0.4499)
8_867_551.23_909( 8867551.23909)
56
3)以数制基数表示的文字
格式,
如,10#170#( =170)
2#1111_1110#( =254)
16#E#E1( =2#1110_0000# =224)
或:( =14× 16=224)
16#F.01#E+2
( =(15+1/(16× 16))× 16× 16=3841.00)
基数 #数字文字 #E指数
57
4)物理量文字
如,60 s,100 m,177 mA
注:整数可综合实现;
实数一般不可综合实现;
物理量不可综合实现;
58
2、字符串型文字(文字串和数字串)
按字符个数多少分为,
字符:用单引号引起来的 ASCII字符,可以
是数值,也可以是符号或字母。
如,‘ A?,‘ *’, ‘ Z?
字符串:用双引号引起来的一维字符数组
59
字符串分为,
1)文字字符串,? 文字 ?
如,? ERROR”,
? XXXXXXXX”,
? ZZZZZZZZ”,
? X”,
? BOTH S AND Q EQUAL TO L”。
60
2)数位字符串,
称为位矢量,代表二进制、八进制、十六进
制的数组。其位矢量的长度为等值的二进制数的
位数。
格式,
其中基数符号有三种,
B:二进制基数符号。
O:八进制基数符号,每一个八进制数
代表一个 3位的二进制数。
基数符号,数值”
61
X:十六进制基数符号,每一个十六进制数代表
一个 4位的二进制数。
如,
B“1_1101_1110”:二进制数数组,长度为 9
O“34”, 八进制数数组,长度为 6
X“1AB”,十六进制数数组,长度为 12
62
基本标识符的要求( 87标准),
? 以英文字母开头;
? 不连续使用下划线 ? _”;
? 不以下划线 ? _”结尾;
? 由 26个大小写英文字母、数字 0-9及
下划线 ? _”组成的字符串。
3、标识符
定义常数、变量、信号、端口、子程序或
参数的名字。
63
基本标识符中的英文字母不分大小写;
VHDL的保留字不能作为标识符使用。
合法标识符
_Decoder_1,
2FFT,
Sig_#N,
Not-Ack,
ALL_RST_,
data__BUS,
return,
entity
my_counter,
Decoder_1,
FFT,
Sig_N,
Not_Ack,
State0,
entity1
不合法标识符
64
扩展标识符( 93标准),
以反斜杠来界定,免去了 87标准中基本标
识符的一些限制。
可以以数字打头,
允许包含图形符号,
允许使用 VHDL保留字,
区分字母大小写等。
如,\74LS163\,\Sig_#N\,
\entity\,\ENTITY\
65
4、下标名及下标段名
下标名:用于指示数组型变量或信号的某一个
元素。
格式,
下标段名:用于指示数组型变量或信号的某一
段元素。
格式,
如,a, std_logic_vector(7 downto 0)
a(7),a(6)… a(0)
a(7downto0),a(7 downto 4),a(5 downto 3)…
标识符(表达式)
标识符(表达式 to/downto 表达式)
66
二、数据对象
三种对象:常量( Constant)
变量( Variable)
信号( Signal)
三种对象的物理含义,
?常量代表数字电路中的电源、地、恒定逻
辑值等常数;
?变量代表暂存某些值的载体,常用于描述
算法;
?信号代表物理设计中的某一条硬件连接线,
包括输入、输出端口。
67
三种对象的特点及说明场合,
信号:全局量,用于 architecture,
package,entitiy。
变量:局部量,用于 process,function,
procedure。
常量:全局量,可用于上面两种场合。
68
1、常量说明
常量说明:对某一个常量名赋予一个固定的值。
格式,
例,
constant data:bit_vector(3 downto 0):=“1010”
constant width,integer,= 8;
constant x,new_bit,= ?x?;
常量数据类型必须与表达式的数据类型一致。
constant 常数名:数据类型,= 表达式;
69
常量的可视性(作用范围),
库、程序包
实体( Entity)
结构体 1
进 程 1
结构体 2
进 程 2
常量是全
局量,其
作用范围
取决于常
量被定义
的位置。
70
2、变量说明
变量是一个局部量,只能在进程和子程序中
定义、使用 。其作用范围仅限于定义了变量的进
程和子程序中。
格式,
例,
variable a,b, bit;
variable count:integer range 0 to 255:= 10;
变量的初值可用于仿真,但综合时被忽略。
variable 变量名:数据类型 约束条件,= 表达式;
71
3、信号说明
电子硬件系统运行的基本特性,
各部分电路工作的并行特性;
信号传输过程中的延时特性;
多驱动源的总线特性;
时序电路中触发器的记忆特性等。
信号是电子系统内部硬件连接和硬件特性的
抽象表示。用来描述硬件系统的基本特性。
格式,
signal 信号名:数据类型 约束条件:= 表达式;
72
例,
signal a,b, bit;
signal init, integer,= -1;
signal s1,std_logic,= ?0?;
signal s2,std_logic_vector(15 downto 0);
注,a,综合时初值被忽略。
b,信号是全局量。可在结构体、实体、块中
说明和使用信号。
c,在进程和子程序中只能使用信号,不能说
明信号。
73
例:进程中信号与变量的使用
entity ex is
port(…,.);
end ex;
architecture arch_ex of ex is
signal a,b,std_logic;
begin
process(a,b)
variable c,d, std_logic;
begin
c:= a + b;
d:= a - b;
……
end process;
end arch_ex;
74
信号与端口的区别,
除没有方向说明外,信号与 实体的 ? 端
口
( PORT) ? 概念相似。端口是一种隐形的信号。
entity exam is
port([signal] a,b,in std_logic;
[signal] c,out std_logic);
end exam;
端口是一种有方向的信号。即输出端口不能
读出数据,只能写入数据;输入端口不能写入数
据,只能读出数据。
信号本身无方向,可读可写。
75
三,VHDL数据类型
VHDL是一种强数据类型语言。
要求设计实体中的每一个常数、信号、变量,
函数以及设定的各种参量都必须具有确定的数据类
型,并且相同数据类型的量才能互相传递和作用。
VHDL数据类型分为四大类,
? 标量类型( SCALAR TYPE);
? 复合类型( COMPOSITE TYPE);
? 存取类型( ACCESS TYPE);
? 文件类型( FILES TYPE)
76
又分为,
? 预定义数据类型,
? 用户自定义数据类型
1,VHDL的预定义数据类型
1)布尔量( boolean)
布尔量具有两种状态,false 和 true
常用于逻辑函数,如相等( =)、比较( <)
等中作逻辑比较。
如,bit 值转化成 boolean 值,
boolean_var,= (bit_var = ?1?);
77
2)位( bit)
bit 表示一位的信号值。
放在单引号中,如 ‘ 0’ 或 ‘ 1’ 。
3) 位矢量 ( bit_vector)
bit_vector 是用双引号括起来的一组位数据。
如,? 001100? X“00B10B”
4)字符( character)
用单引号将字符括起来。
variable character_var, character;
,..,.,
Character_var, = ?A?;
78
5)整数( integer)
integer 表示所有正的和负的整数。硬件实现时,
利用 32位的位矢量来表示。可实现的整数范围为,
-( 231-1) to (231-1)
VHDL综合器要求对具体的整数作出范围限定,
否则无法综合成硬件电路。
如,signal s, integer range 0 to 15;
信号 s 的取值范围是 0-15,可用 4位二进制数表
示,因此 s 将被综合成由四条信号线构成的信号。
79
6)自然数( natural)和 正整数( positive)
natural是 integer的子类型,表示非负整数。
positive是 integer的子类型,表示正整数。
定义如下,
subtype natural is integer range 0 to
integer?high;
subtype positive is integer range 1 to
integer?high;
80
7)实数( REAL)
或称浮点数
取值范围,-1.0E38 - +1.0E38
实数类型仅能用于 VHDL仿真器,一般综合器
不支持。
8) 字符串( string)
string 是 character 类型的一个非限定
数组。用双引号将一串字符括起来。如,
variable string_var, string(1 to 7);
……
string_var,=,Rosebud”;
81
9)时间( TIME)
由整数和物理单位组成
如,55 ms,20 ns
10)错误等级( SEVERITY_LEVEL)
仿真中用来指示系统的工作状态,共有四种,
NOTE(注意),
WARNING(警告),
ERROR(出错),
FAILURE(失败)
82
2,IEEE预定义标准逻辑位与矢量
1) std_logic 类型
由 ieee 库中的 std_logic_1164 程序
包定义,为九值逻辑系统,如下,
( ‘ U?,‘ X?,‘ 0?,‘ 1?,‘ Z?,‘ W?,‘ L?,
‘ H?,‘ -?)
‘ U?:未初始化的,‘ X?:强未知的,
‘ 0?:强 0,‘ 1?:强 1,
‘ Z?:高阻态,‘ W?:弱未知的,
‘ L?:弱 0,‘ H?:弱 1,
‘ -?:忽略
83
由 std_logic 类型代替 bit 类型可以完成电
子系统的精确模拟,并可实现常见的三态总线电路。
2) std_logic_vector 类型
由 std_logic 构成的数组。定义如下,
type std_logic_vector is array(natural
range<>) of std_logic;
赋值的原则:相同位宽,相同数据类型。
84
3、用户自定义类型
用户自定义类型是 VHDL语言的一大特色。
可由用户定义的数据类型有,
? 枚举类型,
? 整数和实数类型,
? 数组类型,
? 记录类型,
? 子类型
85
用类型定义语句 TYPE和子类型定义语句
SUBTYPE实现用户自定义数据类型。
TYPE语句格式,
例,type byte is array(7 downto 0) of bit;
variable addend, byte;
type week is (sun,mon,tue,wed,thu,
fri,sat);
type 数据类型名 is 数据类型定义 [of 基本数据类型 ];
86
SUBTYPE语句格式,
例,
subtype digits is integer range 0 to 9;
由 subtype 语句定义的数据类型称为子类型。
subtype 子类型名 is 基本数据类型 约束范围;
87
1)枚举类型
枚举该类型的所有可能的值。格式,
如,type std_logic is(?U?,‘ X?,‘ 0?,‘ 1?,
‘ Z?,‘ W?,‘ L?,‘ H?,‘ -?)
如,type color is(blue,green,yellow,red);
type my_logic is (?0?,?1?,?U?,?Z?);
variable hue, color;
signal sig, my_logic;
hue,= blue; sig <= ?Z?;
type 类型名称 is (枚举文字 {,枚举文字 });
88
枚举类型的编码,
综合器自动实现枚举类型元素的编码,一
般将第一个枚举量(最左边)编码为 0,以后的
依次加 1。编码用位矢量表示,位矢量的长度
将取所需表达的所有枚举元素的最小值。
如,type color is(blue,green,yellow,red);
编码为,blue=“00”;
green=“01”;
yellow=“10”;
red=“11”;
89
2)整数类型
用户定义的整数类型是标准包中整数类型的
子范围。格式,
例,type my_integer is integer range 0 to 9;
3)数组类型
数组,同类型元素的集合。 VHDL支持多维数组。
多维数组的声明,
type byte is array(7 downto 0) of bit;
type vector is array(3 downto 0) of byte;
限定数组、非限定数组、属性,
type 类型名称 is range 整数范围;
90
限定数组,
其索引范围有一定的限制。
格式,
非限定数组,数组索引范围被定义成一个类型范围。
格式,
例,type bit_vector is array(integer range <>)
of bit;
variable my_vector:bit_vector (5 downto -5);
type 数组名 is array(数组范围 ) of 数据 类型;
type 数组名 is array(类型名称 range <>) of 数据类型;
91
属性,
VHDL为多种类型定义了属性。
语法如下,
对象 ’ 属性
VHDL为数组预先定义的属性,
left right
high low
length range
reverse_range
92
对应变量,
variable my_vector, bit_vector (5 downto -5);
各属性如下,
my_vector?left 5
my_vector?right -5
my_vector?high 5
my_vector?low -5
my_vector?length 11
my_vector?range (5 downto -5)
my_vector?reverse_range (-5 to 5)
93
4)记录类型
记录是不同类型的名称域的集合。
格式如下,
访问记录体元素的方式:记录体名,元素名
type 记录类型名 is record
元素名:数据类型名;
元素名:数据类型名;
┇
end record;
94
例,
constant len:integer:= 8 ;
subtype byte_vec is bit_vector(len-1 downto 0);
type byte_and_ix is record
byte, byte_vec;
ix, integer range 0 to len;
end record ;
signal x,y,z, byte_and_ix ;
signal data, byte_vec ;
signal num, integer ;
……,
x.byte <=,11110000” ;
x.ix <= 2 ;
data <= y.byte ;
num <= y.ix ;
z <= x ;
95
5)子类型
子类型是已定义的类型或子类型的一个子集。
格式,
例,
bit_vector 类型定义如下,
type bit_vector is array (natural range <>)
of bit;
如设计中只用 16bit;可定义子类型如下,
subtype my_vector is bit_vector(0 to 15);
注:子类型与基(父)类型具有相同的操作符和子
程序。可以直接进行赋值操作。
subtype 子类型名 is 数据类型名 [范围 ];
96
4、数据类型转换
VHDL是一种强类型语言,不同类型的数据
对象必须经过类型转换,才能相互操作。
1)类型转换函数方式
通过调用类型转换函数,使相互操作的数据对
象的类型一致,从而完成相互操作。
97
library ieee;
library dataio;
use ieee.std_logic_1164.all;
use dataio.std_logic_ops.all;
entity cnt4 is
port(clk,in std_logic;
p,inout std_logic_vector(3 downto 0);
end cnt4;
architecture behv of cnt4 is
begin
process(clk)
begin
if clk?event and clk=?1? then
p<=to_vector(2,to_integer(p)+1);
end if;
end process;
end behv;
98
99
2)直接类型转换方式
对相互间非常关联的数据类型(如整型、浮
点型),可进行直接类型转换。格式,
数据类型标识符(表达式)
如,variable a,b, real;
variable c,d, integer;
……
a:= real( c) ;
d:= integer( b) ;
100
四,VHDL中的表达式
表达式,由操作符和操作数构成,完成算术或
逻辑运算。
1、操作符
? VHDL操作符的分类,
? 逻辑操作符( Logical Operator),
? 关系操作符( Relational Operator),
? 算术操作符( Arithmetic Operator),
? 重载操作符( Overloading Operator)
101
1)逻辑操作符
6种,and,or,nand,nor,xor,not
要求:操作数类型必须相同。可为如下类型,
bit,bit_vector,std_logic,
std_logic_vector,boolean
数组操作数的维数、大小必须相同。
注:当有两个以上的逻辑表达式时,左右没有
优先级差别,必须使用括号,如,
x<=( a and b )or( not c and d );
例外:当逻辑表达式中只有 ? and”,? or”,
? xor”运算符时,可以省略括号。如,
102
a <= b and c and d and e;
a <= b or c or d or e;
a <= b xor c xor d xor e;
2) 关系操作符
6 种,=,/=,<,<=,>,>=
用于比较相同父类的两个操作数,返回
boolean值。
103
3)加减操作符
加操作符 ? +”、减操作符 ? -”,
串联(并置)操作符 ? &”
串联操作符 ? &”通过连接操作数来建立新的数
组。操作数可以是一个数组或数组中的一个元素。
例,signal a,d,bit_vector (3 downto );
signal b,c,g,bit_vector (1 downto 0);
signal e,bit_vector(2 downto 0);
signal f,h,i, bit;
a <= not b & not c; -- array & array
d <= not e & not f; -- array & element
g <= not h & not i; -- element & element
104
4) 一元操作符
仅有一个操作数的操作符。
包括,? +”,? -”
5) 乘除操作符
用于整数类型,? *?, ? /”,? mod”、
? rem”
综合的限制, ? /”,? mod”,? rem” 三种操
作
符的右操作数必须为 2 的正整数次幂,即 2n。
实际电路用移位实现。
105
2、操作数
操作数,
操作符进行运算时所需的数据。
操作数的种类,
标志符;集合;属性;表达式;函数
调用;索引名;文字;限定表达式;记
录和域;片段名;类型转换
106
3、重载操作符
VHDL是强类型语言,相同类型的操作数才能进行
操作。 VHDL自身定义的算术和布尔函数仅对内部数据
类型( standard 程序包中的数据类型)有效。即,
算术运算符 +,-,<,>,<=,>= 仅对 integer类型有
效。逻辑运算符 AND,OR,NOT仅对 bit 类型有效。
如,variable a,b,c, integer;
variable x,y,z, bit;
c,= a + b;
z,= x and y;
问题,a,b,c 与 x,y,z 之间,或与 std_logic
等其它数据类型之间能否相互操作?
107
重载操作符定义,
对已存在的操作符重新定义,使其能进行不
同类型操作数之间的运算,称为重载操作符。定
义重载操作符的函数称为重载函数。
重载操作符由原操作符加双引号表示。如
? +”
重载操作符的定义见 IEEE 库的程序包,
std_logic_arith,
std_logic_unsigned,
std_logic_signed
108
109
重载操作符的使用,
110
第 3章 习题一
1,VHDL的优点是什么?
2,VHDL中最基本的结构是什么?其作用各是什么?
3、说明 inout,out 和 buffer有何异同点。
4、什么是重载运算符,重载函数有何作用?
5,VHDL中有哪 3种数据对象?详细说明它们的功
能特点以及使用方法。
6、表达式 c <= a + b 中,a,b和 c的数据类型
都是 std_logic_vector,是否能直接进行加
法运算?说明原因和解决方法。
第三章 硬件描述语言( VHDL)
2
VHDL,
VHSIC (Very High Speed Integrated
Circuit)
Hardware
Description
Language
§ 3.1 概述
一、什么是 VHDL?
3
80年代初由美国国防部在实施超高速集成电
路( VHSIC)项目时开发的。
1987年由 IEEE 协会批准为 IEEE 工业标准,
称为 IEEE1076-1987。
各 EDA公司相继推出支持 VHDL的设计环境。
1993年被更新为 93 标准,即 IEEE1076-1993。
进一步提高抽象描述层次,扩展系统描述能力。
二,VHDL的历史
4
1,VHDL打破软、硬件的界限
传统的数字系统设计分为,
硬件设计(硬件设计人员)
软件设计(软件设计人员)
VHDL是电子系统设计者和 EDA工具之
间的界面。
三,VHDL的作用
EDA工具及 HDL的流行,使电子系统向集
成化、大规模和高速度等方向发展。
美国硅谷约有 80%的 ASIC和 FPGA/CPLD
已采用 HDL进行设计。
5
2,VHDL与 C,C++的比较,
C,C++ 代替汇编等语言
VHDL 代替原理图、逻辑状态图等
3,VHDL与电原理图描述的比较,
VHDL具有较强的抽象描述能力,可进行系统
行为级别的描述。描述简洁,效率高。
VHDL描述与实现工艺无关。
电原理图描述需给出完整、具体的电路结构
图,不能进行抽象描述。描述繁杂,效率低。
电原理图描述与实现工艺有关。
6
1,VHDL具有强大的语言结构,系统硬件描述能
力强、设计效率高;具有较高的抽象描述能力。
如:一个可置数的 16位计数器的电原理图,
四,VHDL语言特点
7
用 VHDL描述的可置数 16位计数器,
8
2,VHDL语言可读性强,易于修改和发现错误。
3,VHDL具有丰富的仿真语句和库函数,可对
VHDL源代码进行早期功能仿真,有利于大
系统的设计与验证。
4,VHDL设计与硬件电路关系不大。
5,VHDL设计不依赖于器件,与工艺无关 。
6、移植性好。
7,VHDL体系符合 TOP-DOWN和 CE(并行工程)设计
思想。
8,VHDL设计效率高,产品上市时间快,成本低。
9、易于 ASIC实现。
9
五,VHDL与其它硬件描述语言的比较
VHDL,
具有较强的系统级抽象描述能力,适
合行为级和 RTL级的描述。设计者可不必
了解电路细节,所作工作较少,效率高。
但对综合器的要求高,不易控制底层电路
的生成。 IEEE标准,支持广泛。
行为级 RTL级 门电路级
RTL,Register Translate Level
10
Verilog HDL,
系统级抽象描述能力比 VHDL稍差;门级开
关电路描述方面比 VHDL 强。适合 RTL级和门
电路级的描述。设计者需要了解电路细节,所
作工作较多。 IEEE标准,支持广泛。
ABEL,PALASM,AHDL(Altera HDL),
系统级抽象描述能力差,一般作门级 电
路描述。要求设计者对电路细节有详细的了解。
对综合器的性能要求低,易于控制电路资源。
支持少。
11
VHDL主要用于描述数字系统的结构、行
为、功能和接口。
VHDL将一个设计(元件、电路、系统)
分为,
外部(可视部分、端口)
内部(不可视部分、内部功能、算法)
六,VHDL设计简述
12
外部与内部,
器件或
子系统
ARCHITECTURE
Process Process
ENTITY
Sequential
Process
Combinational
Process ports ports
component
ports ports
13
2选 1选择器的 VHDL描述,
14
? VHDL语言由保留关键字组成;
? 一般,VHDL语言对字母大小写不敏感;
例外,‘ ’, ? ? 所括的字符、字符串;
? 每条 VHDL语句由一个分号(;)结束;
? VHDL语言对空格不敏感,增加可读性;
? 在 ? --”之后的是 VHDL的注释语句;
? VHDL有以下描述风格,
行为描述;
数据流(寄存器传输 RTL)描述;
结构化描述;
VHDL语言的一些基本特点,
15
基本结构包括,
? 实体( Entity)
? 结构体( Architecture)
? 配置( Configuration)
? 库( Library),程序包( Package)
§ 3.2 VHDL程序基本结构
16
库、程序包
实体( Entity)
结构体
( Architecture)
进程
或其它并行结构
配置( Configuration)
17
一、实体(说明)
实体(说明),
定义系统的输入输出端口
语法,
ENTITY <entity_name> IS
Generic Declarations
Port Declarations
END <entity_name>; (1076-1987 version)
END ENTITY <entity_name> ; ( 1076-1993
version)
18
1、类属说明
类属说明,
确定实体或组件中定义的局部常数。模
块化设计时多用于不同层次模块之间信息的
传递。可从外部改变内部电路结构和规模。
类属说明必须放在端口说明之前。
Generic (
常数名称:类型 [,= 缺省值 ]
{常数名称:类型 [,= 缺省值 ]}
);
19
类属常用于定义,
实体端口的大小,
设计实体的物理特性,
总线宽度,
元件例化的数量等。
例,
entity mck is
generic(width,integer:=16);
port(add_bus:out std_logic_vector
(width-1 downto 0));
…
20
例,2输入与门的实体描述
entity and2 is
generic(risewidth,time:= 1 ns;
fallwidth,time:= 1 ns);
port(a1,in std_logic;
a0,in std_logic;
z0,out std_loigc);
end entity and2;
注:数据类型 time 用于仿真模块的设计。
综合器仅支持数据类型为整数的类属值。
21
其中,端口模式,
in,输入型,此端口为只读型。
out,输出型,只能在实体内部对其赋值。
inout:输入输出型,既可读也可赋值。
buffer,缓冲型,与 out 相似,但可读。
Port (
端口名称 {,端口名称 }:端口模式 数据类型;
…
端口名称 {,端口名称 }:端口模式 数据类型
);
2、端口声明
端口声明:确定输入、输出端口的数目和类型。
22
out 和 buffer 的区别,
inout 和 buffer 的区别,
23
指端口上流动的数据的表达格式。为预先定
义好的数据类型。
如,bit,bit_vector,integer,
std_logic,std_logic_vector 等。
例,
entity nand2 is entity m81 is
port ( port(
a,b:in bit; a:in bit_vector(7 downto 0);
z,out bit sel:in bit_vector(2 downto 0);
) ; b:out bit);
end entity nand2; end entity m81;
3、数据类型,
24
作用:定义系统(或模块)的行为、元件及内部
的连接关系,即描述其逻辑功能。
两个组成部分,
? 对数据类型、常数、信号、子程序、元件等
元素的 说明 部分。
? 以各种不同的描述风格描述的系统的逻辑功
能实现的部分。常用的描述风格有:行为描
述、数据流描述,结构化描述。
二、结构体
25
结
构
体
结
构
体
说
明
结
构
体
功
能
描
述
常数说明
数据类型说明
信号说明
例化元件说明
子程序说明
块语句
进程语句
信号赋值语句
子程序调用语句
元件例化语句
26
实体与结构体的关系,
设计实体
结构体 1
结构体 2
结构体 3
结构体 n
。
。
。
一个设计实体可有多个结构体,代表实体
的多种实现方式。各个结构体的地位相同。
27
注:同一实体的结构体不能同名。定义语句中的
常数、信号不能与实体中的端口同名。
architecture 结构体名称 of 实体名称 is
[说明语句 ]内部信号、常数,
数据类型、子程序(函数、过程),
元件等的说明;
begin
[并行处理(功能描述)语句 ];
end [architecture] 结构体名称;
结构体的语法,
28
例:结构体中错误的信号声明
29
例:一个完整描述( 3 bit 计数器)
30
3bit计数器的等效描述( out与 buffer的区别),
31
三、配置
设计实体
结构体 1
结构体 2
结构体 3
结构体 n
。
。
。 一个设计实体的多
种实现方式
配置:从某个实体的多种结构体描述方式中选择
特定的一个。
32
configuration 配置名 of 实体名 is
for 选配结构体名
end for ;
end 配置名;
简单配置的语法,
33
library ieee;
use ieee.std_logic_1164.all;
entity nand is
port(a,in std_logic;
b,in std_logic;
c,out std_logic);
end entity nand;
architecture art1 of nand is
begin
c<=not (a and b);
end architecture art1;
例:一个与非门不同实现方式的配置如下,
34
architecture art2 of nand is
begin
c<=?1? when (a=?0?) and (b=?0?) else
?1? when (a=?0?) and (b=?1?) else
?1? when (a=?1?) and (b=?0?) else
?0? when (a=?1?) and (b=?1?) else
?0?;
end architecture art2;
35
configuration first of nand is
for art1;
end for;
end first;
configuration second of nand is
for art2
end for;
end second;
36
例:一个对计数器实现多种形式的配置如下,
37
38
程序包,
已定义的常数、数据类型、元件调用说明、
子程序的一个集合。
目的:方便公共信息、资源的访问和共享。
库,
多个程序包构成库。
四,程序包、库
39
程序包说明的内容,
常量说明;
VHDL数据类型说明;
元件说明;
子程序说明;
程序包的结构包括,
程序包说明(包首)
程序包主体(包体)
40
包声明项可由以下语句组成,
use 语句(用来包括其它程序包);
类型说明;子类型说明;常量说明;
信号说明;子程序说明;元件说明。
package 程序包名 is
{ 包说明项 }
end 程序包名;
1、程序包说明(包首)
语法,
41
例:程序包说明
42
包体说明项可含,
use 语句;子程序 说 明; 子程序主体 ;
类型 说 明;子类型 说 明;常量 说 明。
package body 程序包名 is
{ 包体说明项 }
end 程序包名;
2、程序包包体
程序包的内容:子程序的实现算法。
包体语法,
43
程序包首与程序包体的关系,
程序包体并非必须,只有在程序包中要说明
子程序时,程序包体才是必须的。
程序包首可以独立定义和使用。如下,
44
package seven is
subtype segments is bit_vector(0 to 6);
type bcd is range 0 to 9;
end seven;
library work;
use work.seven.all;
entity decoder is
port(input,in bcd;
drive,out segments);
end decoder;
architecture art of decoder is
begin
45
with input select
drive<=B“1111110” when 0,
B“0110000” when 1,
B“1101101” when 2,
B“1111001” when 3,
B“0110011” when 4,
B“1011011” when 5,
B“1011111” when 6,
B“1110000” when 7,
B“1111111” when 8,
B“1111011” when 9,
B“0000000” when others;
end architecture art;
a
b
c
d
e
f
g
46
3、库的种类
VHDL库可分为 5种,
1) IEEE 库
定义了四个常用的程序包,
? std_logic_1164 (std_logic types &
related functions)
? std_logic_arith (arithmetic functions)
? std_logic_signed (signed arithmetic
functions)
? std_logic_unsigned (unsigned
arithmetic functions)
47
Type STD_LOGIC,
9 logic value system (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,
‘L’,‘H’,‘-’)
? ‘W’,‘L’,‘H” weak values (Not supported
by Synthesis)
? ‘X’ - (not ‘x’)used for unknown
? ‘Z’ - (not ‘z’) used for tri-state
? ‘-’ Don’t Care
48
2) STD 库(默认库)
库中程序包为,standard,
定义最基本的数据类型,
Bit,bit_vector, Boolean,
Integer,Real,and Time
注,Type Bit
2 logic value system (‘0’,‘1’)
3)面向 ASIC的库
4) WORK库(默认库)
5)用户定义库
49
4、库及程序包的使用
库及程序包的说明总是放在实体单元前面,
默认库及程序包可不作说明。用关健字 library
说明要使用的库,用关健字 use 说明要使用的
库中的程序包。
库及程序包的作用范围:仅限于所说明的设
计实体。
每一个设计实体都必须有自已完整的库及程
序包说明语句。
50
库、程序包
实体( Entity)
结构体
( Architecture)
进程
或其它并行结构
配置( Configuration)
51
库的使用语法,
程序包的使用有两种常用格式,
例,
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.conv_integer;
library 库名;
use 库名.程序包名.项目名
use 库名.程序包名,All;
52
2 选 1 选择器,
53
2选 1的另一种描述
54
四类语言要素,
数据对象( Data Object)
数据类型( Data Type)
操作数( Operands)
操作符( Operator)
§ 3.3 VHDL语言要素
55
一,VHDL文字规则
1、数字型文字
1)整数文字:十进制整数
如,5,678,156E2( =15600),
45_234_287 ( =45234287)
2)实数文字:带小数的十进制数
如,23.34,2.0,44.99E-2( =0.4499)
8_867_551.23_909( 8867551.23909)
56
3)以数制基数表示的文字
格式,
如,10#170#( =170)
2#1111_1110#( =254)
16#E#E1( =2#1110_0000# =224)
或:( =14× 16=224)
16#F.01#E+2
( =(15+1/(16× 16))× 16× 16=3841.00)
基数 #数字文字 #E指数
57
4)物理量文字
如,60 s,100 m,177 mA
注:整数可综合实现;
实数一般不可综合实现;
物理量不可综合实现;
58
2、字符串型文字(文字串和数字串)
按字符个数多少分为,
字符:用单引号引起来的 ASCII字符,可以
是数值,也可以是符号或字母。
如,‘ A?,‘ *’, ‘ Z?
字符串:用双引号引起来的一维字符数组
59
字符串分为,
1)文字字符串,? 文字 ?
如,? ERROR”,
? XXXXXXXX”,
? ZZZZZZZZ”,
? X”,
? BOTH S AND Q EQUAL TO L”。
60
2)数位字符串,
称为位矢量,代表二进制、八进制、十六进
制的数组。其位矢量的长度为等值的二进制数的
位数。
格式,
其中基数符号有三种,
B:二进制基数符号。
O:八进制基数符号,每一个八进制数
代表一个 3位的二进制数。
基数符号,数值”
61
X:十六进制基数符号,每一个十六进制数代表
一个 4位的二进制数。
如,
B“1_1101_1110”:二进制数数组,长度为 9
O“34”, 八进制数数组,长度为 6
X“1AB”,十六进制数数组,长度为 12
62
基本标识符的要求( 87标准),
? 以英文字母开头;
? 不连续使用下划线 ? _”;
? 不以下划线 ? _”结尾;
? 由 26个大小写英文字母、数字 0-9及
下划线 ? _”组成的字符串。
3、标识符
定义常数、变量、信号、端口、子程序或
参数的名字。
63
基本标识符中的英文字母不分大小写;
VHDL的保留字不能作为标识符使用。
合法标识符
_Decoder_1,
2FFT,
Sig_#N,
Not-Ack,
ALL_RST_,
data__BUS,
return,
entity
my_counter,
Decoder_1,
FFT,
Sig_N,
Not_Ack,
State0,
entity1
不合法标识符
64
扩展标识符( 93标准),
以反斜杠来界定,免去了 87标准中基本标
识符的一些限制。
可以以数字打头,
允许包含图形符号,
允许使用 VHDL保留字,
区分字母大小写等。
如,\74LS163\,\Sig_#N\,
\entity\,\ENTITY\
65
4、下标名及下标段名
下标名:用于指示数组型变量或信号的某一个
元素。
格式,
下标段名:用于指示数组型变量或信号的某一
段元素。
格式,
如,a, std_logic_vector(7 downto 0)
a(7),a(6)… a(0)
a(7downto0),a(7 downto 4),a(5 downto 3)…
标识符(表达式)
标识符(表达式 to/downto 表达式)
66
二、数据对象
三种对象:常量( Constant)
变量( Variable)
信号( Signal)
三种对象的物理含义,
?常量代表数字电路中的电源、地、恒定逻
辑值等常数;
?变量代表暂存某些值的载体,常用于描述
算法;
?信号代表物理设计中的某一条硬件连接线,
包括输入、输出端口。
67
三种对象的特点及说明场合,
信号:全局量,用于 architecture,
package,entitiy。
变量:局部量,用于 process,function,
procedure。
常量:全局量,可用于上面两种场合。
68
1、常量说明
常量说明:对某一个常量名赋予一个固定的值。
格式,
例,
constant data:bit_vector(3 downto 0):=“1010”
constant width,integer,= 8;
constant x,new_bit,= ?x?;
常量数据类型必须与表达式的数据类型一致。
constant 常数名:数据类型,= 表达式;
69
常量的可视性(作用范围),
库、程序包
实体( Entity)
结构体 1
进 程 1
结构体 2
进 程 2
常量是全
局量,其
作用范围
取决于常
量被定义
的位置。
70
2、变量说明
变量是一个局部量,只能在进程和子程序中
定义、使用 。其作用范围仅限于定义了变量的进
程和子程序中。
格式,
例,
variable a,b, bit;
variable count:integer range 0 to 255:= 10;
变量的初值可用于仿真,但综合时被忽略。
variable 变量名:数据类型 约束条件,= 表达式;
71
3、信号说明
电子硬件系统运行的基本特性,
各部分电路工作的并行特性;
信号传输过程中的延时特性;
多驱动源的总线特性;
时序电路中触发器的记忆特性等。
信号是电子系统内部硬件连接和硬件特性的
抽象表示。用来描述硬件系统的基本特性。
格式,
signal 信号名:数据类型 约束条件:= 表达式;
72
例,
signal a,b, bit;
signal init, integer,= -1;
signal s1,std_logic,= ?0?;
signal s2,std_logic_vector(15 downto 0);
注,a,综合时初值被忽略。
b,信号是全局量。可在结构体、实体、块中
说明和使用信号。
c,在进程和子程序中只能使用信号,不能说
明信号。
73
例:进程中信号与变量的使用
entity ex is
port(…,.);
end ex;
architecture arch_ex of ex is
signal a,b,std_logic;
begin
process(a,b)
variable c,d, std_logic;
begin
c:= a + b;
d:= a - b;
……
end process;
end arch_ex;
74
信号与端口的区别,
除没有方向说明外,信号与 实体的 ? 端
口
( PORT) ? 概念相似。端口是一种隐形的信号。
entity exam is
port([signal] a,b,in std_logic;
[signal] c,out std_logic);
end exam;
端口是一种有方向的信号。即输出端口不能
读出数据,只能写入数据;输入端口不能写入数
据,只能读出数据。
信号本身无方向,可读可写。
75
三,VHDL数据类型
VHDL是一种强数据类型语言。
要求设计实体中的每一个常数、信号、变量,
函数以及设定的各种参量都必须具有确定的数据类
型,并且相同数据类型的量才能互相传递和作用。
VHDL数据类型分为四大类,
? 标量类型( SCALAR TYPE);
? 复合类型( COMPOSITE TYPE);
? 存取类型( ACCESS TYPE);
? 文件类型( FILES TYPE)
76
又分为,
? 预定义数据类型,
? 用户自定义数据类型
1,VHDL的预定义数据类型
1)布尔量( boolean)
布尔量具有两种状态,false 和 true
常用于逻辑函数,如相等( =)、比较( <)
等中作逻辑比较。
如,bit 值转化成 boolean 值,
boolean_var,= (bit_var = ?1?);
77
2)位( bit)
bit 表示一位的信号值。
放在单引号中,如 ‘ 0’ 或 ‘ 1’ 。
3) 位矢量 ( bit_vector)
bit_vector 是用双引号括起来的一组位数据。
如,? 001100? X“00B10B”
4)字符( character)
用单引号将字符括起来。
variable character_var, character;
,..,.,
Character_var, = ?A?;
78
5)整数( integer)
integer 表示所有正的和负的整数。硬件实现时,
利用 32位的位矢量来表示。可实现的整数范围为,
-( 231-1) to (231-1)
VHDL综合器要求对具体的整数作出范围限定,
否则无法综合成硬件电路。
如,signal s, integer range 0 to 15;
信号 s 的取值范围是 0-15,可用 4位二进制数表
示,因此 s 将被综合成由四条信号线构成的信号。
79
6)自然数( natural)和 正整数( positive)
natural是 integer的子类型,表示非负整数。
positive是 integer的子类型,表示正整数。
定义如下,
subtype natural is integer range 0 to
integer?high;
subtype positive is integer range 1 to
integer?high;
80
7)实数( REAL)
或称浮点数
取值范围,-1.0E38 - +1.0E38
实数类型仅能用于 VHDL仿真器,一般综合器
不支持。
8) 字符串( string)
string 是 character 类型的一个非限定
数组。用双引号将一串字符括起来。如,
variable string_var, string(1 to 7);
……
string_var,=,Rosebud”;
81
9)时间( TIME)
由整数和物理单位组成
如,55 ms,20 ns
10)错误等级( SEVERITY_LEVEL)
仿真中用来指示系统的工作状态,共有四种,
NOTE(注意),
WARNING(警告),
ERROR(出错),
FAILURE(失败)
82
2,IEEE预定义标准逻辑位与矢量
1) std_logic 类型
由 ieee 库中的 std_logic_1164 程序
包定义,为九值逻辑系统,如下,
( ‘ U?,‘ X?,‘ 0?,‘ 1?,‘ Z?,‘ W?,‘ L?,
‘ H?,‘ -?)
‘ U?:未初始化的,‘ X?:强未知的,
‘ 0?:强 0,‘ 1?:强 1,
‘ Z?:高阻态,‘ W?:弱未知的,
‘ L?:弱 0,‘ H?:弱 1,
‘ -?:忽略
83
由 std_logic 类型代替 bit 类型可以完成电
子系统的精确模拟,并可实现常见的三态总线电路。
2) std_logic_vector 类型
由 std_logic 构成的数组。定义如下,
type std_logic_vector is array(natural
range<>) of std_logic;
赋值的原则:相同位宽,相同数据类型。
84
3、用户自定义类型
用户自定义类型是 VHDL语言的一大特色。
可由用户定义的数据类型有,
? 枚举类型,
? 整数和实数类型,
? 数组类型,
? 记录类型,
? 子类型
85
用类型定义语句 TYPE和子类型定义语句
SUBTYPE实现用户自定义数据类型。
TYPE语句格式,
例,type byte is array(7 downto 0) of bit;
variable addend, byte;
type week is (sun,mon,tue,wed,thu,
fri,sat);
type 数据类型名 is 数据类型定义 [of 基本数据类型 ];
86
SUBTYPE语句格式,
例,
subtype digits is integer range 0 to 9;
由 subtype 语句定义的数据类型称为子类型。
subtype 子类型名 is 基本数据类型 约束范围;
87
1)枚举类型
枚举该类型的所有可能的值。格式,
如,type std_logic is(?U?,‘ X?,‘ 0?,‘ 1?,
‘ Z?,‘ W?,‘ L?,‘ H?,‘ -?)
如,type color is(blue,green,yellow,red);
type my_logic is (?0?,?1?,?U?,?Z?);
variable hue, color;
signal sig, my_logic;
hue,= blue; sig <= ?Z?;
type 类型名称 is (枚举文字 {,枚举文字 });
88
枚举类型的编码,
综合器自动实现枚举类型元素的编码,一
般将第一个枚举量(最左边)编码为 0,以后的
依次加 1。编码用位矢量表示,位矢量的长度
将取所需表达的所有枚举元素的最小值。
如,type color is(blue,green,yellow,red);
编码为,blue=“00”;
green=“01”;
yellow=“10”;
red=“11”;
89
2)整数类型
用户定义的整数类型是标准包中整数类型的
子范围。格式,
例,type my_integer is integer range 0 to 9;
3)数组类型
数组,同类型元素的集合。 VHDL支持多维数组。
多维数组的声明,
type byte is array(7 downto 0) of bit;
type vector is array(3 downto 0) of byte;
限定数组、非限定数组、属性,
type 类型名称 is range 整数范围;
90
限定数组,
其索引范围有一定的限制。
格式,
非限定数组,数组索引范围被定义成一个类型范围。
格式,
例,type bit_vector is array(integer range <>)
of bit;
variable my_vector:bit_vector (5 downto -5);
type 数组名 is array(数组范围 ) of 数据 类型;
type 数组名 is array(类型名称 range <>) of 数据类型;
91
属性,
VHDL为多种类型定义了属性。
语法如下,
对象 ’ 属性
VHDL为数组预先定义的属性,
left right
high low
length range
reverse_range
92
对应变量,
variable my_vector, bit_vector (5 downto -5);
各属性如下,
my_vector?left 5
my_vector?right -5
my_vector?high 5
my_vector?low -5
my_vector?length 11
my_vector?range (5 downto -5)
my_vector?reverse_range (-5 to 5)
93
4)记录类型
记录是不同类型的名称域的集合。
格式如下,
访问记录体元素的方式:记录体名,元素名
type 记录类型名 is record
元素名:数据类型名;
元素名:数据类型名;
┇
end record;
94
例,
constant len:integer:= 8 ;
subtype byte_vec is bit_vector(len-1 downto 0);
type byte_and_ix is record
byte, byte_vec;
ix, integer range 0 to len;
end record ;
signal x,y,z, byte_and_ix ;
signal data, byte_vec ;
signal num, integer ;
……,
x.byte <=,11110000” ;
x.ix <= 2 ;
data <= y.byte ;
num <= y.ix ;
z <= x ;
95
5)子类型
子类型是已定义的类型或子类型的一个子集。
格式,
例,
bit_vector 类型定义如下,
type bit_vector is array (natural range <>)
of bit;
如设计中只用 16bit;可定义子类型如下,
subtype my_vector is bit_vector(0 to 15);
注:子类型与基(父)类型具有相同的操作符和子
程序。可以直接进行赋值操作。
subtype 子类型名 is 数据类型名 [范围 ];
96
4、数据类型转换
VHDL是一种强类型语言,不同类型的数据
对象必须经过类型转换,才能相互操作。
1)类型转换函数方式
通过调用类型转换函数,使相互操作的数据对
象的类型一致,从而完成相互操作。
97
library ieee;
library dataio;
use ieee.std_logic_1164.all;
use dataio.std_logic_ops.all;
entity cnt4 is
port(clk,in std_logic;
p,inout std_logic_vector(3 downto 0);
end cnt4;
architecture behv of cnt4 is
begin
process(clk)
begin
if clk?event and clk=?1? then
p<=to_vector(2,to_integer(p)+1);
end if;
end process;
end behv;
98
99
2)直接类型转换方式
对相互间非常关联的数据类型(如整型、浮
点型),可进行直接类型转换。格式,
数据类型标识符(表达式)
如,variable a,b, real;
variable c,d, integer;
……
a:= real( c) ;
d:= integer( b) ;
100
四,VHDL中的表达式
表达式,由操作符和操作数构成,完成算术或
逻辑运算。
1、操作符
? VHDL操作符的分类,
? 逻辑操作符( Logical Operator),
? 关系操作符( Relational Operator),
? 算术操作符( Arithmetic Operator),
? 重载操作符( Overloading Operator)
101
1)逻辑操作符
6种,and,or,nand,nor,xor,not
要求:操作数类型必须相同。可为如下类型,
bit,bit_vector,std_logic,
std_logic_vector,boolean
数组操作数的维数、大小必须相同。
注:当有两个以上的逻辑表达式时,左右没有
优先级差别,必须使用括号,如,
x<=( a and b )or( not c and d );
例外:当逻辑表达式中只有 ? and”,? or”,
? xor”运算符时,可以省略括号。如,
102
a <= b and c and d and e;
a <= b or c or d or e;
a <= b xor c xor d xor e;
2) 关系操作符
6 种,=,/=,<,<=,>,>=
用于比较相同父类的两个操作数,返回
boolean值。
103
3)加减操作符
加操作符 ? +”、减操作符 ? -”,
串联(并置)操作符 ? &”
串联操作符 ? &”通过连接操作数来建立新的数
组。操作数可以是一个数组或数组中的一个元素。
例,signal a,d,bit_vector (3 downto );
signal b,c,g,bit_vector (1 downto 0);
signal e,bit_vector(2 downto 0);
signal f,h,i, bit;
a <= not b & not c; -- array & array
d <= not e & not f; -- array & element
g <= not h & not i; -- element & element
104
4) 一元操作符
仅有一个操作数的操作符。
包括,? +”,? -”
5) 乘除操作符
用于整数类型,? *?, ? /”,? mod”、
? rem”
综合的限制, ? /”,? mod”,? rem” 三种操
作
符的右操作数必须为 2 的正整数次幂,即 2n。
实际电路用移位实现。
105
2、操作数
操作数,
操作符进行运算时所需的数据。
操作数的种类,
标志符;集合;属性;表达式;函数
调用;索引名;文字;限定表达式;记
录和域;片段名;类型转换
106
3、重载操作符
VHDL是强类型语言,相同类型的操作数才能进行
操作。 VHDL自身定义的算术和布尔函数仅对内部数据
类型( standard 程序包中的数据类型)有效。即,
算术运算符 +,-,<,>,<=,>= 仅对 integer类型有
效。逻辑运算符 AND,OR,NOT仅对 bit 类型有效。
如,variable a,b,c, integer;
variable x,y,z, bit;
c,= a + b;
z,= x and y;
问题,a,b,c 与 x,y,z 之间,或与 std_logic
等其它数据类型之间能否相互操作?
107
重载操作符定义,
对已存在的操作符重新定义,使其能进行不
同类型操作数之间的运算,称为重载操作符。定
义重载操作符的函数称为重载函数。
重载操作符由原操作符加双引号表示。如
? +”
重载操作符的定义见 IEEE 库的程序包,
std_logic_arith,
std_logic_unsigned,
std_logic_signed
108
109
重载操作符的使用,
110
第 3章 习题一
1,VHDL的优点是什么?
2,VHDL中最基本的结构是什么?其作用各是什么?
3、说明 inout,out 和 buffer有何异同点。
4、什么是重载运算符,重载函数有何作用?
5,VHDL中有哪 3种数据对象?详细说明它们的功
能特点以及使用方法。
6、表达式 c <= a + b 中,a,b和 c的数据类型
都是 std_logic_vector,是否能直接进行加
法运算?说明原因和解决方法。