《数字电路与系统设计 》课件第8章_第1页
《数字电路与系统设计 》课件第8章_第2页
《数字电路与系统设计 》课件第8章_第3页
《数字电路与系统设计 》课件第8章_第4页
《数字电路与系统设计 》课件第8章_第5页
已阅读5页,还剩222页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章电子设计自动化8.1EDA概述8.2硬件描述语言VHDL初步8.3VHDL设计实例8.4

QuartusⅡ开发系统8.1EDA概述EDA就是以计算机为工作平台、以EDA软件工具为开发环境、以硬件描述语言为设计语言、以ASIC为实现载体的电子产品自动化设计过程,它包括半导体工艺设计自动化、可编程逻辑器件设计自动化、电子系统设计自动化、印刷电路板(PrintedCircuitBoard)PCB设计自动化、仿真测试、故障诊断以及形式验证自动化。需要说明的是,这里所讲的是狭义的EDA,没有包括模拟电路的设计自动化。EDA作为一门崭新的学科,它的知识体系结构为:①现代电子设计理论;②可编程逻辑器件原理、结构及应用;③硬件描述语言;④EDA工具的开发和应用;⑤EDA设计方法论;⑥EDA的应用及实践。8.1.1EDA的发展概况

集成电路技术的发展不断对EDA技术提出新的要求,对EDA技术的发展起了巨大的推动作用。从20世纪60年代中期开始,人们就不断地开发出各种计算机辅助设计工具来帮助设计人员进行集成电路和电子系统的设计。近40年来,EDA技术大致经历了计算机辅助设计CAD(ComputerAidedDesign)、计算机辅助工程CAE(ComputerAidedEngineering)和电子系统设计自动化ESDA(ElectronicSystemDesignAutomation)三个发展阶段。

1.CAD阶段(20世纪60年代中期~20世纪80年代初期)

20世纪70年代,随着中、小规模集成电路的开发和应用,传统的手工制图设计印刷电路板和集成电路的方法已无法满足设计精度和效率的要求,于是工程师们开始进行二维平面图形的计算机辅助设计,这样就产生了第一代EDA工具,设计者也从繁杂、机械的计算、布局和布线工作中解放了出来。但在EDA发展的初始阶段,EDA工具的供应商只有几家,产品几乎全部面向PCB设计、电路模拟或IC版图设计。例如,目前常用的PCB布线软件Protel的早期版本Tango、用于电路模拟的SPICE软件以及后来产品化的IC版图编辑与设计规则检查系统等软件,都是这个时期的产品。20世纪80年代初,随着集成电路规模的增大,EDA技术有了较快的发展。更多的软件公司,如当时的Mentor公司、DaisySystems及LogicSystem公司等进入EDA领域,开始提供带电路图编辑工具和逻辑模拟工具的EDA软件,主要解决了设计实现之前的功能检验问题。总的来讲,这一阶段的EDA水平还很低,对设计工作的支持十分有限,主要存在两个方面的问题需要解决:①EDA软件的功能单一、相互独立。这个时期的EDA工具软件都是分别针对设计流程中的某个阶段开发的,一个软件只能完成其中的一部分工作,所以设计者不得不在设计流程的不同阶段分别使用不同的EDA软件包。然而,由于不同的公司开发的EDA工具之间的兼容性较差,为了使设计流程前一级软件的输出结果能够被后一级软件接受,就需要人工处理或再运行另外的转换软件,这往往很繁琐,势必影响设计的速度。②对于复杂电子系统的设计,不能提供系统级的仿真和综合,所以设计中的错误往往只能在产品开发的后期才能被发现,这时再进行修改十分困难。

2.CAE阶段(20世纪80年代初期~20世纪90年代初期)这个阶段在集成电路与电子系统设计方法学以及设计工具集成化方面取得了许多成果。各种设计工具,如原理图输入、编译与连接、逻辑模拟、逻辑综合、测试码生成、版图自动布局以及各种单元库均已齐全。不同功能的设计工具之间的兼容性得到了很大改善,那些不走兼容道路、想独树一帜的CAD工具受到了用户的抵制,逐渐被淘汰。EDA软件设计者采用统一数据管理技术,把多个不同功能的设计软件结合成一个集成设计环境。按照设计方法学制定的设计流程,在一个集成设计环境中就能实现由寄存器传输级RTL(RegisterTransfersLevel)开始,从设计输入到版图输出的全程设计自动化。在这个阶段,基于门阵列和标准单元库设计的半定制ASIC得到了极大的发展,将电子系统设计推入了ASIC时代。但是,大部分从原理图出发的CAE工具仍然不能适应复杂电子系统的要求,而且具体化的元件图形制约着优化设计。

3.ESDA阶段(20世纪90年代以来)

