P2 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
硬 件描 述语 言 HDL ( Hardware
Description Language) 是一种对于数字电路和系统进行性能描述和模拟的语言,在 20世纪 70年代已经在学术界开始使用 。 使用硬件描述语言可以在数字系统的设计阶段对系统的性能进行描述和模拟,减少硬件设计的时间和成本,是一种很有推广价值的设计方法 。
P3 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
VHDL是美国国防部在 80年代中期开始推出的一种通用的硬件描述语言 。 当时他们的一个主要研究项目是超高速集成电路 ( Very High
Speed Integrated Circuits),研究一种新的硬件描述语言也是这个项目的需要,所以取这个项目名称的第一个字母 V,将这种硬件描述语言命名为 VHDL。
P4 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
VHDL语言原来只是美国国防部的一种标准,到了 1987年就被 IEEE
协会接受为硬件描述语言的标准,
即 IEEE的 VHDL-87。 到 1993年又被 IEEE进一步修改,发布为新的标准,VHDL-93。
这样,VHDL就开始在世界范围内得到推广和使用了 。
P5 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
设计过程
基于硬件描述语言的数字系统设计是一个从抽象到实际的过程 。
本书将 VHDL用于基于 CPLD的逻辑设计,这种系统的设计过程如图所示 。
P6 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
VHDL语言的基本特点
可以在各个不同的设计阶段对系统进行描述 。 使用 VHDL可以进行比较抽象的系统 性能描述,也能进行比较具体的 数据流描述 和更加具体的 逻辑结构描述 。
支持层次化的设计方法 。 系统硬件设计经常采用的方法是自顶向下的层次化设计方法,从系统的性能要求出发,
将设计任务逐渐分解,细化和实现 。
VHDL的模块式结构,完全可以支持这种设计方法 。
P7 北京邮电大学 huimin@bupt.edu.cn2009-8-21
硬件描述语言VH
DL
可以支持各种不同类型的数字电路和系统的设计 。 VHDL的设计主要是用来设计同步系统,但是也可以设计异步电路 。 不论是 TTL电路,CMOS电路,
不论是 CPLD芯片,还是门阵列芯片,
都可以用 VHDL语言来描述和设计 。
具有很好的时间性能的描述机制,使得 VHDL不仅可以很好的描述系统和电路的逻辑功能,也可以真实的反映系统或电路的时间特性 。
P8 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
基本的 VHDL描述由两个部分组成:
实体 ( entity ) 部 分 和 结 构 体
( architecture) 部分 。
实体部分有时也称为接口
( interface) 部分,主要描述一个硬件模块或系统的输入,输出接口,
包括输入,输出信号的名称,类型等 。
结构体部分,有时也称为主体 ( body)
部分,是对硬件内部结构或性能的具体描述 。
P9 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
例 5.1 2输入与非门的 VHDL描述
ENTITY nand2 IS --实 体 描述
PORT ( i1,i2:IN BIT; --输 入信 号 名
o1:OUT BIT); --输 出信 号 名
END nand2;
ARCHITECTURE delayed OF nand2 IS
--结构 体描述
BEGIN
o1<=i1 NAND i2 AFTER 5NS; --电 路描述
END delayed;
P10 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
说明:
IN(输入 ),OUT(输出 )是表示信号的类别;
BIT是表示信号的类型,BIT是系统定义的类型,即二进位类型,信号只有
‘ 0?和 ‘ 1?两种值;
每个 VHDL语句都是以,;”结束,包括最后一个语句也不例外;
VHDL中的,注释,是以两个减号,--”
开始的 。
P11 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
实体描述
VHDL实体描述的基本格式是:
ENTITY 实 体名 IS
PORT (信 号 名,类别 信 号类 型 ;
………
信 号 名,类别 信 号类 型 );
END 实 体名 ;
实体描述主要由 PORT部分组成 。 PORT的中文译名就是,端口,,也就是要在这个部分说明电路或系统的对外连接 。 实体名和信号名都是标识符,同样类别和类型的信号可以用逗号分隔,在一个语句行中说明 。
P12 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
信号的类别主要有以下 4种:
IN:此信号是输入信号;
OUT:此信号是输出信号,提供给其他的实体;
BUFFER:缓冲信号,也是实体的输出信号,但是可以被实体本身的结构体读入;
INOUT:双向信号,既可以输入,也可以输出 。
P13 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
信号的类型可以是 VHDL预先定义的,
也可以是用户自己定义的 。 系统预定义的信号类型有:
BIT:二进位型,信号的值只能是 ‘ 0?或
‘ 1?。
BIT_VECTOR:二进位向量,实际对应的是二进位数组 ;
BOOLEAN:布尔型,取值只能是 true或者
false ;
INTEGER:整型,一般都用 32位二进制数表示整型数 ;
CHARACTER:字符型,使用 8位编码的 ASCII
字符 。
P14 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
结构体描述
结构体描述的基本框架如下:
ARCHITECTURE 结构 体名 OF 实 体名 IS
<声 明部分 >
BEGIN
<描述部分 >
END 结构 体名 ;
对于一个实体来说,可以有几种不同的结构体描述。一个结构体名只是表示实体的一种描述,还可以用另外的一个结构体名,
对实体进行另一种描述。
P15 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
例 5.2 二输入与非门的另一种描述 。
ARCHITECTURE another OF nand2 IS
BEGIN
PROCESS(i1,i2)
BEGIN
IF i1='1' AND i2='1' THEN
o1<='0' AFTER 5NS;
ELSE o1<='1' AFTER 5NS;
END IF;
END PROCESS;
END another;
P16 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述的基本结构
这种描述完全是从与非门输入和输出的逻辑关系出发,对与非门性能的一种描述 。
也就是:,只有输入都是逻辑 ‘ 1?时,输出才是 ‘ 0?;否则输出就是 ‘ 1?。,
在 VHDL中对这一类的描述称为,性能,描述 ( behavioral description),性能描述中一定有 PROCESS语句 。
而对前一种 ( 例 5.1) 与非门描述称为,数据流,描述 ( dataflow description),
这种描述主要是反映数据经过一定的逻辑运算后在输入和输出之间的传送 。
VHDL还有另一种描述,称为,结构,描述
( structural description) 。
P17 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
数据类型
VHDL中的数据类型有两大类:预定义类型和用户自定义类型 。
用户自定义类型包括枚举型,数组类型,物理类型,子类型以及文件类型,
记录类型等 。
本书中不介绍文件类型和记录类型 。
P18 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
枚举类型
枚举类型 ( Enumerated type) 是最常见的用户自定义类型之一 。
在硬件描述中,可以通过枚举类型来定义信号的取值 。 除了最常用的二值逻辑 ( 已经预定义为 BIT型 ),还可以有三值逻辑 ( 信号有三种取值:
‘ 0?,‘ 1?和 ‘ z?),九值逻辑等 。
P19 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
枚举类型的定义可用以下的格式:
TYPE 枚 举类 型名 IS (枚 举 型 值 表 );
其中的枚举型值表是用逗号分隔的标识符或字符常量,也就是这种枚举型信号可以取的值 。
例如,四值逻辑系统的逻辑值有:
‘ 0?,‘ 1?,‘ Z?( 高阻抗 ),‘ X?
( 不确定 ) 。 可以用枚举型定义这种逻辑系统:
TYPE qit_logic IS ('0','1','Z','X');
P20 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
在 IEEE1164标准逻辑包中所定义的 std-ulogic
类型是一种九值逻辑,也是一种枚举型的数据类型:
TYPE std_ulogic IS ( 'U',--Uninitialized
'X',--Forcing Unknown
'0',-- Forcing 0
'1',-- Forcing 1
'Z',--High Impedance
'W',--Weak Unknown
'L',--Weak 0
'H',--Weak 1
'-',--Don't Care);
P21 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
也可以用自定义的标识符作为枚举型信号的值 。
例如,可以用枚举型来定义交通灯的状态:
TYPE traffic_light IS (red,green,yellow);
VHDL语言对于枚举型类型取值的限制较少,可以用标识符,也可以用字符常量 。 这在许多高级语言中都是不允许的 。
P22 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
数组类型
VHDL也是将相同类型数据的有序集合定义为数组 。 数组定义的基本格式是:
TYPE 数组 名 IS ARRAY(范 围 ) OF 基 类 型 ;
其中的,基类型,是已经定义过的类型,甚至可以是已经定义过的数组类型 。
定义中的,范围,,既表示数组的大小,也说明用什么方式表示数组元素的下标 。 通常,,范围,是用整数表示,也可以用枚举值表示 。
P23 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
“范围,用整数表示时,整数范围可以是 递增 表示,也可以是 递减 表示:
TYPE register IS ARRAY (0 TO 7) OF BIT;
TYPE regist_1 IS ARRAY (7 DOWNTO 1) OF
BIT;
TYPE rom IS ARRAY (0 TO 7) OF register;
rom类型实际上是用 register基类型定义的二维数组,即
TYPE rom IS ARRAY (0 TO 7,0 TO 7) OF
BIT;
P24 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
数组的范围还可以用已经定义过的 枚举型 来表示,如:
TYPE light_delay IS ARRAY (traffic_light)
OF INTEGER;
这里的 traffic-light是已经定义的枚举类型,有三个取值 (,red,yellow、
green”) 。 将来定义的类型为 light-
delay的数组,也只会有三个元素 。
P25 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
在 VHDL中,可以对数组的整体赋值,
如定义了 regist_1类型的数组信号:
TYPE regist_1 IS ARRAY (7 DOWNTO
0) OF BIT;
SIGNAL arr_1,arr_2,regist_1;
以下的赋值操作在 VHDL中都是允许的:
arr_1 <= "10110110";
arr_2 <=arr_1;
P26 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
子类型
有时,希望对某种类型数据的范围加以限制,可以通过定义子类型来实现这种限制 。
子类型的定义方式如下:
SUBTYPE 子类型名 IS 已定义类型名 [范围 ];
这里的,范围,,可以通过 RANGE短语来表示,
SUBTYPE decimal IS INTEGER RANGE 0 TO 9;
P27 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
子类型也可以从一个已定义的枚举类型来定义,例如:
TYPE weekday IS (Sun,Mon,Tue,
Wed,Thu,Fri,Sat);
SUBTYPE workday IS weekday RANGE
(Mon TO Fri);
子类型的对象可以直接向原来类型的对象赋值,而原类型对象向子类型对象的赋值是要受限制的:只能在子类型的取值范围内来可以进行这种赋值操作 。
P28 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
VHDL运算符表 5,1 VHDL 的运算符类别 运算符 操作数类型 结果类型算术运算符 + - * / * *
M O D R E M A B S
整型、实型、物理型 同操作数逻辑运算符 NO T A ND OR N O R
NA ND XO R
B I T,B O O L E A N 同操作数关系运算符 = ( 相等 ) /= ( 不相等 )
<( 小于 ) < = > > =
任何类型 B O O L E A N
连接运算符 & 数组或数组元素 数组
P29 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
连接运算符 &是一个比较特殊的运算符,它可以用于任意数组类型,
例如,有以下的定义:
TYPE register IS ARRAY (7 DOWNTO
0) OF BIT;
SIGNAL reg_1,reg_2,register;
可以进行以下操作:
reg_1 <= reg_1(6 DOWNTO 0) &
reg_1(7);
相当于对于数组进行一次循环左移一位的操作 。
P30 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
常量的定义
常量的定义采用如下的格式:
CONSTANT 常量名,类型名,= 常量值 ;
例如:
CONSTANT array_size,INTEGER,= 16;
CONSTANT gate_delay,TIME,= 50ns;
P31 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
通过常量定义来定义九值逻辑下,与,
运算的真值表:
T Y P E s t d l o g i c_ t a b l e I S A R R A Y ( s t d _ u l o g i c,s t d _ u l o g i c) O F s t d _ u l o g i c;
C O N S T A N T a n d _ t a b l e,s t d l o g i c_ t a b l e,= (
-- ------------------------------------------------------------------------
-- | U X 0 1 Z W L H - |
-- ------------------------------------------------------------------------
( ' U ',' U ',' 0 ',' U ',' U ',' U ',' 0 ',' U ',' U ' ),-- |U|
( ' U ',' X ',' 0 ',' X ',' X ',' X ',' 0 ',' X ',' X ' ),-- |X|
( ' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ' ),-- |0|
( ' U ',' X ',' 0 ',' 1 ',' X ',' X ',' 0 ',' 1 ',' X ' ),-- |1|
( ' U ',' X ',' 0 ',' X ',' X ',' X ',' 0 ',' X ',' X ' ),-- |Z|
( ' U ',' X ',' 0 ',' X ',' X ',' X ',' 0 ',' X ',' X ' ),-- |W|
( ' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ' ),-- |L|
( ' U ',' X ',' 0 ',' 1 ',' X ',' X ',' 0 ',' 1 ',' X ' ),-- |H|
( ' U ',' X ',' 0 ',' X ',' X ',' X ',' 0 ',' X ',' X ' ) -- | - |
);
P32 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
VHDL表达式
VHDL表达式中可以使用变量或信号,
变量和信号的定义方式很相似,但是使用上有很大的差别 。
变量的定义采用如下的方式:
VARIABLE 变量名,类型名 [:=初值 ];
变量的赋值用,,=”来表示 。 变量的赋值没有延迟 。
P33 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
信号定义的方式和变量定义类似:
SIGNAL 信号名,类型名 [:=初值 ];
信号的赋值用,<=”表示 。
信号的传送可以规定延迟,也可以不规定延迟 。 但是 VHDL规定,如果没有指定信号传送的延迟,信号的传送也会有一个最小延迟 Δ 。
信号可以是全局定义的,PORT中定义的信号就是对所有的结构体都有效 。 但是,信号也可以是局部定义的,在结构体内部定义的信号只对这个结构体有效 。
P34 北京邮电大学 huimin@bupt.edu.cn2009-8-21
数据类型和表达式
注意:
在一个 VHDL表达式中,数据的类型应该相同 。
如果不同的数据类型出现在同一个表达式,VHDL不会进行自动类型的转换,
而只会给出错误信息 。
VHDL支持运算符的重载 。 例如可以对不同类型的信号各自进行 AND运算 。
P35 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
VHDL库的种类和使用
VHDL的库可以分为三种类型:系统库,
IEEE库和用户库 。
系统库是 VHDL语言本身预定义的库,包括
STD库和 WORK库 。
STD库是系统的标准库,所有系统本身预定义的类型和有关的操作都包含在这个库中 。
WORK库是用户的工作库 。
STD库和 WORK库对用户都是透明的,也就是随时都可以使用的,不需要在描述中专门说明 。
P36 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
IEEE库是 IEEE认可的标准库,其中包括对于 STD_LOGIC类型以及有关函数的定义 。
用户库就是 VHDL软件提供厂商开发的库 。 应该查询相应软件的说明,知道有哪些库可以使用,以及如何使用 。
P37 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
程序包
一个 VHDL库可以包含许多内容,并且往往以程序包 ( Package) 的形式组织在一起 。
一个程序包由两个部分构成:包的说明部分 ( Package Declaration) 和包的主体部分 ( Package Body) 。 基本的结构如下:
PACKAGE 程序包名 IS
程序包说明部分
END 程序包名 ;
PACKAGE BODY 程序包名 IS
程序包主体描述
END 程序包名 ;
P38 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
程序包的说明部分要对程序包内所定义的所有内容进行说明,可以包括:
常量说明;
信号说明,这里说明的信号可以被所有的结构体使用;
类型说明;
函数或过程说明;
部件 ( Component) 说明,等 。
程序包的主体部分则是对所包含的函数,
过程,结构体进行具体的描述 。
P39 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
程序包示例 。
PACKAGE qit_utilities IS
TYPE qit IS ('0?,?1?,?Z?,?X?);
FUNCTION "AND" (a,b,qit) RETURN qit;
FUNCTION "OR" (a,b,qit) RETURN qit;
END qit_utilities;
PACKAGE BODY qit_utilities IS
FUNCTION "AND" (a,b,qit) RETURN qit IS
CONSTANT qit_and_table,qit_2d,= (
('0','0','0','0'),
('0','1','1','X'),
('0','1','1','X'),
('0','X','X','X'));
BEGIN
RETURN qit_and_table(a,b);
END "AND";
P40 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
FUNCTION "OR" (a,b,qit) RETURN qit IS
CONSTANT qit_or_table,qit_2d,= (
('0','1','1','X'),
('1','1','1','1'),
('1','1','1','1'),
('X','1','1','X'));
BEGIN
RETURN qit_or_table(a,b);
END "OR";
END qit_utilities;
以上的程序包中定义了一种 4值逻辑及其操作 。
在说明部分定义了一种新的信号类型 qit,也就是一种 4值逻辑,还说明了两个函数 AND和 OR,
用来对 4值逻辑进行,与,,或,运算 。 在
BODY部分肌体实现了这两个函数 。
P41 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
库和程序包的引用
在所有的 VHDL源程序都要首先声明使用什么 VHDL库 。 声明要使用关键字 LIBRARY,例如,要使用 IEEE库,就应该作以下的声明:
LIBRARY IEEE;
在声明了使用哪个 VHDL库以后,还要声明使用这个库中的哪个程序包 。
声明使用什么程序包要通过关键字 USE:
USE 库名,程序包名,ALL;
USE 库名,程序包名,子程序名 ;
P42 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
函数和过程
VHDL中既可以使用函数,也可以使用过程 ( Procedure) 。 两者统称为子程序 。
函数的定义包括函数说明和函数主体两部分,基本的格式如下:
FUNCTION 函数名 (参数表 ) RETURN 类型 IS
BEGIN
函数体
END 函数名 ;
函数体中一定要包括 RETURN语句。
P43 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
的库和包
过程的定义和函数的定义非常相似:
PROCEDURE 过程名 (参数表 ) IS
BEGIN
过程体
END 过程名 ;
过程没有返回值 。
函数的参数传递总是一个方向的,也就是传入到函数,而过程的参数传递可以是两个方向的 。 具体在过程执行中参数如何传递,
取决于参数的类别 ( IN,OUT,INOUT等 ),
而对于函数参数的类别,则只能有一种,IN,
就是输入到函数 。
P44 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
在一个描述中,可以有许多并行处理语句,这些语句的执行是可以同时进行的 。
并行语句主要是信号传送语句 。 传送时可以指定传输延迟 。
如果传送时没有指定时延,VHDL会对并行处理语句的执行加上一个最小时延 Δ 。
P45 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
并行赋值语句
并行赋值语句是最基本的 VHDL语句,
它的格式是:
信 号 名 <=表 达 式 ;
信 号 名 <=表 达 式 AFTER 延 迟时间 ;
P46 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
例 5.4 半加器的数据流描述 。
ENTITY half_adder IS
PORT(a,b,IN BIT;
s,c0,OUT BIT);
END half_adder;
ARCHITECTURE h_adder OF half_adder IS
SIGNAL c,d,BIT;
BEGIN
c<= a OR b;
d<= a NAND b;
c0<= NOT d;
s<= c AND d;
END h_adder;
P47 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
条件赋值语句
条件赋值语句也是一种信号赋值语句,
只是赋给信号的值可以根据条件的不同而不同 。
条件赋值语句的格式如下:
信号名 <=表达式 1 WHEN 布尔表达式 1 ELSE
表达式 2 WHEN 布尔表达式 2 ELSE
……
表达式 n WHEN 布尔表达式 n ELSE
表达式 ;
P48 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
例 5.5 用条件赋值语句描述数据选择器 。
ENTITY mux4_to_1 IS
PORT(d0,d1,d2,d3,a,b,IN BIT;
y,OUT BIT);
END mux4_to_1;
ARCHITECTURE sample_1 OF mux4_to_1 IS
BEGIN
y<= d0 WHEN a='0' AND b='0' ELSE
d1 WHEN a='0' AND b='1' ELSE
d2 WHEN a='1' AND b='0' ELSE
d3 WHEN a='1' AND b='1' ;
END sample_1;
P49 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
选择信号赋值语句
选择信号赋值语句可以根据一个表达式的不同取值,给信号或者信号数组赋以不同的结果 。
选择信号赋值语句的格式如下:
WITH 表达式 SELECT
信号名 <= 信号值 1 WHEN 表达式值 1,
信号值 2 WHEN 表达式值 2,
……
信号值 n WHEN others;
P50 北京邮电大学 huimin@bupt.edu.cn2009-8-21
并行处理语句
例 5.6 用信号选择语句描述数据选择器 。
ENTITY mux4_to_1 IS
PORT(d0,d1,d2,d3,a,b,IN std_logic;
y,OUT std_logic);
END mux4_to_1;
ARCHITECTURE sample_2 OF mux4_to_1 IS
BEGIN
WITH a&b SELECT
y<= d0 WHEN "00",
d1 WHEN "01",
d2 WHEN "10",
d3 WHEN "11",
'X' WHEN OTHERS;
END sample_2;
P51 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
在 VHDL语言中,上述并行信号传输语句主要描述硬件电路或系统中信号的传送过程 。 同时,VHDL还支持顺序描述语句,主要使用于对电路和系统的性能描述 。
顺序描述语句的执行就和一般程序设计语言中语句相似,是按照语句的顺序依次执行的 。 前一条语句的结果会影响到下一条语句的执行 。
P52 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
PROCESS语句
尽管 PROCESS语句本身是并行描述语句,可以和其他并行语句同时执行,
但是 PROCESS语句内部的语句都是顺序语句 。
PROCESS语句的格式如下:
PROCESS(信号 1,…,信号 k)
变量说明 (定义 );
其他说明 ;
BEGIN
顺序语句
……
顺序语句
END PROCESS;
P53 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
PROCESS语句的执行
在 PROCESS后面的括弧内,有几个信号名 。 这些信号总称为,敏感表,。
PROCESS语句的执行就是由敏感表中的信号变化而引起的 。
PROCESS语句一旦开始执行,就要依次执行其中的顺序语句,一直到最后的 END PROCESS为止 。
如果这次执行又引起了敏感表中信号的新的变化,则将再次执行这条
PROCESS语句,直到敏感表中没有信号发生变化为止 。
P54 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
信号和变量赋值语句
在 PROCESS语句内,也可以使用信号和变量赋值语句 。
信号赋值语句的形式仍然是:
信 号 名 <=表 达 式 ;
这 样 的 信 号 赋 值 语 句 的 结 果 在
PROCESS内并不是立即起作用的,而是要等 PROCESS语句执行后 ( 也需要最小时延 ),才起作用 。
变量的赋值语句采用以下形式:
变 量名,=表 达 式 ;
P55 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
分支语句
两分支 IF语句的格式:
IF 布尔表达式
THEN 顺序语句
ELSE 顺序语句
END IF;
多分支 IF语句的格式:
IF 布尔表达式
THEN 顺序语句
ELSIF 布尔表达式
THEN顺序语句
ELSE 顺序语句
END IF;
P56 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
例 5.7 反向器的顺序描述 。
ENTITY inverter IS
PORT(x,IN BIT;
y,OUT BIT);
END inverter;
ARCHITECTURE behave OF inverter IS
BEGIN
PROCESS(x)
BEGIN
IF (x='0') THEN y<=?1';
ELSE y<=?0';
END IF;
END PROCESS;
END behave;
P57 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
另外一种分支语句是 CASE语句 。
CASE语句是从多个可能的分支中选择一个分支进行操作 。
CASE语句的格式如下:
CASE 表达式 IS
WHEN 值 1 => 顺序语句 1
……
WHEN 值 k => 顺序语句 k
WHEN OTHERS =>顺序语句 k+1
END CASE;
P58 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
例 5.8 四选一数据选择器的顺序描述 。
ENTITY mux4_1 IS
PORT(a,b,i0,i1,i2,i3,IN BIT;
y,OUT BIT);
END mux4_1;
ARCHITECTURE behave OF mux4_1 IS
SIGNAL sel bit_vector(1 DOWNTO 0);
BEGIN
sel<=b & a;
PROCESS(sel,i0,i1,i2,i3)
BEGIN
CASE sel IS
WHEN "00" => y<=i0;
WHEN "01" => y<=i1;
WHEN "10" => y<=i2;
WHEN "11" => y<=i3;
END CASE;
END PROCESS;
END behave;
P59 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
循环语句
VHDL中提供了两种形式的循环语句,FOR循环和 WHILE循环 。
FOR循环的格式如下:
FOR 变量 IN 范围 LOOP
顺序语句
……
顺序语句
END LOOP;
其中的,变量,和,范围,应该有相同的类型。例如变量是整型,范围可以是一个整数范围。如果变量是枚举型,则,范围,要限制在枚举类型所定义的取值范围内。
P60 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
WHILE循环的格式如下:
WHILE 布尔表达式 LOOP
顺序语句
……
顺序语句
END LOOP;
WHILE循环中的布尔表达式可以是逻辑表达式或者关系表达式 。
在 FOR循环或者 WHILE循环中都可以使用
NEXT语句来结束本次循环,用 EXIT语句来结束循环,到下一条顺序语句继续执行 。 它们的格式基本相同:
NEXT WHEN 布尔表达式 ;
EXIT WHEN 布尔表达式 ;
P61 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
结构描述语句
结构描述是 VHDL的三种描述方法之一 。
结构描述的基础是部件,COMPONENT。
所使用的部件应该是事先已经定义过的 。 可以直接取自某个 VHDL库,也可以是用户自定义的存放在 WORK库的部件 。
所用部件所在的库或程序包,必须在程序开始前声明 。
P62 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
部件声明语句
在结构描述中所使用的部件必须首先声明 。
部件的声明在 ARCHTECTURE的声明部分进行 。
部 件 声 明 语 句 ( Component
Declaration) 的格式如下:
COMPONENT 部件名
PORT(信号名,类别 信号类型 ;
……
信号名,类别 信号类型 );
END COMPONENT;
P63 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
部件描述语句
部件描述语句就是 COMPONENT语句 。
COMPONENT语句本身属于并行语句 。
第一种格式的 COMPONENT语句是:
标号,部件名 PORT MAP(信号名 1,信号名 2,…,信号名 n);
在使用这种格式时,必须注意 PORT
MAP所列出的信号名应该和部件定义时的信号名的顺序相一致 。
标号是部件的标识 。 同样的部件在电路中可以使用多次,它们都有相同的部件名,但是有不同的标号,
P64 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
第二种格式是:
标号,部件名 PORT MAP(接口信号 1=>信号名 1,…,接口信号 n =>信号名 n);
采 用这样 的格式,就不 要求
COMPONENT 语 句 中 的 信 号 名 和
ENTITY的 PORT部分的信号名保持顺序上的一致,而只要它们的对应关系正确就可以了 。
P65 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
使 用 前 面 已 经 定 义 过 的 半 加 器
half_adder,可以构成全加器 。 逻辑图如下所示 。
按照这个逻辑图,可以写出全加器结构描述 。
P66 北京邮电大学 huimin@bupt.edu.cn2009-8-21
顺序描述语句
例 5.9 全加器的结构描述 。
ENTITY full_adder IS
PORT(x,y,cin,IN BIT;
sum,carry,OUT BIT);
END full_adder;
ARCHITECTURE struct OF full_adder IS
COMPONENT half_adder
PORT(a,b,IN BIT;
s,c0,OUT BIT);
END COMPONENT;
SIGNAL h1_s,h1_c,h2_c,BIT;
BEGIN
h1,half_adder PORT MAP(x,y,h1_s,h1_c);
h2,half_adder PORT MAP(a=>h1_s,
b=>cin,s=>sum,c0=>h2_c);
carry<=h2_cOR h1_c;
END struct;
P67 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述组合电路例 5.113-8译码器的数据流描述 。
ENTITY decoder_3_8 IS
PORT (G1,G2A_L,G2B_L,IN STD_LOGIC;
address,IN STD_LOGIC_VECTOR(2 DOWNTO 0);
Y_L,OUT STD_LOGIC_VECTOR(0 DOWNTO 7));
END decoder_3_8;
ARCHITECTURE dataflow_1 OF decoder_3_8 IS
SIGNAL Y_L_I,STD_LOGIC_VECTOR(0 DOWNTO 7);
BEGIN
WITH address SELECT
Y_L_I<= "01111111"WHEN "000",
"10111111" WHEN "001",
"11011111" WHEN "010",
"11101111" WHEN "011",
"11110111" WHEN "100",
"11111011" WHEN "101",
"11111101" WHEN "110",
"11111110" WHEN "111",
"11111111" WHEN OTHERS;
Y_L <= Y_L_I WHEN (G1 AND NOT G2A_L AND NOT
G2B_L) ="1"
ELSE "11111111";
END dataflow_1;
P68 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述组合电路
例 5.13 三态输出与非门的性能描述
ENTITY tristate_nand IS
PORT(in_1,in_2,IN STD_LOGIC;
en,IN STD_LOGIC;
d_out,OUT STD_LOGIC);
END tristate_nand;
ARCHITECTURE behav OF tristate_nand IS
BEGIN
PROCESS(in_1,in_2,en)
BEGIN
IF en='1' THEN d_out <= in_1 NAND in_2;
ELSE d_out <= 'Z';
END IF;
END PROCESS;
END behav;
P69 北京邮电大学 huimin@bupt.edu.cn2009-8-21
VH
DL
描述组合电路
例 5.14 八进制数到二进制代码转换的编码器。
ENTITY decoder_8_3 IS
PORT(num,IN STD_LOGIC_VECTOR(7 DOWNTO0);
code_out,OUT STD_LOGIC_VECTOR(2
DOWNTO0));
END decoder_8_3;
ARCHITECTURE dataflow OF decoder_8_3 IS
BEGIN
WITH num SELECT
code_out <= "000" WHEN "00000001",
"001" WHEN "00000010",
"010" WHEN "00000100",
"011" WHEN "00001000",
"100" WHEN "00010000",
"101" WHEN "00100000",
"110" WHEN "01000000",
"111" WHEN "10000000",
"××× " WHEN OTHERS;
END dataflow;