VHDL的基础概念

下载
第5章VHDL的基础概念
硬件描述语言( H D L )为数字逻辑网络的计算机辅助设计( C A D )提供了一个有效的方法。
H D L是一种可用于描述任意复杂度的逻辑网络所有重要特性的高级计算机语言。它的内容包
括单个函数、信号的属性和模块如何连接构成一个完整系统的细节等。一旦系统采用了合适
的格式和语法来描述,它就可以用H D L的程序进行编译。这样就会产生了一系列输出,这些
输出可用于模拟和验证逻辑网络的行为。
本章我们将学习如何应用称为V H D L的硬件描述语言来描述简单的数字电路。你将发现
V H D L是一个学习和使用起来都非常自然的语言。
5.1 引言
在层次设计中,每个系统都可看出由较小的模块组成。每个模块都提供了确定的函数,
而且每个模块的本身都由更小的模块组成。如果我们从最简单的函数入手,然后构造较为复
杂的模块,那么我们采用的是称为自底向上的系统设计方法。相反地,我们可以也从最高的
(系统)层次级别着手,然后将系统分解成越来越小的逻辑模块;这就是称为自顶向下的设计方
法。
硬件设计语言为我们提供了在希望的层次级别中描述数字系统的方法,它有助于我们掌
握不同层次级别的复杂性。一旦我们产生了逻辑网络的H D L文件清单,它们就可以用于验证
设计的运算和性能,识别和改正故障点,并且我们可以相当地确信,如果根据H D L来构成硬
件,系统将可以良好地工作。
本书将选择称为V H D L的这种特别硬件描述语音作为表达主要概念的工具。“V”代表
V H S I C,它是美国国防部( D o D )用于称之为Very High-speed Integrated Circuits1这一工作领域
的另一个首字母缩写。虽然存在其他非常好的H D L,但V H D L已建立起一整套、有良好文档
的标准。V H D L编译器作为单独的程序是现成的,可在多个商业C A D工具集中找到。最重要
的是,V H D L代表了其他硬件描述语言的特征。
5.1.1 基本概念
考虑图5 - 1所示的通用逻辑功能模块。此单元的特征是,
它的输入口接受变量A , B , C并在输出口得到函数f (A , B , C)。
我们可以在不考虑模块内部的复杂度的情况下使用该模型。
不管模块对应的逻辑函数是简单的一对逻辑门,还是具有
许多输入、输出,并且逻辑运算十分复杂的逻辑函数,这
些都没有关系。
现在假设你想在电话中向另一个你正在交谈的人描述图5-1 通常的逻辑模块
逻辑模块
输入输出
V H D L的发音方法是只读出它的字母,另外, V H S I C读作v i s - h i c .
该模块的运算。逻辑图的方法要求你转送一幅图形图像,或试图用文字描述一个图形。虽然
用口头描述逻辑电路对于小的单元而言已经足够,但用它来描述复杂网络是不实际的。另外,
出现错误的概率也会很高。
即便有了现成的逻辑图,还存在另一个问题:我们如何验证我们的设计以确保它按预期
的方式工作?优秀的设计者总是在设计的每个层次级别进行测试以避免设计周期的后期发现
错误而导致代价昂贵的更改。虽然我们可以通过追踪逻辑图中每一种可能的时序来进行逻辑
验证,但这种方法十分单调乏味并且可能引入大量错误。
硬件描述语言为这两个问题的解决提供了答案。它允许我们用精确定义的语句描述数字
网络的运算。该语句类似于通用的高级计算机语言,如C + +。反过来,我们可直接从H D L描
述构造出逻辑图。但是, H D L语言具有更为重要的应用,即具有用计算机来模拟逻辑网络的
能力。设计测试和重新设计都可以在H D L级进行,并且设计的修改或更正可转换回初始设计。
正如它的名字所隐含的含义一样, H D L允许我们将硬件特征包含在模拟中。物理的问题,比
如经过逻辑门的延迟等,可以包含在H D L中以确保电路将按设计者预定的方式工作。还有,
H D L允许我们对复杂逻辑网络的细节进行模拟,找出故障点并对设计进行改进。
V H D L另一个有用的方面是它可用于描述任何数字网络。而且,它是标准化的,可以使用
在各种平台上,包括标准P C和工作站环境。
5.1.2 硬件描述语言的使用
为了使用硬件描述语言,我们用语言本身定义的特定语法和结构来产生一个网络描述。
我们将这些描述输入到一个文本文件并加以保存。一旦完成网络的描述,网络描述文件就可
以作为H D L编译器的输入。此过程如图5 - 2所示。编译器接受网络描述文件并产生一个包含所
有网络信息的输出文件。然后在编译器环境中该输出文件与另一个允许用户确定输入和查看
相应结果的程序一起被使用。它通常是描述随时间改变的信号的图形接口。
本章的重点是学习如何写出可在编译器上运行的V H D L输入文件。重点将放在语言语句的
细节和解释。如果你使用过V H D L编译器,你应参考操作手册学习在实际模拟环境中如何使
用其特征。有许多现成的优秀软件包可用于桌面P C机,它使得精通这种语言变得十分容易。
5.2 VHDL中模块的定义
类似于图5 - 1所示的逻辑单元称为模块或单元。为了用V H D L描述一个给定的模块,我们
必须做两件事情。首先,我们通过给模块命名及确定输入和输出信号线(称为端口,p o r t )对该
模块进行定义。这就是称为实体( e n t i t y )的描述。一旦引进了实体,我们就必须确定模块的实
际操作,输入和输出的关系,等等。这称为模块的结构( a r c h i t e c t u r e )描述。模块的结构可用不
同的方式来描述,描述的方式可以通过所希望的建模层次级别来确定。
图5-2 VHDL编译器的使用
106 数字系统设计基础教程
V H D L
清单
E n t i t y. . .
A r c h i t e c t u r e . . .
VHDL
编译器程序信号模拟
输出文件
操作手册通常是软件包所带的信息小册子,但常常被忽略。
下载
与其他任何计算机语言一样, V H D L要求我们遵守已定义关键字( k e y w o r d )和语法( s y n t a x )
的一整套规则。“关键字” (也称为保留字)是在语言中具有特别含义的单词,它不可用于其他
目的。在我们的讨论中关键字将用“黑体”字型来标识以帮助我们识别和学习;例如e n t i t y表
示“e n t i t y”是V H D L的关键字。当然,在输入V H D L清单时不需要改变字体;重要的仅仅是
单词的本身,而不是它们在屏幕上的显示。V H D L保留字按字母顺序排列的清单如图5 - 3所示。
这是暂时作为对保留字的引用,而不是用于命名参数的字的参考来使用。这些关键字的含义
将在本章及后面的章节中讨论。
图5-3 VHDL的保留字
“语法”指的是用于书写语句的关键字的用法和顺序,以及语句中定义特殊点的标点符
号要求,比如命令的结束。图5 - 4给出了特殊V H D L标识符和语法的清单。图中的部分符号
将在本章中加以介绍和讨论,但是此清单主要作将来参考之用。这两者都将在我们的讨论中
加以分析。但是不能否认语言本身是很重要的。在V H D L中关键字和语法讲究格式的细节,
并且也是V H D L完整和必要的组成部分。然而V H D L为数字逻辑网络的模拟和验证提供了超
越书写的代码细节本身的功能强大的方法,与任何计算机语言一样,对V H D L的精通来源于
第5章V H D L的基础概念107
下载
这是一个定义语句结束的定界符的例子
多使用。因此我们迫切希望读者多加练习,并且鼓励读者在尽可能多的网络设计中使用这里
讲述的方法。
符号含义
+ 加,或正数
- 减,或负数
/ 除
= 等于
< 小于
> 大于
& 连接符
| 垂直条
; 结束符
# 文字说明
( 左括号
) 右括号
. 点标识
: 数据对象与类型隔离
″ 双引号
′ 单引号或刻度多
* * 取幂
= > 箭头的含义为“t h e n”
= > 箭头的含义为“g e t s”
: = 变量赋值
/ = 不等于
> = 大于或等于
< = 小于或等于
< = 信号赋值
< > 方框
- - 注释
图5-4 VHDL中定义的符号
现在我们来重新讨论模块的V H D L描述。第一个步骤是写出实体的描述。它使得该模块与
其他模块区别开来,并定义了模块的输入和输出端口。考虑图5 - 5所画出的模块。图中该模块
的输入位为a、b和c;我们将此模块命名为S i m p l e _ g a t e;其输出用f 来标识,它也是一个二进
制数。此模块最简单的描述为
108 数字系统设计基础教程
下载
我们对此描述进行研究以理解其含义。第一行将这一块
语句标识为模块S i m p l e _ g a t e的实体描述。p o r t清单列出了模
块的输入和输出。它将参数a、b和c用关键字i n标识为二进
制输入;实体描述中加入附加的类型标识符b i t来对参数的性
质进行分类。标识符b i t将参数预定义为只有“ 0”和“1”这
两个值;引号用于将b i t值与字面上的值“ 0”和“1”区别开来。结果f用out b i t确定为二进制
输出。注意在p o r t清单中冒号“:”的使用形式
i d e n t i f i e r :i n
使得标识符( i d e n t i f i e r )与端口类型( i n或o u t)联系起来。最后一行通过指派e n d n a m e来结束
实体的描述。
一旦我们定义了实体,我们必须用结构(a rc h i t e c t u re)说明来精确描述模块的功能。在
S i m p l e _ g a t e例子中,其结构说明含义就是是我们需要定义f (a , b , c)是什么。V H D L提供了多种
不同方法来完成这项任务;每种方法都以写出信息的方式为特征。结构说明的主要分类为
• 行为描述通过行为描述提供输入和输出之间明确的关系。
• 结构列表它通过原语元件,比如逻辑门,来构造逻辑函数。
• 数据图模型它通过定义数据信号的“流程”来描述模块。它可看成行为模块中的一种。
通常,V H D L结构说明采用的形式为
在此清单中t y p e _ o f _ d e s c r i p t i o n是用户为模块结构定义的名称。其典型选择值是三种方法
(行为,结构或数据图)中的一种,或是其他易于记忆和理解的标识符。用D e c l a r a t i o n _ 1等标识
的各行用于定义所需的任何参数或描述中需要用到的“模块结构”。真正的描述是从关键字
b e g i n开始,其细节由标识为s t a t e m e n t _ 1等语句来提供。这些语句给出了逻辑函数或运算的细
节。E n d行表明描述结束。一旦我们用e n t i t y和a rc h i t e c t u re语句完成了模块的定义,该模块就
可与使用其他结构的模块相连接。
考虑图5 - 6所示的网络G a t e _ 1,我们将其作为书写V H D L描述的第一个例子。模仿前面的
e n t i t y清单,此实体语句可构成为
第5章V H D L的基础概念109
下载
图5-5 通用的VHDL模块
f (a,b,c)
与前面的例子相比,除了修改了名称和参数外,唯一不同之处为注释行
注释行用两条虚线“ - -”来标识,这样它
右边的所有项都将被V H D L编译器忽略。我们
将经常在文件清单中使用黑体字来强调注释
行以引起注意,因为它们对于理解文件清单
的结构很有用。一个尽职的V H D L作者将在
V H D L清单中加入许多注释来解释代码的细
节;这对于接下来且不可回避的调试工作特
别有用。记住,现在显而易见的事物在两个
星期后可能成为完全神秘的!
接下来,我们引人两个直接书写a r c h i t e c t u r e说明的方法。快速查看函数表说明G a t e _ 1仅
仅是一个O R函数
f = a + b ( 5 - 1 )
V H D L提供了几个可用于我们描述中的预定义的逻辑操作;这些预定义的逻辑操作列于图5 - 7
中,图中还有用法的例子和它们的标准解释。为了将此函数在a r c h i t e c t u r e说明中以描述,我
们构造出
其中该描述被命名为L o g i c,而实际运算使用语句
f <= a or b
来定义。标识的语法
Left <= Right
读作“ Left 以R i g h t的值赋值”。将它与结构说明结合在一起可为该模块提供一个完整的描
述。
图5-7 VHDL中并发运算
为了更多地实践,我们来构造图5 - 8所示两个模块对应的相类似的V H D L描述。在图5 - 8 a
中,模块的输出为N A N D运算
( 5 - 2 )
110 数字系统设计基础教程
下载
图5-6 逻辑门描述的例子
关键字例子含义
它是一个V H D L定义的运算。这样, G a t e _ 2可用V H D L清单描述为
类似地,我们可从真值表中看出图5 - 8 b中的G a t e _ 3等效于X N O R函数,即
( 5 - 3 )
这样,我们可将它描述为
图5-8 VHDL模块的另一个例子
这些简单的例子讲解了e n t i t y和a rc h i t e c t u re说明的基本思想,并为更为复杂的系统描述
打下了基础。
现在你应该会同意这一观点,上述的V H D L描述简单明了并易于阅读和理解。学习书写
第5章V H D L的基础概念111
下载
a) Gate_2模块b) Gate_3模块
V H D L代码只是一个学习关键字和语法,以及熟悉如何将语句组合在一起来描述网络的简单
问题。所需注意的是, V H D L最重要的方面就是用语法以独特的方式来定义模块。牢记这些
常识,我们现在可以通过讨论更为高级的概念来提高V H D L语句的功能。
5.2.1 并发运算
关键字运算符n o t , a n d , o r, x o r, n a n d , n o r和x n o r用于描述被称为并发运算的操作。并发运算的
含义是:运算可在不考虑任何其他时间限制的情况下进行。例如,若我们在一个a rc h i t e c t u re
说明中采用A N D 3语句
f <= x and y and z;
那么无论何时,只要输入x , y, z的状态改变,f 的值也会随之变化。
并发运算对于用V H D L描述模块是很有吸引力的,因为它们和标准布尔运算具有一一对应
的关系。但是,当它们在用V H D L构造更为复杂的逻辑函数时,应该注意它们的优先规则会
稍有不同。n o t运算的优先级最高;它首先被计算。剩下的函数与n o t相比具有较低的优先级,
但它们的优先级相同。特别地, o r和a n d具有相同的优先级。当在V H D L中遇到优先级相同的
运算符时,它们按从左到右的顺序进行运算。括号可用于增加运算组的优先级别。
为了理解上述结果,假设我们有如下的布尔运算
( 5 - 4 )
布尔表达式的书写规则表示, A N D运算具有比O R运算更高的优先级。这样,表达式暗示
的运算顺序将是先计算(b.c),然后再进行a+b . c运算。但是,在V H D L中等效的语句将要写成
其中,我们加入了括号以确保A N D函数首先进行运算。如果我们改用下面的运算表达式
那么,此函数将错误地计算为
( 5 - 5 )
一旦我们理解了优先级,在V H D L描述中用构造和使用并发语句都将变得十分简单。
例5 - 1
我们来写出下面布尔表达式的V H D L语句
( 5 . 6 )
因为A N D函数隐含的优先级高于O R函数,我们将所要求的赋值写作
注意
-C
对应的n o t c项不需要括号,因为n o t总是在a n d运算之前进行计算的。
例5 - 2
从上面的讨论中,我们可通过简单的翻译将V H D L语句
翻译成逻辑表达式
112 数字系统设计基础教程
下载
( 5 - 7 )
我们采用并发语句写出图5 - 8 b中G a t e _ 3的另一个可选的描述。读取真值表可以直接给出其S O P
形式
( 5 - 8 )
所以如果需要,我们可构造出如下等效的可选文件清单
此文件清单等价于前面的形式,并且使得我们不需要与X N O R运算相关联。
例5 - 3
考虑图5 - 9所示的逻辑级联。逻辑上,通过跟踪输入经过的逻辑门,我们可将输出构造为
( 5 - 9 )
我们可用并发语句构造出其V H D L清单
此程序可容易地扩展到任意逻辑门配置的情形。
图5-9 逻辑级联的例子
例5 - 4
我们再来讨论一个用此方法写出V H D L描述的简明扼要的例子。考虑图5 - 1 0所示的逻辑图。
它可用并发函数描述成如下代码
第5章V H D L的基础概念113
下载
需要牢记的重要思想是,逻辑流的结构是以直接的方式给出并发语句的。
图5-10 逻辑级联
5.2.2 标识符
在前面的例子中,我们已经介绍了几个标识符,比如G a t e _ 1和L o g i c。选择容易记忆或在
逻辑网络中具有直接含义的标识符是很有用的。
产生标识符时,我们必须遵守V H D L规定的一些规则。所有可用于V H D L标准版本的基本
规则可用下面的语句来总结。
• 标识符可由大写和小写字母( a到z和A到Z ),数字0到9,和下划线符号“_”组成。
• 每个标识符是一个字符串,并且可具有任意长度。
• 标识符的大小写不敏感。其含义是,大写和小写字母将解释成相同的。例如,标识符
O r _ g a t e _ 3和O R _ G AT E _ 3是相同的,它与O R _ G a t e _ 3等也是相同的。我们必须多加小心,
确保不会用相同的标识符表示不同的参数。
• 下划线“_”不可用于标识符的第一个和最后一个字符。同样,字母和数字必须用于下
划线的两边,等等。在一行中不允许使用两个或更多的下划线。
允许使用字符(比如短划线“ -”和重音符)的扩展集可在最新的版本中使用。上述规则对
于我们的应用来说已经足够了。
例5 - 5
下面是合法标识符的例子:
不合法标识符的一个例子为
114 数字系统设计基础教程
下载
因为它是以下划线开始的。相似地,
不可以被使用,因为它是以下划线结束的。
5.2.3 传播延迟
到现在为止,我们例子讨论的仅仅是对逻辑门的描述。我们可用多种方式来建立这些构
造和硬件(记住V H D L中的H )之间的联系。最容易理解的一种方式是包含了传播延迟tp的概念。
我们已经介绍过传播延迟tp。
考虑图5 - 11所示的N O T逻辑门。传播延迟tp是由构成此逻辑函数物理实现的器件和电路引
起的。通过在并发语句中使用关键字a f t e r后面跟着延迟值的方法,传播延迟可包含在V H D L
结构语句中。我们假设tp的值为2 n s,那么该模块可描述为
语句行
Result <=not x after 2ns;
的作用是首先计算补码c,然后,在经过2纳秒( 2 n s )后将补码的值赋值给R e s u l t。
图5-11 带有传播延迟的反相器
这一类延时语句可用于描述多输入的模块,比如,图5 - 1 2所示的A N D 3逻辑门。假设tp的
值为5 n s。我们可将传播延迟包含在下面所示的清单中
第5章V H D L的基础概念115
下载
图5-12 AND3的传播延迟
与N O T门一样,输出O u t _ a n d值的改变都是输入改变被延迟了5 n s的结果。需要牢记的是
传播延迟的实际值是由工艺(比如I C的种类,如C M O S或T T L )及前面讨论过的其他因素决定
的。
例5 - 6
我们来做做练习,解释几个V H D L语句。考虑下面的描述
1 n s;
这是一个简单的带有1 n s延迟的X O R门。类似地,
2 . 7 5 n s;
是一个带有2 . 7 5 n s输出延迟的“复合”逻辑门,它实现的函数为
这是出现在一些电路中一种特殊的逻辑门;它只有一个“门”,但它能够完成多于一个原
语的运算。这些逻辑门和其他逻辑门将在第6章中出现。
上面介绍的延迟在V H D L中称为惯性延迟模型。该名称来源于电子逻辑门需要一小段时间
来对电路中的能量移动进行反应。惯性延迟在V H D L中非常普遍,它是逻辑门延迟时间的缺
省模型。
V H D L是一门内容非常丰富、功能强大的语言。它具有来自于许多基本情形的多个变种,
允许数字设计者构造更为精确的计算机模拟。在数字电子学中,存在着影响网络整体性能的
其他类型的信号延迟。V H D L可以识别这些情形并提供其他类型的延迟模型。
传输延迟与沿着互连导线的延迟有关。延迟的具体值随着导线的长度以非线性的方式增
大。硬件设计者都努力减少导线的传输延迟,使得传输延迟与逻辑门的传播时间相比可以
忽略不计。但是随着一代一代电子系统的体积的逐渐缩小,在现代电子系统中传输延迟变得
越来越重要。传输延迟的V H D L语句采用的形式为
output <= t r a n s p o rt(X)a f t e r 1 0 p s ;
此式描述的是信号X经过1 0皮秒的延迟后移到输出端,其中, 1 p s = 1 0- 1 2s。
5.3 结构建模
复合逻辑网络是通过将逻辑门与其他基本单元组合起来构成的。逻辑模块的V H D L结构描
述是以相同的概念为基础的。较大的逻辑是通过将较简单的模块连接在一起产生的。这种方
法很有吸引力,因为它符合我们学习数字逻辑的基本原理。
116 数字系统设计基础教程
下载
互连延迟在第7章奖用物理观点加以讨论。
我们来讨论结构模型如何应用于图5 - 1 3所示的A O I电路。该原理图通过其本质展示了其结
构:A O I是通过将两个A N D门( G 1和G 2 )级联到O R门( G 3 )构成的。由于我们习惯于追踪经过这
种原理图的逻辑信号流,通过观察,我们将输出写出为
( 5 . 1 0 )
当然,它是通过注意到A N D门产生下面的输出得到的
( 5 . 11 )
将上式作为O R门的输入,得到
( 5 . 1 2 )
X1 ,X2 ,和f 这三个等式提供了逻辑网络的基本结构,因为它们提供了按其最初呈现的形式
来准确地重构逻辑图所需的信息。结构模型采用相同的概念来书写。
V H D L结构模型通过首先引进称为器件(c o m p o n e n t)的构造模块来产生。它是一个已经在
通常的e n t i t y和a rc h i t e c t u re清单中定义过的逻辑模块,它可用于产生其他的逻辑网络。我们
总是将c o m p o n e n t看成一个简单的构造模块而不考虑它内部
的复杂度。为了产生一个结构模型,我们首先选择好器件,
然后描述器件如何连接在一起。连线关系可通过映射模块端
口的正规清单来确定。
我们应用这些概念来写出图5 - 1 3所示A O I _ N e t w o r k模块的
结构描述。这要求在我们的V H D L 词汇中引人关键字
component, signal和p o rt map等。由于这些概念相对简单明
了,我们首先给出说明的清单,然后再来研究新项目的细节。
黑体字注释行用于隔离主体部分。
第5章V H D L的基础概念117
下载
AOI_Network
图5-13 结构建模的例子
现在,我们来讲解上面语句清单中引进的新概念。新概念中的第一个是c o m p o n e n t说明,
例如
在此网络中为了将模块作为一个器件来使用,模块必须在前面事先使用e n t i t y和
a rc h i t e c t u re语句进行定义。其含义是我们需在网络完整的V H D L清单中包含类似于下面的说明
c o m p o n e n t的概念可以通过设计库(design library)的概念来理解。设计库是一个不同模块
的集合,其中每个模块都通过e n t i t y和a rc h i t e c t u re语句进行定义。单元一旦在库中进行定义,
我们就可以在设计中通过c o m p o n e n t命令使用该单元的“副本”。此过程称为“示例” 该单
元,而器件本身称为原始的实例。
图5 - 1 4画出了库和示例的概念。注意实例从库中“取出”单元是不相同的。相反,实例
可看成是当前存储在库中的单元的字面上的副本。其含义为如果我们改变库中的单元,那么
118 数字系统设计基础教程
下载
以及
所有的示例将相应地改变。单元可按我们所希望的在网络中引用许多次。在构造复合的网络
时,示例的引用节约了时间并减少了工作量。这很容易理解,因为库的项目仅需要定义一次。
图5-14 从单元库中引用示例
接下来我们讨论关键字s i g n a l在的下面语句行中的用法。
s i g n a l X1 ,X2 : b i t ;
此式用于定义内部的标识符X1和X2,在原始逻辑图中X1和X2用于定义A N D 2门G 1和G 2的
输出。S i g n a l定义不同于p o rt语句中使用的标识符之处在于它们存在于模块中。内部的标识符
被用于将逻辑门连接在一起形成p o rt连接。
器件一旦被说明,网络就可通过使用p o rt map语句来描述。这样通过确定器件信号接口
情况就可以提供“布线图”的信息。我们来讨论下面各项的细节
--The port maps specify the internal wiring
b e g i n
G1:AND2 p o rt map (a, b, X1) ;
G2:AND2 p o rt map (c, d, X2) ;
G3:OR2 p o rt map (X1, X2, f ) ;
第一个映射
G1:AND2 port map (a, b, X1) ;
告诉我们逻辑门G 1是一个A N D 2器件,它被连接到端口标识符a,b及内部信号X1上。在
A N D 2器件的语句中,信号的顺序给出为(u,v,q),它对应于输入1输入2和输出的用法。端口映
射(a,b,X1 )保持这个隐含的顺序。类似地,
G2:AND2 p o rt map (c,d,X2) ;
是另一个A N D 2实例,它将A O I模块的输入c和d映射到A N D 2门的输入并产生一个输出X2,最