20世纪90年代以来,集成电路技术以惊人的速度发展,其工艺水平已经达到深亚微米级,一个芯片上可以集成数百万甚至上千万只晶体管,工作频率可达GHz。这不仅为片上系统SOC(SystemOnChip)的实现提供了可能,同时也给EDA技术提出了更高的要求,促进了EDA技术的发展。在这一阶段,出现了以硬件描述语言、系统级仿真和综合技术为基本特征的第三代EDA技术,它使设计师们摆脱了大量的具体设计工作,而把精力集中于创造性的方案与概念构思上,从而极大地提高了系统设计的效率,缩短了产品的研制周期。EDA技术在这一阶段的发展主要有以下几个方面。1)用硬件描述语言来描述数字电路与系统这是现代EDA技术的基本特征之一,并且已经形成了VHDL和VerilogHDL两种IEEE(TheInstituteofElectricalandElectronicsEngineers,电气和电子工程师协会)标准硬件描述语言。它们均能支持系统级、算法级、RTL级(又称数据流级)和门级各个层次的描述或多个不同层次的混合描述,涉及的领域有行为描述和结构描述两种形式。硬件描述与实现工艺无关,而且还支持不同层次上的综合与仿真。硬件描述语言的使用规范了设计文档,便于设计的传递、交流、保存、修改及重复使用。2)高层次的仿真与综合所谓综合,就是由较高层次描述到低层次描述、由行为描述到结构描述的转换过程;仿真是在电子系统设计过程中对设计者的硬件描述或设计结果进行查错、验证的一种方法。对应于不同层次的硬件描述,有不同级别的综合与仿真工具。高层次的综合与仿真将自动化设计的层次提高到了算法行为级,使设计者无需面对低层电路,而把精力集中到系统行为建模和算法设计上,而且可以帮助设计者在最早的时间发现设计中的错误,从而大大缩短了设计周期。3)平面规划技术平面规划(Floorplaning)技术对逻辑综合和物理版图设计进行联合管理,做到在逻辑综合早期设计阶段就考虑到物理设计信息的影响。通过这些信息,可以再进一步地对设计进行综合和优化,并保证不会对版图设计带来负面的影响。这在深亚微米级布线时延已经成为主要时延的情况下,对加速设计过程的收敛与成功是有所帮助的。在Synopsys和Cadence等著名公司的EDA系统中都采用了这项技术。4)可测试性综合设计随着ASIC规模和复杂性的增加,测试的难度和费用急剧上升,由此而产生了将可测试性电路结构做在ASIC芯片上的思想,于是开发出了扫描插入、内建自测试(BIST)和边界扫描等可测试性设计(DFT)工具,并已集成到EDA系统中。如Compass公司的TestAssistant和MentorGraphics公司的LBLSTAchitect、BSDAchitect和DFTAdvisor等。5)开放性、标准化框架结构的集成设计环境和并行设计工程近年来,随着硬件描述语言等设计数据格式的逐渐标准化,不同设计风格和应用的要求使得有必要建立开放性、标准化的EDA框架。所谓框架,就是一种软件平台结构,为EDA工具提供操作环境。框架的关键在于建立与硬件平台无关的图形用户界面以及工具之间的通信、设计数据和设计流程的管理等,此外还包括各种与数据库相关的服务项目。任何一个EDA系统只要建立一个符合标准的开放式框架结构,就可以接纳其它厂商的EDA工具一起进行设计工作。这样,框架作为一套使用和配置EDA软件包的规范,就可以实现各种EDA工具间的优化组合,并集成在一个易于管理的统一环境下,实现资源共享。

针对当今电子设计中数字电路与模拟电路并存、硬件设计与软件设计并存以及产品更新换代快的特点,并行设计工程CE(ConcurrentEngineering)要求一开始就从管理层次上把工艺、工具、任务、智力和时间安排协调好;在统一的集成设计环境下,由若干相关的设计小组共享数据库和知识库,同步进行设计。CE改变了传统的设计过程中,过分依赖专业分工和设计人员过分强调所学专业知识的状况。8.1.2EDA设计语言

1.VHDL和VerilogHDL语言

VHDL是由美国国防部在70年代末和80年代初提出的超高速集成电路VHSIC(VeryHighSpeedIntegratedCircuit)计划的产物,其目的是为了在承担国防部定货的各集成电路厂商之间建立一个统一的设计数据和文档交换格式。1987年12月,IEEE接受HDL为标准HDL,也就是IEEEStd1076-1987[LRM87]。此后又做了一些修改,新的版本为IEEEStd1076-1993[LRM93]。VerilogHDL是在1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首创的。1986年,Moorby提出了用于快速门级仿真的VerilogXL算法,使VerilogHDL得到了迅速发展。1989年,Cadence公司收购了GDA公司,VerilogHDL成了Cadence公司的私有财产。1990年,Cadence公司决定公开发表VerilogHDL,并成立了OVI(OpenVerilogInternational)组织来负责VerilogHDL的推广。基于VerilogHDL的优越性,VerilogHDL于1995年成为了IEEE的另一个HDL标准。

几年以来,EDA界对VHDL和VerilogHDL这两种语言一直争论不休。实际上这两种语言各有所长,市场占有率也相差不多。一般认为,VerilogHDL是从集成电路的设计中发展而来的,在门级电路、晶体管开关级电路的描述方面比VHDL强,在系统级的抽象描述方面,VHDL则更合适。目前,大多数的EDA软件都同时支持这两种硬件描述语言。2.ABEL和AHDL语言与VHDL和VerilogHDL相比,ABEL和AHDL的功能相对比较简单,它们适合于RTL级和门级电路的描述,主要用于可编程逻辑器件的开发。

ABEL语言是由美国DataI/O公司推出的,该公司也是ABEL语言综合器的惟一供应商,有不少EDA软件支持ABEL语言,如ispEXPERT、Synario、Foundation等。

AHDL语言则只集成在Altera公司的可编程逻辑器件开发工具中,只能在Altera的开发软件中进行编译和调试。3.C语言

在电子系统设计中,硬件设计采用VHDL和VerilogHDL之类硬件描述语言,软件设计则采用C和C++等编程语言。这种硬件设计和软件设计使用不同语言的现象,给设计带来了不便,延长了产品开发的周期。从EDA的发展趋势来看,直接用C语言来描述硬件是未来的一个发展方向,这样软件设计人员和硬件设计人员之间就有了“共同语言”,从而能够实现软、硬件协同设计,提高设计效率。目前,用C语言描述硬件主要有两个分支:SystemC和SpecC。SystemC适用于从系统设计到逻辑设计这一阶段;SpecC则适用于从对技术要求的把握到系统设计这一阶段。图8-1EDA工具的范畴8.1.3EDA开发工具EDA工具主要能够进行三个方面的辅助设计工作:①印刷电路板PCB设计;②ASIC设计;③电子系统设计。没有EDA工具的支持,想要完成超大规模集成电路或复杂电子系统的设计制造是不可想象的。

