版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.1VHDL语言设计概述6.2VHDL可编译源设计单元6.3VHDL语言基础知识6.4时序语句与行为描述6.5信号与信号赋值6.6并发行为性语句与数据流描述6.7元件层次与结构描述6.8VHDL设计举例6.9课程设计复习第6章VHDL系统设计语言
6.1VHDL语言设计概述
6.1.1简介
1962年,Iverson首先提出硬件描述语言(HDL)的概念。经过淘汰选择,本书介绍的VHDL和VerilogHDL已经成为被普遍接受的硬件设计语言标准。电子设计手段的更新换代历经了一次否定之否定的螺旋式前进历程:从计算机早期阶段的文本输入,发展到图形输入,又发展到现在的文本描述与图形输入并存的局面。
属于文本形式类的新型硬件设计语言还有SystemC、SystemVerilog;另一种属于图形类的便捷设计输入方式则是采用高层原理方框图的图形描述技术。
1.VHDL名称与功能
VHDL(VHSIC硬件描述语言,VHSICHardwareDescriptionLanguage)是一种电子工程设计师用来设计硬件系统与电路的高级语言。其中,VHSIC是指美国国防部(DOD)1978年制定的总预算为2.1亿美元的七年超高速集成电路(VeryHighSpeedIntegratedCircuit)发展计划。该计划要求1986年美国的VHSIC实现亚微米工艺,芯片规模大于25万门,速度提高100倍以上。1981年成立VHDL工作组;1983年由IBM、TI、Intermetrics等公司组成VHDL开发组。1986年IEEE标准化组织开始审定VHDL标准。美国最初制定VHDL语言标准的初衷是提供一种描述电子硬件系统的手段,用于复杂电子产品开发、技术交流和文件归档。其目的是加速VHSIC器件和电子系统的研制。
目前,VHDL已经发展成为设计师实现设计创建描述(输入—归档—交流—修改)、设计模拟仿真(验证)、设计综合、设计测试等贯穿设计全过程四种功能的标准语言。它已经得到EDA及ASIC厂商的普遍支持。
采用VHDL进行设计,可以立刻得到新方案的仿真结论。但是,VHDL并不是全部可综合的,可以被综合的只是一个子集。
2.VHDL的标准化历程
VHDL从问世起,就一直以标准系列的载体形式记录着它的发展和逐渐成熟的历程。下面按照时间顺序列出一些典型的相关标准。
(1)早在1987年12月,VHDL被确定为标准的最初版本IEEEStd1076-1987。本书中简写为IEEE-1076-1987,或IEEE-1076。
(2) VHDL同时也是美国军方的MilStd-454L标准。
(3)经过对最初版本的使用和修订之后,1993年美国国家标准局(ANSI)和IEEE给出VHDL的新版本ANSI/IEEEStd1076-1993。2002年IEEE设计自动化委员会又推出IEEEStd1076-2002新版本(详见参考文献IEEEStandardVHDLLanguageReferenceManual.2002及附录1)。
(4)其中可综合的子集部分被汇编成标准文本IEEE-1076.6/D2.0。
(5)多值逻辑系统集合包于1993年被确定为与VHDL主标准相配套的IEEE-1164-1993标准。
(6)标准数学运算集合包,包括Math_real和Math_complex两个集合包,于1996年被确定为附属标准IEEE-1076.2。
(7) VITAL(VHDLInitiativeTowardsASICLibraries)是ASIC仿真时的延迟参数格式标准,用于建立库参数模型(LPM,LibraryParameterModel),于1995年被确定为附属标准IEEE-1076.4。
(8)根据IEEE-1076-1993,1995年国家技术监督局推荐VHDL为我国EDA硬件描述语言的国家标准。之后,在2001年制定了国内的电子设计硬件描述语言VHDL标准SJ20777-2000。
3.VHDL的优点
采用VHDL语言进行硬件系统与电路设计,具有如下一些优点。
1)支持多种设计方法和技术
VHDL支持多种设计方法和技术,已经得到EDA厂商的广泛支持。所支持的设计方法包括:自上而下的设计和基于库的设计。所支持的设计技术包括:同步设计和异步设计等。
2)支持高复杂度的描述与设计
VHDL支持各种规模级别复杂度、行为和逻辑结构两个层次描述的设计,可以包括从系统级描述(行为或结构)到寄存器转移级(RTL)描述,再到门级逻辑网表结构详细描述。它是SOC系统集成设计的得力工具。利用元件这一抽象机制,VHDL支持并行开发策略,支持多层次的混合仿真。
3)设计活动具有独立性
VHDL独立于EDA软件工具之外,便于学习。但这个语言标准又得到了所有EDA厂商的广泛有力支持。
4)与制造工艺独立
VHDL不针对物理结构进行描述,它与制造工艺技术相对独立,但设计师可以用VHDL编写部分工艺信息。
5)标准化的一次成功实践
VHDL完全是人为制造出来的一种设计语言标准,已经使得设计活动中的各种衔接关系得到改善和简化。它的采用推动了电子设计的交流、存档和复用。
VHDL提供的复用手段包括:集合包、配置、子程序、元件、一个实体号对应多个构造体等。6.1.2设计单元和库
1.四种源设计单元
VHDL中有以下四种可编译的源设计单元:
(1)实体号(EntityDeclaration)。
(2)构造体(ArchitectureBody)。
(3)集合包(Package,分为包说明Declaration和包体Body两部分)。
(4)配置(ConfigurationDeclaration)。
2.库内容
采用VHDL进行设计活动时,需要用到库(Library)。库不是VHDL的源设计单元,它是存放源设计单元的场所,其存放的内容分为以下几类:
(1)当前设计的上述四种源设计单元。
(2)已有的用户设计库。
(3)集合包STANDARD、TEXTIO等。
(4) ASIC厂商提供的库。
(5) EDA厂商提供的库。
这里所列五类库的内容(1)、(2)、(3)、(4)、(5)与设计活动的关系如图6-1所示。图6-1VHDL设计中库的作用6.1.3表现手法
VHDL表现电路设计的手法主要有两种:电路逻辑结构网表和电路功能行为描述。VHDL为了能在系统行为层次表现算法,扩展了实数数据类型。
我们在表1-1的基础上加以修改,将VHDL语言的表达能力用表6-1表示。下面分别做一介绍。
1.表征电路结构网表
可以用VHDL结构风格中的元件(Component)及实例生成连接关系来描述逻辑电路网表。
2.表征系统行为
也可以用VHDL表征系统的行为,例如用并发行为性语句
A<=B+Cafter5ns;
给出整数A、B、C之间的运算关系。
VHDL对大、小写不加区别,上述语句与A<=b+cafter5NS;是一样的。
3.表现实数域运算算法
VHDL中也定义有实数(浮点数),但是它主要是用来描述模拟量和研究算法的。
这样,在概念设计时可以允许有不同的表征层次,包括:系统、算法行为、寄存器转移结构、单位延迟门和详细时序门等。在真正硬件实现时,需要再改造为可综合的设计,包括用定点数来完成计算等。6.1.4VHDL开发环境
目前,几乎所有的EDA工具都拥有VHDL的开发环境。以比较简单易用的V-System为例,设计开发的基本步骤如下。
1.编辑编译
使用编辑(Editor)工具,设计出VHDL的源设计文本。再将源设计文件进行编译(Compilier),可以得到源程序中语法方面的出错信息。
2.仿真硬件
V-System(后来发展为ModelSim)开发环境的主体是模拟仿真器(Simulator),用仿真器对编译好的源设计单元进行模拟仿真。可以用仿真器的命令给出仿真用的激励,也可以直接用VHDL来编写激励。对用VHDL编写的程序进行仿真,和对用一般软件语言编写的程序进行仿真,具有如下的不同之处。
(1)模拟时间——在VHDL中引入“模拟时间”的概念来模拟真实硬件实际运行时所花费的时间;模拟VHDL程序段对应的硬件运行时间。它用时间步长规定了相对时间、绝对时间等序列。程序按模拟时间运行,互相间的延迟也按模拟时间计算。
(2)并发性——并发性是模拟真实硬件运行时的重要概念,这一点也不同于一般的软件语言程序。如果设计中有几个加法器,它们将随着模拟时间的增长并行工作,其中的每个加法器都是在输入到来后就并行运行。这与硬件电路实际工作情况是一致的。
3.结构化关系
所谓结构层次化设计,主要是指结构描述手法。VHDL用实例生成(Instantiation)完成在构造体中对元件的调用和装配。
类比于一般软件程序语言设计中的主程序与子程序的关系,VHDL语言则体现在构造体设计中的实例生成与元件的关系。
4.配置手段
可以用不同的配置形成不同的设计版本;模拟用的不同模型也以不同配置的形式出现,详见参考文献——薛宏熙等著《数字系统设计自动化》。
6.2VHDL可编译源设计单元
前面介绍过的四种可编译源设计单元,也可以将其称之为VHDL中的四大构件(Construct)。它们的基本功能是:
(1)实体号——描述设计的信号接口界面(即子设计元件或总设计的I/O界面)。
(2)构造体——指定设计的真实行为性能和结构。
(3)集合包——将常用的数据类型、常数、说明这一类约定和子程序等设计模块集中存放。这样,对于其他设计而言,它们是可见的和可共享的。
(4)配置——用于从库中选取单元来搭配组合成不同的设计版本,是通过指派来建造新设计体的一种手段。
此外还有库,它本身不是源设计单元,它用来存放源设计单元,它是设计时的仓库。
下面先给出VHDL设计文件示例mine.vhd。
packagemy_defsis--实际上包标题应该已经设计好并事先放入freds_library中
constantunit_delay:time:=1ns;
endmy_defs;
entityCOMPAREis
port(a,b:inbit;
c:outbit);
endCOMPARE;
libraryfreds_library;
Usefreds_library.my_defs.all;
architectureflowofCOMPAREis
begin
C<=NOT(axorb)afterunit_delay; --“同或门”
构成
endflow; --等值比较器集合包my_defs给出了可以共享的常数。
实体号COMPARE为设计和信号端口命名。
构造体flow给出了设计细节。
按默认的规定,最新编译的构造体就是当前的默认配置,所以COMPARE的一个配置就是flow。备注:
所有的VHDL源文件文本都可以采用--…做为注释方法!它由两个连字符--开头组成一个注释内容为…的注释行。若一行写不下,可以再用两个连字符--增加一行注释行。中英文都行,注释并不影响程序的编译和仿真。
在本章关于VHDL的句法描述中,用定义符::=表示定义符左边的项由右边的表达式来定义;用竖杠符号∣分隔多个选项;用[…]表明方括弧内的项是可选项;用{…}表明花括弧内的项可以重复0次或多次。
另外,VHDL语法认为源文件中的大小写字母是一样的,例如not与NOT是相同的。
为了醒目起见,在设计举例中,我们将四种源设计单元中用于起始、结束的字符和其他所有的保留字都用黑体表示。6.2.1库
1.分类
如前所述,库(Library)是放置源设计单元的仓库。库中的内容包括:
(1)通用集合包库——标准集合包STANDARD,文本I/O函数TEXTIO集合包。为了提高生命力,标准化组织已经扩展了不少集合包。
(2)用户库WORK——用户设计源文件,包含集合包,由用户自己不断充实完善。
(3) ASIC厂商库——这里是经过验证的设计,包括门电路等都是库中的元件。
(4) EDA厂商库——有函数集合包,例如求平方根等。
2.库规则解释
(1) VHDL编译的结果存放在某一个用户库中,库可以包括上述四种源设计单元。
(2) VHDL不支持库之间的包含结构,即,尽管库可以有许多个,但库之间不能嵌套。
(3)两个内建(Built-in)库:其名称为WORK和STD。
(4)需要从库中调出设计单元用于设计时,则库说明部分的句法如下所述,即
librarylibrary_name;
再用Use子句打开,然后才能起作用。打开库时最多有三个层次,格式如下:
uselibrary_name.package_name.item_name;
或者是两层:
uselibrary_name.item_name;
举例:
Usefreds_library.my_defs.unit_delay;
其中集合包my_defs必须先编译;Use后面给出的即为打开的库层次。被打开的项unit_delay在下面的语句及随后的其他语句中才可以使用。
C<=NOT(axorb)afterunit_delay;而默认库WORK是不需说明的特殊库。对于WORK库中的内容,在Use字句中可以不出现库名而直接出现库中下两层的内容:
usepackage_name.item_name;或者useitem_name;
(5)库中各单元的名称应该各不相同(实体号和集合包的名称应该不同,同一个设计实体号的各构造体名字也应该各不相同)。6.2.2集合包
1.简介
集合包(Package)是一个可共享、可编译的VHDL源设计单元,它又是库中的一个层次。集合包由集合包说明(PackageDeclaration)和集合包体(PackageBody)两部分构成。
用Use语句将集合包打开,但STD库中的STANDARD集合包中的调用不需要Use语句。Use语句中的all是指其中的所有项;Use实现将库打开的效果,该库内容将被应用于其后的那个设计单元。
2.功能和构成
这里,对集合包中的有关功能先做一简要解释。
(1)先编译的集合包说明(PackageDeclaration,又称标题,Header)包括:
类型说明、元件说明、信号说明、子程序说明、常数说明或推迟说明。
(2)后编译的集合包体(PackageBody)是一可选项,将给出进一步的有关细节,包括:子程序体、推迟说明的常数值等。
将包说明与包体加以分离,有助于隔离和孤立日后的设计变动。注意:一个包说明最多只有一个包体,也可以没有包体;包说明和包体可以不放在一处。
本节开始时给出一个VHDL设计文件示例mine.vhd,该处的集合包my_defs就没有包体。此种情况下如果想改变常数就比较困难,而下例则比较方便。
3.格式举例
packagemathis
Mean_Value:REAL;
ENDmath;
PACKAGEBODYmathis
CONSTANTMean_Value:REAL:=110.0;
ENDmath;
需要改变时,最好只对此段集合包体程序进行单独编译。为达到这一目的,需要将集合包说明和集合包体分别放在不同的设计文件中。这时,最好把不再改动的集合包标题部分放在公用的库中不动。6.2.3实体号
1.释义
在VHDL中,用来描述硬件的主体是设计实体(DesignEntity,称作Entity)。完整的实体由实体号(EntityDeclaration)和构造体(ArchitectureBody)两部分组成。实体号经常被简称为Entity,构造体被简称为Architecture。
VHDL将实体号与构造体分开是一个比较明智的策略。实体号定义了一个新的元件名,编译并经过模拟仿真后放入库中。这样在另外的设计中加以说明,就可以作为元件使用。要说明的内容有元件的输入/输出连接关系以及一些有关的参数;要说清楚元件的外部接口以及连接用信号的类型和方向。根据如图
6-2所示的示例框图,可以进一步理解VHDL中实体号的作用。2.格式
entityentity_nameis--这里的entity_name为实体号名称
〔generics〕 --entity标题之一的类属子句
〔ports〕 --entity标题之二的端口子句
〔declarations{constants,types,signals}〕--declarations为说明
〔begin--常数类型信号
entity_statements〕--这里的实体号语句通常不用
endentity_name;在实体号中,如果出现begin,则begin后的实体号语句不是动态的动作。它只是被动的核查与认定,例如触发器置位和复位端是否同时为0等。
3.举例
下面给出实体号设计的三个示例——例(1)、例(2)、例(3)。在了解它们共性的基础上,请进一步注意它们之间的差别。
例(1)
entityCOMPAREis
port(A,B:inbit;
C:outbit);
endCOMPARE;
例(1)中的entity和is都是VHDL的保留字;A、B是类型为Bit的输入信号;C是类型为Bit的输出信号。实体号的名称是COMPARE,并不等价于它代表真实的功能。这个实体号可能是一个比较器,但也可能不是。设计的输入输出关系如图6-2所示,读者可以望文生义,暂且先把它想像成比较器,留待后面构造体中的语句功能再加以验证。图6-2VHDL实体号对应的框图例(2)
entityCOMPARE_digitis
port(A,B:inintegerrange0to9:=0;--区间约束
C:outboolean);
endCOMPARE_digit;
例(2)的设计明显与上面的例(1)不同,port说明中的integer为整数,:=0表示初值,boolean量的初值为false,增加了一些约束来指定端口的位数、区间及初值。例(3)
entityCOMPARE_digit1is
port(A,B:inintegerrange0to9:=big_number
C:outboolean);
endCOMPARE_digit1;
在例(3)的设计中,初值的设置更加灵活。但是,句法要求其中的big_number应在集合包中说明过。
编译后的实体号可以作为一个元件使用和对待,使用时不需要知道细节,而且也不需要重新编译。6.2.4构造体
1.概述
构造体(ArchitectureBody)与实体号(EntityDeclaration)一起构成一个完整的实体(Entity)。根据实体号所确定的前提,设计师用构造体来具体指定实体的行为、元件(结构)以及内部连接关系,定义出设计实体的真实功能。
设计师在设计活动中需要先编译Entity,然后再编译Architecture。一旦重新编译了Entity,则相应地需要再重新编译Architecture。设计构造体时,可以从下述两个方面去诠释和描述实体号:既可以采用不同的抽象层次(例如用系统行为功能的方框模型,或者是电路逻辑结构模型);也可以采用不同的实现方式(例如加法器可以是串行脉动进位,或者是并行超前进位)。
关于实体的实质性描述最终是由构造体给出。即使对应于同一个实体号,不同的构造体描述可能会使得整个实体的功能面目全非。采用不同设计风格进行设计时,关注的对象和核心是不同的。概括起来,行为风格核心是数据变换和定时;数据流风格核心是激励—响应模型;结构风格核心是元件、端口和信号。现在已经有编译器和综合工具支持混合风格描述。一般,一个设计可以采用上述某种或全部描述风格,这要根据抽象层次及细节描述的需要而定。
2.Architecture格式
architecturearchitecture_nameofentity_nameis
〔declarations〕
begin
〔concurrent_statements〕
end〔architecture_name〕;
此段中architecture_name为构造体名,entity_name为实体号名;declarations说明本构造体内用的项:类型、子程序、常数、信号、元件等;concurrent_statements泛指包括元件实例生成在内的广义并发语句。一个Entity(下例中为compare)可以对应不同的Architectures。如果对应的构造体有a、b、c三种,则每一个都可以理解为其中之一,即oneofcompare的关系。
在编写Architecture时,出现在构造体首行的形式为
…aofcompare…
…bofcompare…
…cofcompare…
在编写配置说明时,又往往写成如下的关系形式:
…compare(a)…
…compare(b)…
…compare(c)…这些构造体的接口关系都相同(由实体号完成定义),但它们各自的名字不同(功能也允许不同,但一般避免这样做)。以后再通过配置手段,可以在不同的版本中选择不同的速度和规模。不同的构造体可以分别编译,这样修改其中的一个并不影响另一个。
构造体可以采用行为、数据流(有人称作定时)、结构三种表达方式来描述。我们以同一个加法器设计为例,分别给出三种描述中的关键语句。
行为描述——定义出按时序描述的进程(Process),对应着时序语句。
如果用进程描述加法器行为,则形如:
...Process....a<=b+c;endprocess;....--这里的b、c、a定义为算术运算中的整数。
数据流描述—基本上是一种行为描述,又隐含着寄存器传输级(RTL,RegisterTransferLevel,更确切地应该称其为寄存器转移级)一级的逻辑结构描述,对应并发行为性语句。
此处用直接的逻辑表达式描述加法器的RTL级数据流:
...Sum<=bxorc;Carry<=bandc;....--这里是逻辑运算,b、c、Sum、Carry定义为Bit量。
当然,作为上述进程的例子也同样可以缩写为数据流描述。一般而言,进程比简单的并发语句能够描述更复杂的功能。
结构描述——定义了元件的内部连接关系,对应着结构VHDL。
现在,用门级网表来描述加法器的结构:
...U0:XR2portmap(b,c,sum);...--这里是元件的结构映射。
用结构描述(元件及互连网表)风格的优点是便于实现层次化设计。
3.行为风格构造体
行为风格(BehavioralStyle)适用于描述算法。下面举例解释,用行为风格、数据流风格和结构风格设计同一个等值比较器COMPARE,它比一般的大小比较器要简单。
它的实体号为
entityCOMPAREis
port(A,B:inbit;
C:outbit);
endCOMPARE;举例之一:行为风格构造体——采用进程设计
architectureAXW1ofCOMPAREis
begin
process(A,B)
begin
if(A=B)then
C<=‘1’after1ns;
else
C<=‘0’after2ns;
endif;
endprocess;
endAXW1;上述构造体中包含一个进程。进程也是一种并发语句,只不过表达能力更强。在上述进程中采用了信号赋值语句。
模拟时间是为了用计算机的EDA软件模拟VHDL固有的并发特点而引入的概念,用以模拟真实硬件系统中事件发生的时刻。构造体中的各进程在模拟器的模拟时间刻度上并发运行,例如1ns、2ns等,这样地向前计时推进。
各进程的地位是相互独立的,某一进程的运行可以与其他进程有关。进程间需要由信号进行通信,信号用来传送数据。进程内部可以有变量,但只限于局部变量、局部存储,不能用来向外传出信息。1993版本的VHDL标准扩展了共享变量,但一定要慎重使用。
上述process(A,B)中的A,B称为敏感信号列表,进程等待着输入信号A、B的触发。只要A或B变化,进程就被激活;之后C又可能激活其他进程n。
各进程在行为描述中的信号变换关系如图6-3所示。在设计行为风格构造体时,需要注意的核心问题是(信号的)数据变换和定时。数据变换是指信号上的数据变换,定时是指信号间的时序。这些信号包括进程间和进程内的信号。在自上而下设计的前期阶段,适宜于采用这种行为风格来“抽象”行为。图6-3行为描述中的变换和定时
4.数据流风格构造体
数据流风格(DataflowStyle)构造体,按逻辑函数随时间而变的信息或数据流行为建立模型写成并发行为性语句(以并发信号赋值语句为主),例如实现加法器、比较器、译码器和基本逻辑门等。可以认为,数据流风格是行为风格派生的。进程可以完全取代这里的并发行为性语句来实现其并发性,所以说,并发行为性语句可以认为是进程的缩写,但又隐含着RTL结构描述。举例之二:数据流风格构造体
采用同或门设计
architectureASJL2ofCOMPAREis
begin
C<=not(AxorB)after1ns;--括弧中xor要先执行(数据流顺序约定)
endASJL2;
后面的结构风格中将要用到许多底层元件,都可以用这种数据流风格设计出来。为此,以底层元件异或门XR2和反相器INV的设计为例加以解释。
底层元件异或门XR2设计:
entityXR2is
generic(m:time:=1.0ns);
port(X,Y:inbit;
Z:outbit);
endXR2;
architectureDATAFLOWofXR2is
begin
Z<=XxorYafterm;
endDATAFLOW;
底层元件反相器INV设计:
INVport(X:inbit;Z:outbit)请读者参照上例自己编写。
采用数据流风格进行设计的核心问题是更直接的(信号)激励—响应模型,分清每个信号担负的激励和响应角色;注意事件间的并发性和连环激励的特点。
5.结构风格构造体
举例之三:结构风格构造体
采用元件设计
architectureAJG3ofCOMPAREis
signalI:bit;
componentXR2port(X,Y:inbit;Z:outbit);
endcomponent;
componentINVport(X:inbit;Z:outbit);
endcomponent;
begin
U0:XR2portmap(A,B,I);
U1:INVportmap(I,C);
endAJG3;
其原理方框图如图6-4所示。图6-4结构描述中的元件和信号采用结构风格进行设计的核心问题是元件、端口和信号,这与电路的结构网表直接对应。设计时以元件为纽带,每个元件都有端口,而端口本身也是信号,同时它还要与其他的信号相连接,这就是网表概念的真谛——元件及其网络连接。
上例中的元件有异或门XR2、反相器INV。信号线I将两元件相连,在构造体内被说明为局部信号。此处构造体中的元件说明也可以挪到集合包中,到这里再用Use语句打开。上面实例生成中的portmap指出端口映射关系。根据句法约定,这里还隐含地指出XR2、INV的设计实体放在库WORK中。6.2.5配置说明
1.设计层次
如果XR2、INV编译入库,则它们在设计COMPARE时可以被当作元件使用。依此类推,在COMPARE的设计完成之后,COMPARE又可以被当作元件用于更大规模的后续ALU的设计之中。举例如下:entityALUis
port(opcode:...)
endALU;
architecturefirstofALUis
componentCOMPARE
port(a,b:inbit;
c:outbit);
endcomponent;
...
forU0:COMPAREuseentitywork.COMPARE(AJG3);
begin
U0:COMPAREportmap(s,d,q);
...
endfirst;上述component部分为元件COMPARE的元件说明,实例生成U0时,用(s,d,q)对端口a、b、c进行信号的port映射。
理解VHDL的设计层次(DesignHierarchy)是正确使用配置手段的基础。这里,我们用两种表达方式来表示设计的层次关系。
(1)用树状结构图示法给出构造体和元件间的层次。如图6-5的树状结构,同时给出并列的构造体及其中合成用的不同元件。图6-5构造体及元件的树状结构图图6-5中第二行的各构造体之间是同质可替代的并列候选候补关系;第三行的各元件(与实体号对应)之间是不可替代的有机异质合成关系;第四行又是不同的构造体;第五行又是元件……。记住,VHDL中的多层次主要是结构关系的描述!
(2)用括弧嵌套给出元件间的层次。如:
{CPU(ALU(COPMARE<XR2,INV>))
注意,这里每一层次的元件实体号ALU、COMPARE、XR2、INV都可以对应多个构造体。
2.配置格式
在VHDL中,用配置说明(ConfigurationDeclaration)来选定不同的硬件设计组合。配置说明又被简称为配置(Configuration)。实现选配的前提是一个实体号可能对应有几个构造体,配置这一手段被用来搭配选取不同的构造体以构成不同的设计。一般,显式配置总是从某一个库中为某个实体号选配一个特定的构造体。配置的句法格式为设同一实体号COMPARE有三个不同构造体AXW1、ASJL2、AJG3,则配置可以选取其中之一,比如COMPARE(ASJL2)。
多个构造体可以反映算法的不同或者是抽象的层次不同。例如:
configurationFast_OneofALUis
Forfirst --为ALU选定构造体first,并进一步配置
forU0:COMPAREuseentityWORK.COMPARE
(ASJL2);
endfor; --对其中U0的COMPARE进行配置
EndFor;
endFast_One;上例给出实体号ALU的一种配置,取名为FAST_ONE。也可以说,本配置为实体号ALU配置了构造体first,又为其中U0的元件COMPARE配置了ASJL2这一构造体。
这里的Use子句,它识别库的层次为:某个库→某个实体号(元件,例如COMPARE)→某个对应的构造体。
配置主要用来进行版本控制。上例中通过配置,获得设计单元ALU的新版本FAST_ONE。上例为显式配置,VHDL规定的默认配置为最新编译的构造体。例如,如果在设计中要配置74系列,首要的是建造VHDL的各种元件库,包括S、LS等。配置主要用于结构描述风格的设计当中!6.2.6课程设计与练习
1.课堂练习题之A
设计一个一位全加器Full_adder.vhd,其模型框图如图6-6。图6-6全加器模型框图entityFull_adderis
generic(ts:time:=1.2ns;tc:time:=1.0ns);
port(x,y,Cin:inbit;Cout,Sum:outbit);
endFull_adder;
architectureBehaveofFull_adderis
begin
Sum<=xxoryxorCinafterts;
Cout<=(xandy)or(xandCin)or(yandCin)
aftertc;
end;附:一位全加器仿真批处理命令文件Full_adder.do。
wave/*
force/x10,025-r50
force/y10,050,1100,0300
force/Cin10,0200,1250,0350,1400,0600
run3000
viewwaveform
2.课堂练习题之B
用练习题之A的全加器做为元件,设计八位脉动进位加法器Adder8.vhd。八位加法器的外部接口模型框图如图6-7所示。图6-7一般八位加法器模型entityAdder8is
port(A,B:inbit_vector(7downto0);
Cin:inbit;Cout:outbit;
Sum:outbit_vector(7downto0));
endAdder8;
architecturestructureofAdder8is
componentFull_adder
port(x,y,Cin:inbit;
Cout,Sum:outbit);
endcomponent;
signalC:bit_vector(7downto0);
begin
stages:foriin7downto0generateLowbit:ifi=0generate
Fa:Full_adderportmap(A(0),B(0),Cin,C(0),Sum(0));
endgenerate;
Otherbits:ifi/=0generate
Fa:Full_adderportmap(A(i),B(i),C(i-1),C(i),Sum(i));
endgenerate;
endgenerate;
Cout<=C(7);
end;附:八位脉动进位加法器命令文件Adder8.do。
wave/*
force/A16#340,16#4625-r50
force/B16#400,16#2050,16#30100,16#44300
force/Cin10,0200,1250,0350,1400,0600
run3000
viewwaveform
八位加法器脉动进位链如图6-8所示。图6-8八位加法器脉动进位链
6.3VHDL语言基础知识
VHDL有以下几种基本数据类型(参见附录1)。
1.标量(Scalar)类型
标量数据是一个集合的概念。标量型集合中的数据,只具有单一值,该值无法再分解,包括实数、整数等。
2.复合(Composite)类型
复合型数据是由标量组成的数组或记录。这里的一个数据可以含有多个标量值。
3.寻址(Access)类型
通过分配符(allocator)返回存取值来实现寻址。实际中这一类很少用。
4.文件(File)类型
VHDL中的文件存放在主机的系统当中,文件类型实质是定义出文件中所包含值的类型。
此外,还有子类型应归为相应数据类型的附属类型。下面,我们主要介绍标量型和复合型两种。
VHDL是强类型语言:整数1、实数1.0、位 '1' 的概念不一样;40bit与8bit的总线不能相连;字符也不能相加等等。编译器中的分析器将对设计文件进行数据类型分析,指出设计中的语法错误信息。6.3.1标量类型数据
在定义数据类型时,VHDL用不同的文字(Literal)来作为数据的标识符号(非操作符)。下面给出各种标量类型数据(ScalarType)的定义并加以解释。
1.字符(Character)
最基本的标量类型是字符(Character),它是一种预定义枚举量。表示字符时要用单引号括起来,例如 'x'。只在这种表示字符的情况下,VHDL才对大写小写加以区别,这时 'a' 不同于'A'。字符可以是a~z中的字母;0~9中的数字;空白;特殊字符,如 '、$、@、%等,详见IEEE-1076的集合包STANDARD。
2.Bit量(Bit)
Bit量(Bit)也是一种预定义枚举量,包括 ‘0’、‘1’ 两个数据。显式说明为bit‘(’1‘)。
它可以用来描述总线中的一位,其初值为 ’0‘。
Bit量可以组成复合型的位矢量,例如,用双引号括起来的 "001100" 可以称作是位矢量的一个聚集(Aggregate)或实现样本。
注:X代表十六进制,O代表八进制,B代表二进制。这只是书写形式而已,可以逻辑运算。
3.布尔量(Boolean)
布尔量(Boolean)包括True(真)和False(假)两个数据,它是一个预定义二值枚举量。
它可以在IF语句中被测试,关系操作 =、<=、>=、/= 都将产生布尔量结果。
信号或变量可以定义为布尔量,它与Bit量无关,有的EDA工具可以转换。
4.一般枚举量(Enumeration)
把集合中的所有数据量穷举出来,定义出一种新的数据类型,这种量称之为枚举量。前面的字符、Bit量(位)、布尔量均为一般枚举量(EnumeratedType)的某种特例,称之为预定义枚举量类型,在IEEE-1076的STANDARD集合包中有完整的介绍。枚举文字由字符或标识符组成。字符、标识符都是符号,不是数值。一般枚举类型需要枚举说明,其句法格式为
typeidentifieris(enumeration_literal{,enumeration_literal});
例如:
typeTLLis(‘0’,‘1’);--字符
typeFLLis(‘x’,‘0’,‘1’,‘z’);
typetoolsis(hammer,saw,drill,wrench);--标识符
5.整数量(Integer)
预定义整数量(Integer)与数学中的定义相同。在大多数VHDL实现中,机器内部是用32位二进制数来表示十进制数,可以表示的数值区间为
-(2**31-1)~(2**31-1)=-2147483647~+2147483647
在实际设计中直接书写为十进制数,例如:+1,862,
-257,+15,…。
整数不同于位矢量,它不能按位去访问;表示整数不用加双引号。不能进行逻辑运算;但可以进行算术运算。需要进行按位操作时,先要进行类型转换。自然数和正整数都是整数的子集。整数类型说明举例:
typeword_indexisrange31downto0;
6.实数量(Real)
在大多数VHDL实现中,实数量(Real)的区间为(-1.0E+38)~(+1.0E+38)。实数量又称为浮点数(FloatingPointType)。
预定义实数量可以有正数、负数、小数点及指数表示,例如:-1.0,+2.35,36.0,-1.0E+28。
实数量可进行四则运算,用于算法研究或方案实验比较方便。但是在算法研究和设计仿真完成之后,正式综合之前需要再改用定点进行四则运算。注:VHDL句法中也采用了巴科斯范式(BNF-BackusNaurForm,一种用来定义程序语言句法的事实上的标准)表示法。以数的表示为例,可以选择二进制到十六进制中的一种。在各种基中,十进制是默认的,表示形式上可以省略。其余,还有2、4、8、16等。每种进制对应一个基,例如十进制的基就是10,代表一位与附近的一位是10倍的关系,二进制的基就是2。注意,这里表示不同的基本身是用十进制表示的。整数和实数的BNF表示如下:
以基表示的整数、实数::=基#基于基的整数[.基于基的整数]#[指数]
上式中还有指数。指数部分可以继续展开为
指数::=E[+]整数|E-整数
其中的整数用十进制表示。
例如:
整数255可以表示为2#1111_1111#或者16#FF#。这里数字间所加的下划线“_”是为了阅读的方便。
实数4095.0可以表示为16#F.FF#E+2或者2#1.1111_1111_111#E11。整数和实数之间可以用类型标记的方法进行转换。例如:
variablei:integer;
variabler:real;
则下列的赋值语句可以实现转换:
i:=integer(r);
r:=real(i);
7.物理量(Physical)
物理量(Physical)是某一种物理测量值的度量,它始终是某一物理单位量的整数倍。例如,预定义时间物理量:
1sec,60sec,1min
时间单位有fs、ps、ns、us、ms、sec、min、h。例如:
10ns,100μs,6.3ns
其中10是整数;6.3是实数。在大多数VHDL实现中,时间的区间为
-(2**31-1)~(2**31-1)=-2147483647~+2147483647
除了时间物理量之外,允许自定义其他物理量,例如电流。
实数、整数、物理量又统称为数值型,它们都可以进行四则运算。
8.区间约束(RangeConstraint)
采用VHDL进行设计时,经常需要对作用范围进行限定,这就是区间约束(RangeConstraint)。
其句法为
rangelow_valtohigh_val或高值downto低值
例如:
integerrange10downto1
realrange1.0to10.0若对整数integer的区间需要推迟到以后再确定,则采用符号<>,写作如下形式:
integerrange<>
备注:这里主要针对整数、实数这种开放式结构型数据而言。所谓开放,就是指这里事先对区间没有约束,允许以后重新定义。
9.子类型(Subtype)说明
子类型(Subtype)说明给出某数据类型的一个子集,并再起一个名字。例如:
subtypeRegisterisbit_vector(7downto0);6.3.2复合类型数据
复合(Composite)类型数据包括数组(矢量,Array——同种复合型)以及记录(Record——异种复合型)两种。
1.数组(Array)
数组(Array)可以组成线性空间,一维、二维或多维,位矢量就是一维数组。可以定义实数数组和整数数组;也可以有约束(给出定界)或未约束(区间及走向待定<>)。
数组说明用type语句,句法为
typearray_nameisarray[index_constraint]ofelement_type;
上述index_constraint就是对下标的约束。例如:
typeword8isarray(1to8)ofbit;
typewordisarray(integerrange<>)ofbit;
说明之后就可以用于变量或信号说明。例如:
variablemystuff:word8;
variableyourstuff:word(1to10);
前述的<>表示推迟约束,推迟到word(1to10)才说明。
内建的STANDARD中预定义未约束数组位矢量,将来由用户再给出约束:
typebit_vectorisarray(naturalrange<>)ofbit;
当用户使用时,则可以写成:
variablec:bit_vector(0to3);
比如,c:=“1010”;(此时c(1)=‘0’)
将上述数组用于描述总线很方便。字符可以组成一维数组,称之为字符数组,是复合型数据的一种。使用较多的字符串及标识符,可以认为是一维字符数组某一个特定的实现样本,在此做进一步注释:
(1)字符数组的实现样本称为字符串,可用双引号括起来。例如:“holdtimeoutofrange”。一般的字符串属于复合型数据中一维数组的一种实现样本。
(2)标识符是为了设计方便设计师自编的一种特殊专用字符串,它被作为VHDL中源设计单元或客体等项目命名用的符号。其编制规定如下:①标识符中第一个字符为字母。
②其余字符可以是字母或数字。
③标识符中可以加有下划线,但不能有两个连着的下划线。
④标识符中不能有空格。
⑤ VHDL对标识符不区分大小写。
⑥标识符不加引号。
2.记录(Record)
对于记录(Record)的概念,下面以记录“指令”为例加以说明。
枚举型指令码∪整数地址→其并集定义一个记录“指令”;而指令又可以用来定义“寄存器组”。例如:
typeOpcodeis--Opcode(枚举量)和Address(整数)是异种标量
(add,add_with_carry,......);
typeAddressisrange16#0000#to16#FFFF#;这两个type语句用来先说明所用标量数据类型。
typeInstructionis
record--Instruction是复合型(异种数据)
Opcode_field:Opcode;
Operand_1:Address;
Operand_2:Address;
endrecord;6.3.3客体
1.简介
在VHDL中,凡是可以拥有数据的某载体就称之为客体(Object,对象)。它所荷载的数据类型决定了该客体所能参与的运算。客体主要有三种:信号(Signal)、变量(Variable)、常数(Constant)。
(1)信号——按模拟时间对信号进行赋值,它对应于硬件互连线,需要到某一时刻才获得真实的当前值。
(2)常数——属于一次性赋值,例如电源、地。
(3)变量——可以立即获得真实当前值,与对应硬件不直接对应,是一种局部量(也可以不断变化)。
其他从属的客体有:端口信号、传递环境信息的类属(比较特殊的常数)、参数(在子程序中说明,其中函数中的参数是常数,过程(Procedure)中的参数可以是任一客体等)、下标(循环或生成语句中的次数)等。
2.客体类型说明
在使用客体之前,对于客体类型要先行说明,包括:
1)常数说明(ConstantDeclaration)
其句法为
constantidentifier:type_indication[:=expression];
名称类型数值例如:
constantVCC:real:=4.5;
名称类型数值
其中constant为保留字。
它可以在实体号、集合包或子程序中说明,原则是谁用谁说明,即在说明时要考虑常数的使用场所。
2)变量说明
变量用于赋给进程中变化的值,赋值立即生效。
变量使用前必须先说明,其句法为
variableidentifier:type_indication[constraint][:=expression];
例如:
variableCOUNT:integerrange0to99:=0;
名称类型区间初值
变量可以是标量或数组,只能在进程或子程序中加以说明。
在模拟时作为局部数据记忆单元对待;变量不能在进程间通信。
3)信号说明
信号是物理硬件互连线或总线的抽象,可以在实体号、构造体、集合包中说明,可用于全局通信。
信号说明的句法为
signalidentifier:type_indication[constraint][:=expression];
例如:
signalS:bit:=‘1’;
名称类型初值
signalxyz:bit;
xyz<='1'after5ns;
其中<=表示是信号赋值。
(1)在进程中不能说明信号,在进程中可以使用信号。
(2)进程中的信号赋值要等待WAIT的执行。
当行为风格用到信号概念时强调的是变化,当结构风格使用信号时强调的是固定的互连关系。6.3.4操作符与表达式
1.简介
由操作符、操作数组成的表达式是实现数据变换的武器和工具。
(1)表达式(Expression)——操作符、操作数组成的数学式,定义操作处理,例如“A+B”。
(2)操作符(Operator)——指定对操作数所执行的运算,例如式中的“+”。
(3)操作数(Operand)——被运算的客体数据,其类型与操作符的要求要一致,例如式中的“A”和“B”。
2.操作符分类(黑体表示的为1993版新增)
(1)逻辑(Logical)——not(一元),and,or,nand,nor,xor,xnor。
(2)关系(Relational)——=,/=,<,<=,>,>=。
(3)移位(Shift)——SLL,SLA,SRL,SRA,ROL,ROR。
(4)算术(Arithmetic)——+,-,abs(一元正、负、绝对值);
+,-(二元);
*,/;
mod(取模),rem(取余),**(指数)。
(5)并置(Concatenation)——&。
当然,从原理上讲,算术运算也可以写在数据流风格语句中。但是,在综合时,这样的语句离RTL的门级实现可能要更远一点。
3.操作符解释
1993年版本VHDL的优先级如下(由低到高,黑体表示的为1993版新增):
and,or,nand,nor,xor,xnor;
=,/=,<,<=,>,>=;
SLL,SLA,SRL,SRA,ROL,ROR;
+,-(二元);
+,-(一元);
*,/,mod,rem;
NOT,**,ABS;
&。操作符分为五大级,算术又分四小级,优先级由低到高(两个版本的标准略有不同)。同一级内优先级相同;可以采用括号来确定优先级。二元操作时要求数据类型应该相同,它们对数据的要求如下:
(1)逻辑——Bit,boolean,及其一维数组;二元逻辑操作除XOR外都是短路操作。对所谓短路概念,这里需要做一解释。以或运算“or”为例,只要操作数有一个1,结果即可确定。
(2)关系——=,/=的操作数可以是任一类型;其余关系符的操作数应是标量,包括枚举量和整数量,或一维离散数组。运算结果总为布尔量。
(3)移位——SLL,SLA,SRL,SRA,ROL,ROR。其中S…为左右、算术逻辑移,RO…为循环左右移。
(4)算术——只可以是数值型(整数、实数、物理量)。其中:指数操作的左操作数为整数、实数;右操作数为整数。除此之外的所有二元操作其操作数都要相同。
(5)并置——操作数是一维数组或其元素。例如:
constants1:string:=“ABC”;
constants2:string:=“DEF”;
constants3:string:=s1&s2;
其结果将生成 "ABCDEF"。
4.补充解释
1)取余(AREMB)定义
余数应能满足
AREMB=A-(A/B)*B
其(AREMB)的符号与A相同(节“余”归己),其绝对值小于B的绝对值。
例如:
7REM5=2,7REM(-5)=2
2)取模(AMODB)定义
存在某一整数N,使得
AMODB=A-B*N
其(AMODB)的符号与B相同,其绝对值小于B的绝对值。
例如:
7MOD5=2,7MOD(-5)=-3(可以验证一下!)6.3.5预定义属性
预定义属性(Attribute)主要包括类型、子类型、子程序、客体的属性。元件、语句标号也可以有属性。使用属性的目的通常是按约定返回并获取有关数据。
(1)标量类型属性:LEFT,RIGHT,LOW,HIGH,Succ,Pred,Leftof,Rightof,LENGTH,Range返回值等;
(2)函数类属性:可划分为类型属性、数组属性和信号属性三种。
(3)信号属性:四种主要的(其中 ‘Event很有用)信号属性如下。
S’Active
S‘QuietS’Event
S‘Stable
有事务静止有事件稳定任何一次信号赋值,都将产生一个事务Transcation。这时的S‘Transcation是一个Bit量信号,在每一个模拟循环后它都将翻转一次。
如果这次信号赋值使信号值发生变化,那么这又是一次事件,S’Event为真。
其中S'Event、S'Active属于函数信号属性,可用于函数或过程中。其他的S'Quiet、S'Stable、S'Traqnscation属于信号类属性,不能用于子程序内部。6.3.6课程设计与练习
全部采用VHDL设计,编制一位全加器、激励器及测试平台的完整示例。图6-9给出了全加器的结构。图6-9由半加器构成全加器
(1)由半加器构成全加器的原始设计(OriginalDesign)——
addw1.vhd。
Libraryieee;
Useieee.std_logic_1164.all;
Entityfull_adderis
Generic(tpd:time:=10ns);
Port(x,y,c_in:instd_logic;
sum,c_out:outstd_logic);
Endfull_adder;
Architecturedataflow_viewoffull_adderis
Signals:std_logic;
Begin
s<=xxoryaftertpd;
sum<=sxorc_inaftertpd;
c_out<=(xandy)or(sandc_in)after2*tpd;--sandc_in等效于
Enddataflow_view;--(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西师范大学科学技术学院《建筑设备施工组织设计》2023-2024学年第一学期期末试卷
- 湖南中医药大学湘杏学院《水电站建筑物》2023-2024学年第一学期期末试卷
- 湖南工艺美术职业学院《多媒体信息处理与检索技术》2023-2024学年第一学期期末试卷
- 衡阳科技职业学院《统计软件操作》2023-2024学年第一学期期末试卷
- 浙江师范大学《能源与动力工程测试技术》2023-2024学年第一学期期末试卷
- 长春师范大学《卫生检验综合技术》2023-2024学年第一学期期末试卷
- 榆林职业技术学院《太阳能热利用技术》2023-2024学年第一学期期末试卷
- 使用二手设备节约资本开支
- 实践学习实施报告
- 业务操作-2018-2019年房地产经纪人《房地产经纪业务操作》真题汇编
- 生产车间工艺员年终总结
- 特色酒吧方案计划书
- 重庆市南开中学2023-2024学年中考三模英语试题含答案
- 2023年上海高中物理合格考模拟试卷一含详解
- 2022版义务教育(地理)课程标准(附课标解读)
- 2024年滑雪用品行业分析报告及未来发展趋势
- 经方治疗脑梗塞的体会
- 新版DFMEA基础知识解析与运用-培训教材
- 制氮机操作安全规程
- 衡水市出租车驾驶员从业资格区域科目考试题库(全真题库)
- 护理安全用氧培训课件
评论
0/150
提交评论