G3:OR2 p o rt map (X1, X2, f ) ;
表示G 3使用内部信号X1和X2作为O R 2实例的输入并提供模块A O I _ N e t w o r k的输出。这样
就结束了结构清单讨论。
通过写出图5 - 1 5所示的N e t w o r k _ e x的V H D L清单,我们来讨论结构建模的另一个例子。该
模块有5个输入a , b , c , d和e及两个输出f1和g2。它的结构描述可写成
第5章V H D L的基础概念119
下载
库中的主单元
实例
网络= 已连接的实例
图5-15 端口映射的例子
120 数字系统设计基础教程
下载
注意常规的器件Gen_1 和G e n _ 2必须用e n t i t y结构在其他地方进行定义,使得它们的输
入-输出关系是已知的。
这些例子说明了如何用一个个器件来构造出网络,使结构描述与标准的数字逻辑直接联
系起来。对于给定的网络,写出它的V H D L描述是一个十分简单的事情。类似地,逻辑图也
可以从V H D L描述中直接提取出来。这就为V H D L和前面讨论中所学的概念之间提供了至关重
要的联系。注意通过修改器件的定义来引进传播(惯性的)延迟是一个非常简单的事情。
5.4 条件建模
只要熟悉高级编程语言,比如P a s c a l语言或C语言,任何人都应已经了解条件转移结构的
用处。V H D L允许使用多种条件语句来构造仅仅基于模块本身行为的结构说明。
考虑图5 - 1 6所示的是称为E q u a l s的模块。根据功能表的定义,当输入a和b相等时输出s a m e
等于1,但是如果它们不相等,那么s a m e = 0。V H D L中的条件语句允许我们在某些条件满足时
将某个值赋值给一个信号。对于这种情形,我们可将E q u a l s的说明写成
图5-16 相等检测器模块
在书写结构描述的时候,我们采用了下面的通用结构来引进一个判断行
上式中,如果C o n d i t i o n为真,那么i d e n t i f i e r的值为1;如果条件不满足, i d e n t i f i e r = 0。在
当前的例子中
如果输入相等,那么赋值s a m e = 1,否则s a m e等于0。这与功能表中所确定的结果完全一样。
这类结构使得我们可以在不知道模块内部细节的情况下写出V H D L描述。例如,假设我们
有一个如图5 - 1 7所示的单独定义的功能表。虽然我们可以用标准的开关代数来确定函数
第5章V H D L的基础概念121
下载
g(x , y, z),但是我们也可以用w h e n - e l s e结构来产生如下所示的V H D L描述:
图5-17 使用功能表的模块定义
这种方法是“强制的”,因为我们刚才列出了所有给出输出g= 1情况下的输入条件。由于
它没有闭式布尔方程的简洁性,故易于构造和使用。它通常是验证网络操作最简捷的方式。
例5 - 7
考虑下面所示的函数。这个单元称为A d d,因为(我们将在第八章看到)它进行的是加法
运算。现在我们根据功能表的描述将它看成3-输入(a , b和c i),2-输出(s和c o)的模块。
其数据图描述可构造如下。
122 数字系统设计基础教程
下载
输入输出
end Dataflow;
我们将在第7章中学到,有更多可用来描述函数的精确方法。但是其中数据图方法十分有
用,因为用此方法我们不需要了解函数本身更多的细节。即使我们手头上没有逻辑表达式,
它也可以被采用。
细心的读者可能已经注意到上述语句中c o n d i t i o n的用法与前面定义的b i t标识符类型是不
同的。b i t是一个二进制数,它只有‘ 0’和‘1’这两个值。然而c o n d i t i o n严格分类为B o o l e a n
类型的的数,它只有“ Tr u e”和“ F a l s e”这两个值。V H D L通过t y p e说明来定义标识符可能
具有的值。
我们已经使用了b i t作为预定义的数据类型。如果我们希望正式地定义b i t,那么我们使用
如下形式的列表
t y pe bit i s (‘0’,‘1’);
它将b i t定义为只有‘ 0’和‘ 1’这两个值的数。上述的逻辑语句归类为具有不同特征值
的B o o l e a n类型的数。布尔参数定义为
t y p e boolean i s ( FA L S E , T R U E )
在更为复杂的情形下其他的t y p e参数也十分有用。
布尔条件采用关系运算符进行计算,比如运算符“ =”。V H D L定义的关系运算符由图5 - 1 8
给出;这些运算符具有常见的含义,使得它们易于记忆。当关系运算与逻辑运算同时(比如
n o t和o r)用于表达式时, n o t总具有最高优先级,其后紧跟着关系运算。其余的逻辑运算符
a n d , o r, n a n d , n o r, x o r和x n o r的优先级别最低。当然,我们可以使用括号来确保V H D L语句准确
地反映正确的逻辑。
图5-18 VHDL关系运算符
第5章V H D L的基础概念123
下载
运算符含义
不等于
大于
小于
大于或等于
少于或等于
等于
end Dataflow;
5.5 二进制字
基本逻辑运算是用单独的二进制位来进行的。但是,由于单个二进制位只能表示两个值
( 0或1 ),而n - b i t二进制字具有2n种不同的值,所以它在实际的应用中更为有用。后面我们将看
到,二进制字通常作为单个对象来看待,而不把它看成一组单个的二进制位。V H D L允许我
们用二进制位的阵列来处理二进制字,极大地简化了V H D L代码。
考虑作为图5 - 1 9所示模块输入的4 b i t二进制字
I n_a=a3 a2 a1 a0
该模块的输出为单个二进制位x,为描述这种结构,我们引进b i t _ v e c t o r概念,其中I n _a用
它们的下标数来确定,与p o rt清单所示的一样。
上式将I n _a定义为具有4个分量,这些分量用索引d o w n t o命令以下降的顺序标记为
I n _a( 3 ) =a3
I n _a( 2 ) =a2
I n _a( 1 ) =a1
I n _a( 0 ) =a0
一旦用此命令定义了顺序,单个二进制位的顺序就不能被改变。
图5-19 bit_vector输入的例子
现在我们用b i t _ v e c t o r的概念来描述图5 - 2 0所示的模块。其输入为4 b i t二进制字I n _a和I n _b,
而输出为4 b i t二进制字。
O u t = I n _a O R I n _b
其中O R运算隐含着索引功能。其含义是O u t为4 bit 二进制字,各个二进制位的值为
O u t ( 3 ) = I n _a(3) O R I n _b( 3 )
O u t ( 2 ) = I n _a(2) O R I n _b( 2 )
O u t ( 1 ) = I n _a(1) O R I n _b( 1 )
O u t ( 0 ) = I n _a(0) O R I n _b( 0 )
图5-20 向量模块
V H D L模块Wo r d _ O R可用下面的V H D L清单来描述。
124 数字系统设计基础教程
下载
图5 - 2 1清楚地表示了具有所有位的等效的网络。
图5-21 Word_OR模块的细节
b i t _ v e c t o r的单个元素可在单独的运算中使用。图5 - 2 2所示的逻辑网络B i t _ o p s两个函数f1
和f2是由两个输入中不同的位产生的。此模块的V H D L清单可写为
用b i t _ v e c t o r描述构造阵列的方法为V H D L提供了一个十分有力的工具。
图5-22 另一个bit_vector模块的例子
第5章V H D L的基础概念125
下载
bit_vector (3 downto 0);
in bit_vector (3 downto 0);
bit
f1
f2
5.6 库
库的概念十分有效。所有V H D L模拟程序包都包含有不同的库以减少设计者的负担。库是
预定义的参数和过程的集合。V H D L编译器使用这些参数和过程来解释其代码。库在V H D L清
单中所采用语句形式为
L i b r a ry L i b r a r y _ n a m e ;
例如,一个特别有用的标准库称为I E E E;它的含义是电气和电子工程师协会(Institute of
Electrical & Electronics Engineers(I E E E) ),它是电气和电子工程师的专业协会。I E E E库通过
下面的形式来引用。
L i b r a ry i e e e ;
一旦库被引用,库中的任何定义均可用于书写数字系统的V H D L描述。
库中实际包含了什么呢?从类型的基本定义和基本的物理单元到预设计的大逻辑模块,
所有的一切都可直接示例到你的设计中。举个例子, i e e e库中包含了这样的项
• 类型标识符,比如b i t和b o o l e a n
• 时间单位n s,p s的定义,以及其他有用的比例值。
这些信息都包含在称为程序包的小组中;上述的这些项可在i e e e库中的s t a n d a r d程序包中
看到。一个特别有用的程序包称为IEEE 11 6 4,它是以V H D L语言定义为基础的。它定义了便
于书写V H D L代码的类型和函数,并且通常包含在i e e e库中。其中定义的项有
• 信号类型,比如‘0’和‘1’
• 对a n d , o r, n o r和所有其他基本逻辑的基本函数运算。
• b i t , v e c t o r s和b i t _ v e c t o r s
它集成化地提供了功能强大的定义的集合。
为了引用i e e e库和IEEE 11 6 4程序包,我们将V H D L描述初始化为
l i b r a ry i e e e ;
u s e i e e e . s t d _ l o g i c _ 11 6 4 . a l l ;
使用IEEE 11 6 4程序包时会发生一个变化,就是我们对信号类型用不同的符号来表示。特
别地,
• b i t用s t d _ u l o g i c来代替
它允许我们从b i t改变到更为有用的s t d _ u l o g i c,b i t只有两个值(‘0’和‘ 1’) ,而s t d _
u l o g i c有九个可能的值
‘0’=强制0
‘1’=强制1
‘X’=强制未知
‘Z’=高阻(开路)
‘W’=弱未知
‘L’=弱0
‘H’=弱1
‘U’=未初始化未知
‘-’=无关
126 数字系统设计基础教程
下载
读者将会找到基本逻辑设计中出现的无关条件。出于对硬件方面的考虑,剩下的6个值都
是变量。举个例子,假设电子学中将理想的逻辑1定义为值为5 V的电压。“弱1”将为一个高
电压,但不是理想值;例如,从电子学的角度来讲,值为3 . 8 V的电压值可合格地表示“弱1”。
与此相类似,我们注意到对于IEEE 11 6 4程序包,
• b i t _ v e c t o r可以用s t d _ u l o g i c _ v e c t o r来代替
上式中向量的每个分量具有相同的变量范围。
一旦引用了库,V H D L描述就可使用其中定义的任何参数。到目前为止我们讨论的规则和
例子仍然有效。但是使用程序包可使建模更为通用。
考虑下面的例子。
此V H D L 清单的主体与前面的例子具有相同的形式,只是现在使用了库信号类型
s t d _ u l o g i c。
如果你正在实验室使用V H D L编译器程序包,那么你应查看其相应的文档以学习更多的库
和库中所包含的内容。你将会发现各种各样的结构以及商业设计已被预定义,应用它们是现
成的。另外,你应认识到你正在开发定义模块技巧,而这些模块可用于构造你自己的库。
5.7 VHDL的学习
与任何语言一样,学习V H D L需要实践。你实践得越多,它就会变得越熟悉和自然。我们
鼓励你尽可能地多写简单网络的代码,将编译后的系统保存起来以备将来使用。随着对数字
系统设计的学习的深入,我们将学到其他V H D L结构。
在计算机实验室中尽可能地去使用V H D L编译器;随程序一块提供的文档可提供操作编译
器需要了解的细节。没有比动手练习更好的方法来学习V H D L,所以尽管利用好的学习机
会!如果你想把数字逻辑设计作为你的专业,那么我们强烈推荐你学习完整的V H D L课程来
加强在此科目的背景知识。
5.8 问题
1. 写出由下面的图P 5 - 1真值表定义的模块G a t e _ X所对应的VHDL entity和a r c h i t e c t u r e描
述。
第5章V H D L的基础概念127
下载
图P5-1
2. 写出由下面的图P 5 - 2真值表定义的模块E x c l _ 2所对应的VHDL entity和a r c h i t e c t u r e描述。
图P5-2
3. 用并发运算写出下面布尔函数的V H D L语句。
4. 用并发运算语句写出下面布尔函数的V H D L语句。
5. 用并发运算语句写出下面布尔函数的V H D L语句。
6. 求出下面V H D L语句对应的最简布尔方程。
7. 将下面的V H D L语句翻译成布尔表达式。
8. 用并发语句构造出描述图P 5 - 3所示逻辑图的V H D L清单。
图P5-3
9. 用并发语句构造出描述图P 5 - 4所示逻辑图的V H D L清单。
图P5-4
10. 用并发语句构造出描述图P 5 - 5所示逻辑图的V H D L清单。
图P5-5
128 数字系统设计基础教程
下载
11. 考虑下面图P 5 - 6所示的逻辑级联。图中“ X s”是内部结点的标签,而“ G s”用于对逻
辑门进行编号。用端口映射写出此网络的V H D L描述。
图P5-6
12. 用V H D L向量语句构造描述图P 5 - 7所示网络的V H D L清单。
图P5-7
13. 用向量语句构造描述图P 5 - 8所示网络的V H D L清单。
图P5-8
14. 用数据图方法构造描述图P 5 - 9所示网络的V H D L清单,并尽你所能产生最简单的清单。
图P5-9
第5章V H D L的基础概念129
下载
15. 用数据图方法构造描述图P 5 - 1 0所示网络的V H D L清单,并尽你所能产生最简单的清
单。单元的名称提供了简单步骤的暗示。
图P5-10
16. 用数据图方法构造描述图P 5 - 11所示网络Z e r o的V H D L清单,并尽你所能产生最简单的
清单。单元的名称提供了简单步骤的暗示。
图P5-11
17. 考虑用作数字网络输入的两个向量
A=a3a2a1a0
B=b3b2b1b0
我们希望定义一个电路,它的输出c o m p a re由下面的语句来定义:
c o m p a re =1 i f a3 = b3
a2 = —b2
a1 = b1
a0 = —b0
e l s e c o m p a r e = 0 .
写出此数字单元的V H D L描述。
130 数字系统设计基础教程
下载 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包括如下100例有关的VHDL描述文件,但解压后只有94例,其他部分错误 第1例?带控制端口的加法器 袁 媛(1) 第2例?无控制端口的加法器 袁 媛(4) 第3例?乘法器 袁 媛(6) 第4例?比较器 袁 媛(8) 第5例?二路选择器 袁 媛(11) 第6例?寄存器 袁 媛(13) 第7例?移位寄存器 袁 媛(16) 第8例?综合单元库 袁 媛(22) 第9例?七值逻辑与基本数据类型 袁 媛(29) 第10例?函数 袁 媛(32) 第11例?七值逻辑线或分辨函数 袁 媛(35) 第12例?转换函数 袁 媛(38) 第13例?左移函数 袁 媛(40) 第14例?七值逻辑程序包 袁 媛(42) 第15例?四输入多路器 陈东瑛(51) 第16例?目标选择器 吴清平(57) 第17例?奇偶校验器 陈东瑛(61) 第18例?映射单元库及其使用举例 陈东瑛(69) 第19例?循环边界常数化测试 陈东瑛(75) 第20例?保护保留字 袁 媛(77) 第21例?进程死锁 刘沁楠(79) 第22例?振荡与死锁 袁 媛(81) 第23例?振荡电路 刁岚松(83) 第24例?分辨信号与分辨函数 袁 媛(87) 第25例?信号驱动源 刘沁楠(92) 第26例?属性TRANSACTION和分辨信号 陈东瑛(96) 第27例?块保护及属性EVENT,STABLE 陈东瑛(101) 第28例?形式参数属性的测试 刘沁楠(104) 第29例?进程和并发语句 刁岚松(107) 第30例?信号发送与接收 刁岚松(111) 第31例?中断处理优先机制建模 吴清平(113) 第32例?过程限定 刘沁楠(116) 第33例?整数比较器及其测试 刘沁楠(119) 第34例?数据总线的读写 刁岚松(129) 第35例?基于总线的数据通道 李 春(134) 第36例?基于多路器的数据通道 李 杰(148) 第37例?四值逻辑函数 袁 媛(152) 第38例?四值逻辑向量按位或运算 刁岚松(156) 第39例?生成语句描述规则结构 袁 媛(159) 第40例?带类属的译码器描述 袁 媛(164) 第41例?带类属的测试平台 袁 媛(169) 第42例?行为与结构的混合描述 袁 媛(171) 第43例?四位移位寄存器 .刘沁楠(174) 第44例?寄存/计数器 袁 媛(185) 第45例?顺序过程调用 陈东瑛(189) 第46例?VHDL中generic缺省值的使用 王作建(191) 第47例?无输入元件的模拟 王作建(196) 第48例?测试激励向量的编写 袁 媛(201) 第49例?delta延迟例释 吴清平(206) 第50例?惯性延迟分析 吴清平(210) 第51例?传输延迟驱动优先 陈东瑛(213) 第52例?多倍(次)分频器 刁岚松(216) 第53例?三位计数器与测试平台 刘沁楠(220) 第54例?分秒计数显示器的行为描述 陈东瑛(226) 第55例?地址计数器 陈东瑛(234) 第56例?指令预读计数器 吴清平(242) 第57例?加、减、乘指令的译码和操作 吴清平(245) 第58例?2-4译码器结构描述 刘沁楠(248) 第59例?2-4译码器行为描述 吴清平(255) 第60例?转换函数在元件例示中的应用 王作建(258) 第61例?基于同一基类型的两分辨类型的赋值相容问题 王作建(261) 第62例?最大公约数的计算 刁岚松(266) 第63例?最大公约数七段显示器编码 吴清平(269) 第64例?交通灯控制器 吴清平(272) 第65例?空调系统有限状态自动机 刁岚松(276) 第66例?FIR滤波器 谢 巍(280) 第67例?五阶椭圆滤波器 刘沁楠(290) 第68例?闹钟系统的控制器 张东晓(302) 第69例?闹钟系统的译码器 陈东瑛(311) 第70例?闹钟系统的移位寄存器 陈东瑛(315) 第71例?闹钟系统的闹钟寄存器和时间计数器 陈东瑛(317) 第72例?闹钟系统的显示驱动器 陈东瑛(322) 第73例?闹钟系统的分频器 陈东瑛(325) 第74例?闹钟系统的整体组装 张东晓(327) 第75例?存储器 李 春(333) 第76例?电机转速控制器 张俭锋(337) 第77例?神经元计算机 袁 媛(343) 第78例?Am2901四位微处理器的ALU输入 韩 曙(347) 第79例?Am2901四位微处理器的ALU 韩 曙(353) 第80例?Am2901四位微处理器的RAM 韩 曙(359) 第81例?Am2901四位微处理器的寄存器 韩 曙(363) 第82例?Am2901四位微处理器的输出与移位 韩 曙(365) 第83例?Am2910四位微程序控制器中的多路选择器 韩 曙(370) 第84例?Am2910四位微程序控制器中的计数器/寄存器 韩 曙(374) 第85例?Am2910四位微程序控制器的指令计数器 韩 曙(379) 第86例?Am2910四位微程序控制器的堆栈 韩 曙(382) 第87例?Am2910四位微程序控制器的指令译码器 韩 曙(390) 第88例?可控制计数器 韩 曙(399) 第89例?四位超前进位加法器 韩 曙(406) 第90例?实现窗口搜索算法的并行系统(1)--协同处理器 李 杰(410) 第91例?实现窗口搜索算法的并行系统(2)--序列存储器 李 杰(416) 第92例?实现窗口搜索算法的并行系统(3)--字符串存储器 李 春(419) 第93例?实现窗口搜索算法的并行系统(4)--顶层控制器 李 春(422) 第94例?MB86901流水线行为描述组成框架 石 峰(428) 第95例?MB86901寄存器文件管理的描述 石 峰(434) 第96例?MB86901内ALU的行为描述 石 峰(437) 第97例?移位指令的行为描述 石 峰(440) 第98例?单周期指令的描述 石 峰(442) 第99例?多周期指令的描述 石 峰(445) 第100例? MB86901流水线行为模型 石 峰(458)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值