全球的EDA软件供应商有近百家之多,大体上可以分成两类:一类是专业的EDA软件公司,如MentorGraphics、CadenceDesignSystems、Synopsys、ViewlogicSystems和Protel等;另一类是半导体器件厂商,为销售他们的产品而开发EDA工具,Altera、Xilinx、Lattice和Actel等。专业的EDA软件公司独立于半导体器件厂商,推出的EDA工具有较好的标准化和兼容性,也比较注意追求技术上的先进性,一般将这类工具称为第三方工具;而半导体器件厂商开发的EDA工具则能够作出针对自己器件特点的优化设计。在表8-1中列出了部分EDA软件,其中也包括了一些模拟/数字混合电路的EDA软件。表8-1部分EDA软件简介表8-1部分EDA软件简介8.1.4EDA设计方法

EDA设计方法属于现代电子设计的范畴,它与经典的电子设计方法不同。主要涵盖行为描述法、IP复用法、ASIC设计方法、数字系统的高层次设计方法、e-DA网上设计方法、软硬件协同设计方法、基于集成平台的设计方法。数字系统的设计包括行为、结构和物理三个领域。行为是指系统的功能,或者说系统应该做什么;结构是指系统的组成,或者说系统的抽象实现,典型的是抽象模块的相互连接;物理是指系统具体实现的几何特征与物理特性,也就是把结构领域中的抽象元件代之以真实的物理元件。根据抽象级别的不同,数字系统又划分为若干层次,一般从顶向下包括系统级、算法级、寄存器传输级(RTL)、逻辑级、电路级等。通常将寄存器传输级以上的层次称为高层次。利用硬件描述语言在寄存器传输级以上的层次进行描述、设计的方法称为数字系统的高层次设计方法,描述的层次越高,设计的层次就越高。

数字系统的高层次设计方法代表了现代数字系统设计的发展方向,它的基本特征是:用一片或几片ASIC实现整个数字系统;设计人员遵循“自顶向下”的设计思想,首先对整个系统进行方案设计、功能划分和算法设计,并采用硬件描述语言完成算法级行为描述,最后由EDA工具完成目标器件的设计。ASIC、EDA工具和硬件描述语言是高层次设计方法的三大基石。图8-2数字系统高层次设计的设计流程①在明确系统功能的前提下,首先设计系统的实现方案,然后进行功能划分和算法设计。这些富有创造性的工作与上一章所介绍的基本相同,仍然需要由人工完成,只不过在高层次设计方法中,这些工作不再受市场上通用逻辑器件的局限。②设计输入。一般是采用VHDL/VerilogHDL在算法级对系统进行行为描述,此外还可以采用比较直观的图形输入方式(方框图、状态图等)。③编译。编译器对以上设计中的HDL描述的语法和语意进行检查和解释,并将以上的输入转换成适当的中间数据格式,为下一步的综合作好准备。④功能仿真。功能仿真又称为前仿真,主要是检验系统的逻辑功能设计的正确性,除了系统规定的定时关系以外,对实际电路中的惯性时延、传输时延均不予考虑。对于大型的设计,综合、适配要花费数小时,在综合之前进行功能仿真就可以及早发现设计错误,节约设计时间。一般情况下,对于比较简单的设计,可以略去这一仿真步骤。⑤综合。利用综合器对HDL源代码进行综合优化处理,生成门级描述的网表文件,这是将高层次描述转化为硬件电路的关键步骤。⑥适配。利用适配器将综合后的网表文件针对某一具体的目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。适配完成后,产生多项设计结果:适配报告(包括芯片内部资源利用情况)、引脚分配和设计的布尔方程描述情况;适配后的仿真模型;器件编程文件。⑦时序仿真。根据适配后的仿真模型,可以进行时序仿真(又称为后仿真),因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确地预期未来芯片的实际性能。如果仿真结果达不到设计要求,就需要修改HDL源代码或选择不同速度品质的器件,直至满足设计要求为止。⑧PLD编程。将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片——可编程逻辑器件中。⑨器件测试。在器件编程后,需要利用实验手段测试器件最终的功能和性能指标。如果是大批量产品的开发,通过更换相应厂家的综合库,可以很容易转由掩膜ASIC形式实现。8.2硬件描述语言VHDL初步8.2.1VHDL源程序的基本结构

一个完整的VHDL源程序通常包含实体说明(EntityDeclaration)、结构体(Architecture)、库(Library)、程序包(Package)和配置(Configuration)5个部分。设计实体(DesignEntity)是VHDL源程序的基本单元,由实体说明和结构体两部分组成。实体所代表的对象几乎没有限制,小可至一个逻辑门,大可至一个复杂的CPU芯片,甚至整个系统。如果设计时采用自顶向下的层次化设计和模块划分,则各层的设计模块都可以作为实体,高层次的实体可以调用低层次的实体。

1.实体说明(EntityDeclaration)实体说明是一个实体的外部视图,其中包括对该实体输入/输出端口的描述。下面就是实体说明语句的格式:

ENTITY实体名IS

[类属参数说明][端口说明][实体说明部分][BEGIN

实体语句部分]

ENDENTITY实体名;其中,实体名是设计者为该实体取的一个名称。必须强调的是,VHDL语句都以分号(;)结尾,一般不可省略。端口说明的书写格式如下:

PORT({端口名{,端口名}:端口方向数据类型;}

端口名{,端口名}:端口方向数据类型);端口名是设计者赋予每个外部端口的名称。表8-2端口方向说明

数据类型用于定义端口数据的具体类型,VHDL中的数据类型将在后面再作介绍。在逻辑设计中,通常用位(BIT或STD-LOGIC)定义单个端口,用位矢量(BIT-VECTOR或STD-LOGIC-ECTOR)定义总线端口。

2.结构体(Architecture)结构体与实体说明相配合,用于描述实体的具体功能,也就是输入和输出信号之间的逻辑关系。在VHDL文件中,结构体的位置在实体说明之后,编译器通常是先编译实体说明,再对其结构体进行编译。一个实体中可以包含多个结构体,它们分别代表了对实体功能的不同实现方案或不同的描述风格。

一个结构体的具体结构描述如下:

ARCHITECTURE结构体名OF实体名IS

[说明语句]

BEGIN

[并发描述语句]

ENDARCHITECTURE结构体名;说明语句用于定义或说明在该结构体中用到的信号(Signal)、常量(Constant)、共享变量、元件(Component)和数据类型。并发描述语句是描述实体功能的主要语句,也是最富有变化的部分。必须强调的是,这些语句都是并发(同时)执行的,与它们在程序中出现的先后次序无关。【例8-1】1位二进制全加器的VHDL源程序。设被加数、加数分别为a、b,进位输入为c-in,进位输出为c-out,和数为sum。ENTITYone-bit-full-adderISPORT(a,b,c-in:INBIT;-定义输入端口

c-out,sum:OUTBIT);-定义输出端口

ENDENTITYone-bit-full-adder;

ARCHITECTUREarchOFone-bit-full-adderISBEGINc-out<=(aANDb)OR((aXORb)ANDc-in);

-用输出变量的逻辑方程进行描述

sum<=(aXORb)XORc-in;

ENDARCHITECTUREarch;

3.配置(Configuration)在层次化设计中,一个已经设计好的设计实体可以在另一个设计实体中被定义成一个元件来使用,而且任何一个设计实体都可以有多个结构体。配置语句描述的就是高层设计中的元件与低层实体之间的对应关系以及实体与结构体之间的连接关系。在对实体进行仿真时,设计者可以利用配置语句为实体选择不同的结构体,进行性能对比以求获得性能最佳的结构体。

配置语句一般跟在结构体的后面,其基本书写格式如下:CONFIGURATION配置名OF实体名IS

[配置说明语句]

END配置名;其中,配置说明语句有多种形式,有简有繁。对于不包含块(Block)语句和元件(Component)语句的结构体,配置说明语句有最简单的形式:

FOR选配的结构体名

ENDFOR;【例8-2】含有两个结构体的1位二进制全加器的VHDL源文件。ENTITYone-bit-full-adderISPORT(a,b,c-in:INBIT;

c-out,sum:OUTBIT);

ENDENTITYone-bit-full-adder;

ARCHITECTUREarch1OFone-bit-full-adderISBEGINc-out<=(aANDb)OR((aXORb)ANDc-in);

sum<=(aXORb)XORc-in;

ENDARCHITECTUREarch1;

ARCHITECTUREarch2OFone-bit-full-adderISSIGNALtemp-in:BIT-VECTOR(2DOWNTO0);

SIGNALtemp-out:BIT-VECTOR(1DOWNTO0);BEGINtemp-in<=a&b&c-in;(c-out,sum)<=temp-out;

PROCESS(temp-in)BEGINCASEtemp-inISWHEN"000"=>temp-out<="00";WHEN"001"=>temp-out<="01";

WHEN"010"=>temp-out<="01";WHEN"011"=>temp-out<="10";

WHEN"100"=>temp-out<="01";WHEN"101"=>temp-out<="10";

WHEN"110"=>temp-out<="10";WHEN"111"=>temp-out<="11";

ENDCASE;

ENDPROCESS;ENDARCHITECTUREarch2;CONFIGURATIONconfigOFone-bit-full-adderISFORarch2ENDFOR;ENDCONFIGURATIONconfig;

对于包含Component语句的结构体,配置说明语句可以采用如下形式:

FOR选配结构体名

FOR元件标号{,元件标号}:元件名

USEENTITYWORK.实体名[(结构体名)];

ENDFOR;

{FOR元件标号{,元件标号}:元件名

USEENTITYWORK.实体名[(结构体名)];

ENDFOR;}ENDFOR;这里还可以使用

FOROTHERS:元件名USEENTITYWORK.实体名(结构体名);

FORALL:元件名USEENTITYWORK.实体名(结构体名);如果没有指定实体所对应的结构体,则默认最新编译的结构体与实体连接。

4.程序包(Package)在一个设计的实体说明和结构体说明部分定义的数据类型、常量和子程序等,对其它设计单元是不可见(不能引用)的,为了使它们可以为多个设计单元所共享,VHDL语言提供了程序包机制。程序包是一个可以单独编译的单元,在其中可以定义一些公用数据类型、常量、子程序和元件等,作用与C语言中的H文件类似。在VHDL编译系统中有许多标准的程序包,用户也可以自己编写程序包。

一个程序包由两大部分组成:程序包说明和程序包体,其基本格式为:

PACKAGE程序包名IS

[说明语句]

ENDPACKAGE程序包名;

PACKAGEBODY程序包名IS

[说明语句]

ENDPACKAGEBODY程序包名;在程序包说明中首先对数据类型、常量、子程序(函数、过程)和元件等进行定义,在程序包体中再描述各项的具体细节,如常量赋值、子程序的实现等。程序包说明程序包体【例8-3】一个用户自己编写的程序包。PACKAGEpkg-exampleISTYPEdigitISINTEGERRANGE0TO9;

CONSTANTpi:REAL:=3.1415926535897936;-定义常量并赋值

CONSTANTdeferred-constant:INTEGER;-定义常量,没有赋值

COMPONENTand2-gateIS -定义元件

PORT(a,b:INBIT;c:OUTBIT);

ENDCONPONENTand2-gate;FUNCTIONsum(a1,a2,a3:digit)RETURNINTEGER;-定义函数

ENDPACKAGEpkg-example;

PACKAGEBODYpkg-exampleISCONSTANTdeferred-constant:INTEGER:=10; -常量赋值

FUNCTIONsum(a1,a2,a3:digit)RETURNINTEGERIS-函数的实现

BEGINRETURN(a1+a2+a3);

ENDFUNCTIONsum;

ENDPACKAGEBODYpkg-example

除了子程序的实现必须放在程序包体中以外,其它实质性操作(如常量赋值)也可以在程序包说明中完成,所以在程序包说明中没有定义子程序时,程序包体可以省略。

5.库(Library)库的作用与程序包类似,是VHDL设计的公共资源,但级别高于程序包。库中存放着已经编译过的实体说明、结构体、配置和程序包,相当于操作系统中的目录。在VHDL语言中,主要有以下几种库:

1)STD库

STD库是VHDL的标准库,库中有两个程序包:STANDARD和TEXTIO(文本文件输入输出)。在STANDARD程序包中定义了多种VHDL常用的数据类型(如BIT、BIT-ECTOR)、子类型和函数等;在TEXTIO程序包中定义了支持ASCIII/O操作的若干数据类型和子程序,多用于测试。2)WORK库

WORK库是现行作业库。设计者正在进行的设计不需任何说明,经编译后都会自动存放到WORK库中。

3)IEEE库除了STD库和WORK库以外,其它的库都被称为资源库。IEEE库是最常用、最重要的一个资源库。在该库中有一个很常用的程序包STD-LOGIC-1164,它是被IEEE正式认可的标准程序包;另外该库中还有一些常用的程序包是由公司提供的,如Synopsys公司提供的STD-LOGIC-ARITH和STD-LOGIC-UNSIGNED。4)ASIC库

ASIC库是由各个公司提供的ASIC逻辑单元信息,在进行门级仿真时可针对具体的公司进行。5)用户自定义库用户根据自身设计需要而开发的一些公用程序包、实体等汇集在一起定义成一个库,这就是用户自定义库或称为用户库。如果在设计中要用到某个库中所定义的项目(数据类型、子程序、实体等),首先必须在设计之前,用LIBRARY和USE语句使这些项目对设计而言是可见的。这两条语句的作用与C语言中的INCLUDE语句的作用类似,其一般格式为:

LIBRARY库名{,库名};

USE库名.程序包名.项目名;

第一个语句表明使用什么库,第二个语句表明使用库中的哪个程序包以及程序包中的哪个项目。最后的项目名也可以用关键字ALL代替,表明程序包中的所有内容都可以使用。例如,在使用数据类型STD-LOGIC和STD-LOGIC-VECTOR时,由于这两个数据类型都是在IEEE库的STD-LOGIC-1164程序包中定义的,所以必须在实体说明之前增加两条语句:

LIBRARYIEEE;

USEIEEE.STD-LOGIC-1164.ALL;

但是,“LIBRARYSTD,WORK;”和“USESTD.STANDARD.ALL”这两条语句对于任何VHDL源程序都是隐含存在的,不必再显式写出。

LIBRARY和USE语句的作用范围从跟在其后的设计实体开始,直到这个实体的配置结束。如果一个VHDL程序中有多个设计实体,那么在每个设计实体之前应根据需要重复使用这两条语句。8.2.2VHDL的基本语法

1.标识符

VHDL′87中关于标识符的语法规则被VHDL′93全部接受并加以扩展。为了对两者加以区分,前者称为短标识符,后者称为扩展标识符。

1)短标识符

VHDL中使用的短标识符应遵循以下规则:

(1)有效字符:英文字母、数字和下划线。

(2)必须以英文字母开头。

(3)下划线的前后必须有英文字母或数字。

(4)短标识符不区分大小写。

下面这些标识符是VHDL语言的关键字(保留字),用户自定义的标识符不能与这些关键字重名。VHDL语言的关键字包括:

ABS、ACCESS、AFTER、ALIAS、ALL、AND、ARCHITECTURE、ARRAY、ASSERT、ATTRIBUTE、BEGIN、BLOCK、BODY、BUFFER、BUS、CASE、COMPONENT、CONFIGURATION、CONSTANT、DISCONNECT、DOWNTO、ELSE、ELSIF、END、ENTITY、EXIT、FILE、FOR、FUNCTION、GENERATE、GENERIC、GROUP、GUARDED、IF、IMPURE、IN、INERTIAL、INOUT、IS、LABEL、LIBRARY、LINKAGE、LITERAL、LOOP、MAP、MOD、NAND、NEW、NEXT、NOR、NOT、NULL、OF、ON、OPEN、OR、OTHERS、OUT、PACKAGE、PORT、POSTPONED、PROCEDURE、PROCESS、PURE、RANGE、RECORD、REGISTER、REJECT、REM、REPORT、RETURN、ROL、ROR、SELECT、SEVERITY、SIGNAL、、SHARED、SLA、SLL、SRA、SRL、SUBTYPE、THEN、TO、TRANSPORT、TYPE、UNAFFECTED、UNITS、UNTIL、USE、VARIABLE、WAIT、WHEN、WHILE、WITH、XNOR和XOR。2)扩展标识符扩展标识符具有以下特性:

(1)用反斜杠来定界。如:\valid\,\eda-control\。

(2)永远与短标识符不同。如:\valid\与valid不同。

(3)区分大小写。如:\valid\与\Valid\不同。

(4)允许包含图形符号和空格符。如:\modeAandB\,\$100\,\p%name\。

(5)反斜杠之间的字符可以是保留字。如:\entity\,\architecture\。

(6)允许下画线相邻。如:\two--computers\。

(7)扩展标识符的名字中如果有一个反斜杠,则用两个相邻的反斜杠代表它。如:\ab\\c\表示该标识符的名字为ab\c。

2.对象

VHDL语言中的对象(Object)是一些能够存放或接收数据的容器(客体),共有4种基本类型:常量(CONSTANT)、变量(VARIABLE)、信号(SIGNAL)和文件(FILE)。1)常量常量中存放的是固定不变的值,可以在程序包、实体说明、结构体、子程序(函数、过程)和进程中定义,定义的格式如下:

CONSTANT常量名{,常量名}:数据类型[约束条件][:=初值];例如,

CONSTANTa1,a2:STD-LOGIC-VECTOR(3DOWNTO0):="1001";

CONSTANTa3:INTEGERRANGE0TO15:=9;常量只能被赋值一次,一般在定义一个常量时必须同时给它一个值,但在某些特殊情况下,如在程序包说明中定义常量时可以先不赋值,在程序包体中再赋值,这种常量被称为缓定常量,如例8-3中的常量deferred-constant。2)变量变量用于暂时数据的存储,普通变量只能在子程序(函数、过程)和进程中定义,定义的格式为:

VARIABLE变量名{,变量名}:数据类型[约束条件][:=初值];例如,

VARLABLEsum:BIT:=′1′;在VHDL′93中增加了“共享变量”,共享变量可以在程序包、实体说明或结构体中进行定义,定义的格式为:

SHAREDVARIABLE变量名{,变量名}:数据类型[约束条件][:=初值];3)信号信号代表电路中各元件之间的连接线,可以在程序包、实体说明或结构体中定义,设计实体的端口也被默认为信号。信号定义的格式为:

SIGNAL信号名{,信号名}:数据类型[约束条件][:=初值];例如,

SIGNALclock:STD-LOGIC:=′1′;4)文件在VHDL′93中,文件也被看作对象。文件用于存放大量数据,在仿真测试时,测试输入的激励数据和测试的结果都可以存放在文件中。文件不能像变量或信号那样通过赋值更新内容,但可以作为参数向子程序传递,通过子程序对文件进行读和写操作。文件定义的格式为:

FILE文件名:文件的类型OPEN[打开文件的模式]IS"物理文件名";例如,

FILEin-file:TEXTOPENREAD-MODEIS"test/test1.dat";

FILEout-file:TEXTOPENWRITE-MODEIS"result1.dat";

该例说明,in-file是一个文本(TEXT)文件,由于打开文件的模式为READ-MODE,所以in-file是一个输入文件,其代表的实际文件为当前工作目录下test子目录下的test1.dat;out-file则是一个输出文本文件,其代表的实际文件为当前工作目录下的result1.dat。另外,如果打开文件的模式缺省,则默认为READ-MODE。

需要强调的是,对象必须遵循先定义后使用的原则,而且其作用范围与其定义的位置密切相关。例如,在结构体说明部分定义的共享变量可以用于整个结构体;而在某个进程中定义的普通变量,其作用范围仅限于该进程,如果希望该变量的值作用于进程之外,则只能将该变量赋值给相同数据类型的信号或共享变量。

另外,一条对象说明语句中的初值是赋给这条语句中所有对象的,初值的形式除了可以是直接的具体数值以外,还可以是表达式或函数,例如:CONSTANTconst-a:INTEGER:=your-function(TRUE,3);变量和信号均可多次被赋予不同的值,如果说明信号或变量时没有赋初值,则编译系统取其默认值,相同数据类型的信号与变量之间可以相互赋值。

3.数据类型

VHDL有很强的数据类型,这种强类型语言的特点在于:每个对象都具有惟一的数据类型,而且只能被赋予那个类型的数据;施加于某个对象的操作也必须与该对象的数据类型相匹配,即定义一个操作时必须同时指明其操作对象(操作数)的数据类型。

1)标准数据类型在STD库的STANDARD程序包中预定义了10种数据类型,这些数据类型被称为标准数据类型或预定义数据类型,如表8-3所示。表8-3标准数据类型2)其它常用程序包中定义的数据类型在其它的一些程序包中也有数据类型的定义,但在使用之前必须首先声明使用相应的程序包。例如,在STD库的TEXTIO程序包中定义了一个文件类型TEXT:

TYPETEXTISFILEOFSTRING;在IEEE库的STD-LOGIC-1164程序包中定义了应用非常广泛的数据类型STD-LOGIC和STD-LOGIC-VECTOR,STD-LOGIC共有9个值,除了′0′和′1′外,还有′U′(初始值)、′X′(不定)、′Z′(高阻抗)、′W′(弱信号不定)、′L′(弱信号0)、′H′(弱信号1)和′-′(不可能情况),这大大增强了VHDL的描述能力。

在IEEE库的STD-LOGIC-ARITH程序包中定义了数据类型SIGNED和UNSIGNED。SIGNED被看作二进制补码的STD-LOGIC-VECTOR,UNSIGNED被看作无符号二进制数的STD-LOGIC-VECTOR。3)用户自定义数据类型除了使用VHDL编译系统自带的程序包中定义的数据类型外,用户也可以自己定义新的数据类型(TYPE)及子类型(SUBTYPE)。数据类型、子类型定义语句的格式一般为:

TYPE数据类型名{,数据类型名}IS[数据类型定义];

SUBTYPETYPE子类型名IS数据类型名[范围];

可由用户定义的数据类型有枚举(Enumberated)类型、整数(Integer)类型、数组(Array)类型和记录(Record)类型等。例如:

TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);-枚举类型

TYPEwordISARRAY(1TO8)OFSTD-LOGIC;-一维数组类型

TYPEmemISARRAY(0TO4,7DOWNTO0)OFSTD-LOGIC;-二维数组类型在VHDL中,数据的类型可以变换。表8-4中列出了在程序包中定义的一些数据类型转换函数。表8-4数据类型转换函数

4.操作符

VHDL中共有4类操作符,如表8-5所示。需要注意的是,VHDL对数据类型要求非常严格,操作符的操作对象是操作数,操作数的数据类型必须与操作符所要求的数据类型相一致;另外,每个操作符都是有优先级的,如下所示(同一行操作符的优先级相同):**ABSNOT*/MODREM+(正号)-(负号)SLLSRLSLASRAROLROR+-&=/=<><=>=ANDORNANDNORXORXNOR最高优先级最低优先级表8-5VHDL中的操作符8.2.3VHDL的主要描述语句

按照语句执行的顺序,VHDL的描述语句可以分成两类:顺序描述语句和并发描述语句。顾名思义,顺序描述语句是按照语句书写的顺序依次执行,这与高级语言的编程是一样的;而并发描述语句则是同时执行的,与语句在源文件中的先后次序无关。

1.顺序描述语句顺序描述语句只能出现在进程或子程序(函数、过程)中,它包括:变量赋值语句、信号代入语句、WAIT语句、IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句、RETURN语句、NULL语句、过程调用语句、断言语句和REPORT语句。1)变量赋值语句变量赋值语句的书写格式为:目的变量名:=表达式;该语句表明目的变量的值将由表达式所表达的新值代替,但两者的数据类型必须相同。表达式可以是数值、字符、信号或函数调用。2)信号代入语句信号代入语句的书写格式为:目的信号名<=表达式;信号代入与变量赋值不仅形式不同,而且其操作过程也不相同。在变量赋值语句中,该语句一旦被执行,其值立即被赋予变量,在执行下一条语句时,该变量的值就是上一句新赋的值。但在信号代入语句被执行时,不会立即发生代入操作,在执行下一条语句时,信号仍采用原来的值。这是因为信号代入语句有两个操作过程:代入语句的处理过程和实际的代入过程,这两个过程是分开进行的。在执行信号代入语句时,首先对所有的信号代入语句进行处理,也就是先把相关信号中的值读出来,并不进行代入操作;在处理完毕后,再用前面读出的值进行实际的代入操作。3)IF语句①IF语句作门闩控制:其书写格式为:[IF标号:]IF布尔表达式THEN

顺序描述语句

ENDIF[IF标号];当执行到该IF语句时,首先判断布尔表达式的值。如果布尔表达式的值为TRUE,则执行其中的顺序描述语句;否则,就跳过该IF语句,转而执行该IF语句后的其它语句。例如:

IF(en=′1′)THENa<=b;ENDIF;该语句表明,当en=′1′时,a、b完全相等,a随b的变化而变化;当en≠′1′时,a<=b语句不被执行,无论b发生什么变化,a都将维持原值不变。(2)IF语句作二选择控制:其书写格式为:[IF标号:]IF布尔表达式THEN

顺序描述语句

ELSE

顺序描述语句

ENDIF[IF标号];当执行到该IF语句时,首先判断布尔表达式的值。如果布尔表达式的值为TRUE,则执行THEN与ELSE之间的顺序描述语句;否则,就执行ELSE与ENDIF之间的顺序描述语句。(3)IF语句作多选择控制:其书写格式为:[IF标号:]IF布尔表达式THEN

顺序描述语句

ELSIF布尔表达式THEN-注意,不是ELSEIF

顺序描述语句

{ELSIF布尔表达式THEN

顺序描述语句}

[ELSE

顺序描述语句]

ENDIF[IF标号];

在这种多选择控制的IF语句中,设置了多个条件(布尔表达式)。在执行时,按照书写的顺序依次判断各个条件,如果上一个条件不满足,再判断下一个条件;当满足其中的一个条件时,执行该条件后所跟的顺序描述语句,执行完毕后不再对剩余的条件作判断,而是直接跳出该IF语句,转而执行该IF语句后的其它语句;当所有的条件都不满足时,如果有ELSE语句,则在执行完ELSE之后的顺序描述语句后跳出该IF语句,否则直接跳出该IF语句。4)CASE语句

CASE语句的一般格式如下:[CASE标号:]CASE条件表达式ISWHEN条件表达式的值=>顺序描述语句

{WHEN条件表达式的值=>顺序描述语句}

[WHENOTHERS=>顺序描述语句]

ENDCASE[CASE标号];其中条件表达式必须是离散类型或一维数组类型;条件表达式的值有4种表示形式,分别为单个值、多个值、取值范围和其它所有的值:WHEN值=>顺序描述语句-单个值

WHEN值{︱值}=>顺序描述语句-多个值

WHEN值TO值=>顺序描述语句-取值范围

WHEN值DOWNTO值=>顺序描述语句-取值范围

WHENOTHERS=>顺序描述语句-其它所有的值CASE语句根据条件表达式的取值,选择执行相应的分支(WHEN子句)中“=>”后面的顺序描述语句。CASE语句的各个分支之间是并行、互斥的关系,不允许在不同分支中出现相同的值;并且所有的分支合起来应包括条件表达式值域中的所有值;如果要使用OTHERS分支,则只能有一个,并且要放在最后。5)LOOP语句

LOOP语句类似于高级编程语言中的循环语句。LOOP语句有两种书写格式:

(1)FOR循环变量,其格式为:[LOOP标号:]FOR循环变量IN循环范围LOOP

顺序描述语句

ENDLOOP[LOOP标号];循环变量不需要显式说明,必须为离散量;循环范围就是循环变量的取值范围,用它来说明循环的次数。每循环一次,循环变量的值自动改变,但不能人为对其赋值。(2)WHILE条件,其格式为:[LOOP标号:]WHILE(布尔表达式)LOOP

顺序描述语句

ENDLOOP[LOOP标号];每次执行循环之前先检查布尔表达式的值,如果为TRUE,则执行循环;如果为FALSE,则结束循环状态,继而执行该LOOP语句之后的下一条语句。6)NEXT语句和EXIT语句

NEXT语句和EXIT语句均为LOOP语句中的循环控制语句。

NEXT语句的书写格式为:

NEXT[LOOP标号][WHEN布尔表达式];在LOOP语句中执行NEXT语句将停止当前的这一次循环,转入下一次新的循环。NEXT后的标号表示下一次循环的起始位置;如果标号缺省,即进入当前这一层LOOP语句的下一次循环。“WHEN布尔表达式”表示只有当布尔表达式取值为TRUE时NEXT语句才被执行,否则不执行;如果这一项缺省,表示无条件执行NEXT语句。EXIT语句的书写格式为:

EXIT[LOOP标号][WHEN布尔表达式];与NEXT语句不同,在LOOP语句中执行EXIT语句将结束当前这一层的循环状态,从当前这一层的LOOP语句中跳出。如果EXIT后有标号,则表示将跳到标号处继续执行;如果标号缺省,下一条要执行的语句就是继本层LOOP语句之后的下一条语句。“WHEN布尔表达式”的作用与NEXT语句中的相同。

2.并发描述语句

在VHDL的结构体中没有规定语句的执行次序,所有的语句都可以同时执行。在任何一个时刻,每个语句是否执行仅取决于该语句中的敏感信号是否发生了新的变化,敏感信号每发生一次变化,该语句就执行一次。

VHDL结构体中的并发语句包括:信号代入语句、块(BLOCK)语句、进程(PROCESS)语句、断言(ASSERT)语句、过程调用语句、生成(GENERATE)语句和元件例化语句。1)进程语句在VHDL中,一个功能相对独立的电路模块可以用一个PROCESS语句来描述。VHDL的结构体中允许有多个进程语句,各进程语句之间是并行关系,而每个进程内部的各语句则是按照它们排列的顺序执行的。PROCESS语句的基本格式为:[进程名:]PROCESS(敏感信号表)[IS] [进程说明区]

BEGIN

顺序并发语句

ENDPROCESS[进程名];

在敏感信号表中列出了进程所有的敏感信号,它们是进程的某些输入信号,之所以被称为敏感信号,是因为当有一个或多个这样的信号发生变化时,进程便被激活,从而开始按顺序执行进程中的语句,在执行完进程的最后一条语句后,进程被挂起,等待再次被激活。反之,如果没有这样的信号发生变化,进程中的语句就不会被执行。【例8-4】具有异步清零、同步置位功能的D触发器的VHDL描述。、、LIBRARYIEEE;

USEIEEE.STD-LOGIC-1164.ALL;

ENTITYd-ffISPORT(aclr,clk,sset:INSTD-LOGIC;

q,nq:OUTSTD-LOGIC);

ENDENTITYd-ff;

ARCHITECTUREarchOFd-ffISBEGINPROCESS(aclr,clk)ISBEGINIF(aclr=′1′)THENq<=′0′;nq<=′1′;

ELSIF(clk′EVENTANDclk=′1′)THENIF(sset=′1′)THENq<=′1′;nq<=′0′;

ELSEq<=d;nq<=NOTd;

ENDIF;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREarch;在VHDL中时钟的表示方法如表8-6所示。表8-6时钟的表示方法2)信号代入语句信号代入语句也可以作为并行语句出现在结构体中,共有三种形式:

(1)并发信号代入语句,其格式为:目的信号名<=表达式;(2)条件信号代入语句,其格式为:目的信号名<=表达式WHEN布尔表达式ELSE{表达式WHEN布尔表达式ELSE}

表达式;(3)选择信号代入语句,其格式为:

WITH条件表达式SELECT

目的信号名<={表达式WHEN条件表达式的值,}

表达式WHEN条件表达式的值;

结构体中的这三种信号代入语句实际上是进程语句在特定情况下的缩写。在功能上和语法上,分别与顺序语句中的信号代入语句、IF语句和CASE语句类似。需要强调的是,由于结构体中的信号代入语句是并发执行(并发处理、并发代入)的,所以不允许出现多个对同一个信号的代入语句;而这种情况对顺序信号代入语句是允许的,因为代入是按顺序的,所以信号以最后代入的值作为最终值。3)元件例化语句元件例化是指在层次化设计中,将已经编译好的设计实体定义为元件并在当前的设计中调用的过程。元件例化一般由元件定义语句、元件例化语句和元件配置语句三部分组成。(1)元件定义语句:用于将一个设计实体定义成一个元件,存在于结构体说明部分或程序包说明部分,其书写格式为:

COMPONENT元件名IS

[类属参数说明]端口说明

ENDCOMPONENT元件名;

元件名是用户给例化元件起的名字,一般就是它所代表的实体的名字。元件定义中的类属参数说明和端口说明与例化元件所代表的实体中的这两项完全相同。(2)元件例化语句:用于调用例化元件,即把例化元件的端口与当前设计中指定的信号相连接(端口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论