1、第第8 8章章 电子设计自动化电子设计自动化8.1 EDA概述概述8.2 硬件描述语言硬件描述语言VHDL 初步初步8.3 VHDL设计实例设计实例8.4Quartus开发系统开发系统8.1 EDA概述概述 EDA就是以计算机为工作平台、以EDA软件工具为开发环境、以硬件描述语言为设计语言、以ASIC为实现载体的电子产品自动化设计过程,它包括半导体工艺设计自动化、可编程逻辑器件设计自动化、电子系统设计自动化、印刷电路板(Printed Circuit Board)PCB设计自动化、仿真测试、故障诊断以及形式验证自动化。需要说明的是,这里所讲的是狭义的EDA,没有包括模拟电路的设计自动化。EDA
2、作为一门崭新的学科,它的知识体系结构为:现代电子设计理论;可编程逻辑器件原理、结构及应用;硬件描述语言;EDA工具的开发和应用;EDA设计方法论;EDA的应用及实践。8.1.1 EDA的发展概况的发展概况 集成电路技术的发展不断对EDA技术提出新的要求,对EDA技术的发展起了巨大的推动作用。从20世纪60年代中期开始,人们就不断地开发出各种计算机辅助设计工具来帮助设计人员进行集成电路和电子系统的设计。近40年来,EDA技术大致经历了计算机辅助设计CAD(Computer Aided Design)、计算机辅助工程CAE(Computer Aided Engineering)和电子系统设计自动化
3、ESDA(Electronic System Design Automation)三个发展阶段。1CAD阶段(阶段(20世纪世纪60年代中期年代中期20世纪世纪80年代初期)年代初期)20世纪70年代,随着中、小规模集成电路的开发和应用,传统的手工制图设计印刷电路板和集成电路的方法已无法满足设计精度和效率的要求,于是工程师们开始进行二维平面图形的计算机辅助设计,这样就产生了第一代EDA工具,设计者也从繁杂、机械的计算、布局和布线工作中解放了出来。但在EDA发展的初始阶段,EDA工具的供应商只有几家,产品几乎全部面向PCB设计、电路模拟或IC版图设计。例如,目前常用的PCB布线软件Protel的
4、早期版本Tango、用于电路模拟的SPICE软件以及后来产品化的IC版图编辑与设计规则检查系统等软件,都是这个时期的产品。20世纪80年代初,随着集成电路规模的增大,EDA技术有了较快的发展。更多的软件公司,如当时的Mentor公司、Daisy Systems及Logic System公司等进入EDA领域,开始提供带电路图编辑工具和逻辑模拟工具的EDA软件,主要解决了设计实现之前的功能检验问题。总的来讲,这一阶段的EDA水平还很低,对设计工作的支持十分有限,主要存在两个方面的问题需要解决:EDA软件的功能单一、相互独立。这个时期的EDA工具软件都是分别针对设计流程中的某个阶段开发的,一个软件只
5、能完成其中的一部分工作,所以设计者不得不在设计流程的不同阶段分别使用不同的EDA软件包。然而,由于不同的公司开发的EDA工具之间的兼容性较差,为了使设计流程前一级软件的输出结果能够被后一级软件接受,就需要人工处理或再运行另外的转换软件,这往往很繁琐,势必影响设计的速度。对于复杂电子系统的设计,不能提供系统级的仿真和综合,所以设计中的错误往往只能在产品开发的后期才能被发现,这时再进行修改十分困难。2 CAE阶段(阶段(20世纪世纪80年代初期年代初期20世纪世纪90年代初期)年代初期)这个阶段在集成电路与电子系统设计方法学以及设计工具集成化方面取得了许多成果。各种设计工具,如原理图输入、编译与连
6、接、逻辑模拟、逻辑综合、测试码生成、版图自动布局以及各种单元库均已齐全。不同功能的设计工具之间的兼容性得到了很大改善,那些不走兼容道路、想独树一帜的CAD工具受到了用户的抵制,逐渐被淘汰。EDA软件设计者采用统一数据管理技术,把多个不同功能的设计软件结合成一个集成设计环境。按照设计方法学制定的设计流程,在一个集成设计环境中就能实现由寄存器传输级RTL(Register Transfers Level)开始,从设计输入到版图输出的全程设计自动化。在这个阶段,基于门阵列和标准单元库设计的半定制ASIC得到了极大的发展,将电子系统设计推入了ASIC时代。但是,大部分从原理图出发的CAE工具仍然不能适
7、应复杂电子系统的要求,而且具体化的元件图形制约着优化设计。3 ESDA阶段(阶段(20世纪世纪90年代以来)年代以来)20世纪90年代以来,集成电路技术以惊人的速度发展,其工艺水平已经达到深亚微米级,一个芯片上可以集成数百万甚至上千万只晶体管,工作频率可达GHz。这不仅为片上系统SOC(System On Chip)的实现提供了可能,同时也给EDA技术提出了更高的要求,促进了EDA技术的发展。在这一阶段,出现了以硬件描述语言、系统级仿真和综合技术为基本特征的第三代EDA技术,它使设计师们摆脱了大量的具体设计工作,而把精力集中于创造性的方案与概念构思上,从而极大地提高了系统设计的效率,缩短了产品
8、的研制周期。EDA技术在这一阶段的发展主要有以下几个方面。1)用硬件描述语言来描述数字电路与系统 这是现代EDA技术的基本特征之一,并且已经形成了VHDL和Verilog HDL两种IEEE(The Institute of Electrical and Electronics Engineers,电气和电子工程师协会)标准硬件描述语言。它们均能支持系统级、算法级、RTL级(又称数据流级)和门级各个层次的描述或多个不同层次的混合描述,涉及的领域有行为描述和结构描述两种形式。硬件描述与实现工艺无关,而且还支持不同层次上的综合与仿真。硬件描述语言的使用规范了设计文档,便于设计的传递、交流、保存、修
9、改及重复使用。2)高层次的仿真与综合 所谓综合,就是由较高层次描述到低层次描述、由行为描述到结构描述的转换过程;仿真是在电子系统设计过程中对设计者的硬件描述或设计结果进行查错、验证的一种方法。对应于不同层次的硬件描述,有不同级别的综合与仿真工具。高层次的综合与仿真将自动化设计的层次提高到了算法行为级,使设计者无需面对低层电路,而把精力集中到系统行为建模和算法设计上,而且可以帮助设计者在最早的时间发现设计中的错误,从而大大缩短了设计周期。3)平面规划技术 平面规划(Floorplaning)技术对逻辑综合和物理版图设计进行联合管理,做到在逻辑综合早期设计阶段就考虑到物理设计信息的影响。通过这些信
10、息,可以再进一步地对设计进行综合和优化,并保证不会对版图设计带来负面的影响。这在深亚微米级布线时延已经成为主要时延的情况下,对加速设计过程的收敛与成功是有所帮助的。在Synopsys和Cadence等著名公司的EDA系统中都采用了这项技术。4)可测试性综合设计 随着ASIC规模和复杂性的增加,测试的难度和费用急剧上升,由此而产生了将可测试性电路结构做在ASIC芯片上的思想,于是开发出了扫描插入、内建自测试(BIST)和边界扫描等可测试性设计(DFT)工具,并已集成到EDA系统中。如Compass公司的Test Assistant和Mentor Graphics公司的LBLST Achitect
11、、BSD Achitect和DFT Advisor等。5)开放性、标准化框架结构的集成设计环境和并行设计工程 近年来,随着硬件描述语言等设计数据格式的逐渐标准化,不同设计风格和应用的要求使得有必要建立开放性、标准化的EDA框架。所谓框架,就是一种软件平台结构,为EDA工具提供操作环境。框架的关键在于建立与硬件平台无关的图形用户界面以及工具之间的通信、设计数据和设计流程的管理等,此外还包括各种与数据库相关的服务项目。任何一个EDA系统只要建立一个符合标准的开放式框架结构,就可以接纳其它厂商的EDA工具一起进行设计工作。这样,框架作为一套使用和配置EDA软件包的规范,就可以实现各种EDA工具间的优
12、化组合,并集成在一个易于管理的统一环境下,实现资源共享。针对当今电子设计中数字电路与模拟电路并存、硬件设计与软件设计并存以及产品更新换代快的特点,并行设计工程CE(Concurrent Engineering)要求一开始就从管理层次上把工艺、工具、任务、智力和时间安排协调好;在统一的集成设计环境下,由若干相关的设计小组共享数据库和知识库,同步进行设计。CE改变了传统的设计过程中,过分依赖专业分工和设计人员过分强调所学专业知识的状况。8.1.2 EDA设计语言设计语言 1 VHDL和和Verilog HDL语言语言 VHDL是由美国国防部在70年代末和80年代初提出的超高速集成电路VHSIC(V
13、ery High Speed Integrated Circuit)计划的产物,其目的是为了在承担国防部定货的各集成电路厂商之间建立一个统一的设计数据和文档交换格式。1987年12月,IEEE接受HDL为标准HDL,也就是IEEEStd1076-1987LRM87。此后又做了一些修改,新的版本为IEEEStd1076-1993LRM93。Verilog HDL是在1983年,由GDA(Gate Way Design Automation)公司的Phil Moorby首创的。1986年,Moorby提出了用于快速门级仿真的Verilog XL算法,使Verilog HDL得到了迅速发展。1989
14、年,Cadence公司收购了GDA公司,Verilog HDL成了Cadence公司的私有财产。1990年,Cadence公司决定公开发表Verilog HDL,并成立了OVI(Open Verilog International)组织来负责Verilog HDL的推广。基于Verilog HDL的优越性,Verilog HDL于1995年成为了IEEE的另一个HDL标准。几年以来,EDA界对VHDL和Verilog HDL这两种语言一直争论不休。实际上这两种语言各有所长,市场占有率也相差不多。一般认为,Verilog HDL是从集成电路的设计中发展而来的,在门级电路、晶体管开关级电路的描述方
15、面比VHDL强,在系统级的抽象描述方面,VHDL则更合适。目前,大多数的EDA软件都同时支持这两种硬件描述语言。2ABEL和和AHDL语言语言 与VHDL和Verilog HDL相比,ABEL和AHDL的功能相对比较简单,它们适合于RTL级和门级电路的描述,主要用于可编程逻辑器件的开发。ABEL语言是由美国Data I/O公司推出的,该公司也是ABEL语言综合器的惟一供应商,有不少EDA软件支持ABEL语言,如ispEXPERT、Synario、Foundation等。AHDL语言则只集成在Altera公司的可编程逻辑器件开发工具中,只能在Altera的开发软件中进行编译和调试。3 C语言语言
16、 在电子系统设计中,硬件设计采用VHDL和Verilog HDL之类硬件描述语言,软件设计则采用C和C+等编程语言。这种硬件设计和软件设计使用不同语言的现象,给设计带来了不便,延长了产品开发的周期。从EDA的发展趋势来看,直接用C语言来描述硬件是未来的一个发展方向,这样软件设计人员和硬件设计人员之间就有了“共同语言”,从而能够实现软、硬件协同设计,提高设计效率。目前,用C语言描述硬件主要有两个分支:System C和Spec C。System C适用于从系统设计到逻辑设计这一阶段;Spec C则适用于从对技术要求的把握到系统设计这一阶段。图 8-1 EDA工具的范畴 8.1.3 EDA开发工具
17、开发工具 EDA工具主要能够进行三个方面的辅助设计工作:印刷电路板PCB设计;ASIC设计;电子系统设计。没有EDA工具的支持,想要完成超大规模集成电路或复杂电子系统的设计制造是不可想象的。全球的EDA软件供应商有近百家之多,大体上可以分成两类:一类是专业的EDA软件公司,如Mentor Graphics、Cadence Design Systems、Synopsys、Viewlogic Systems和Protel等;另一类是半导体器件厂商,为销售他们的产品而开发EDA工具,Altera、Xilinx、Lattice和Actel等。专业的EDA软件公司独立于半导体器件厂商,推出的EDA工具有
18、较好的标准化和兼容性,也比较注意追求技术上的先进性,一般将这类工具称为第三方工具;而半导体器件厂商开发的EDA工具则能够作出针对自己器件特点的优化设计。在表8-1中列出了部分EDA软件,其中也包括了一些模拟/数字混合电路的EDA软件。表表8-1 部分部分EDA软件简介软件简介表表8-1 部分部分EDA软件简介软件简介8.1.4 EDA设计方法设计方法 EDA设计方法属于现代电子设计的范畴,它与经典的电子设计方法不同。主要涵盖行为描述法、IP复用法、ASIC设计方法、数字系统的高层次设计方法、e-DA网上设计方法、软硬件协同设计方法、基于集成平台的设计方法。数字系统的设计包括行为、结构和物理三个
19、领域。行为是指系统的功能,或者说系统应该做什么;结构是指系统的组成,或者说系统的抽象实现,典型的是抽象模块的相互连接;物理是指系统具体实现的几何特征与物理特性,也就是把结构领域中的抽象元件代之以真实的物理元件。根据抽象级别的不同,数字系统又划分为若干层次,一般从顶向下包括系统级、算法级、寄存器传输级(RTL)、逻辑级、电路级等。通常将寄存器传输级以上的层次称为高层次。利用硬件描述语言在寄存器传输级以上的层次进行描述、设计的方法称为数字系统的高层次设计方法,描述的层次越高,设计的层次就越高。数字系统的高层次设计方法代表了现代数字系统设计的发展方向,它的基本特征是:用一片或几片ASIC实现整个数字
20、系统;设计人员遵循“自顶向下”的设计思想,首先对整个系统进行方案设计、功能划分和算法设计,并采用硬件描述语言完成算法级行为描述,最后由EDA工具完成目标器件的设计。ASIC、EDA工具和硬件描述语言是高层次设计方法的三大基石。图 8-2 数字系统高层次设计的设计流程 在明确系统功能的前提下,首先设计系统的实现方案,然后进行功能划分和算法设计。这些富有创造性的工作与上一章所介绍的基本相同,仍然需要由人工完成,只不过在高层次设计方法中,这些工作不再受市场上通用逻辑器件的局限。设计输入。一般是采用VHDL/Verilog HDL在算法级对系统进行行为描述,此外还可以采用比较直观的图形输入方式(方框图
21、、状态图等)。编译。编译器对以上设计中的HDL描述的语法和语意进行检查和解释,并将以上的输入转换成适当的中间数据格式,为下一步的综合作好准备。功能仿真。功能仿真又称为前仿真,主要是检验系统的逻辑功能设计的正确性,除了系统规定的定时关系以外,对实际电路中的惯性时延、传输时延均不予考虑。对于大型的设计,综合、适配要花费数小时,在综合之前进行功能仿真就可以及早发现设计错误,节约设计时间。一般情况下,对于比较简单的设计,可以略去这一仿真步骤。综合。利用综合器对HDL源代码进行综合优化处理,生成门级描述的网表文件,这是将高层次描述转化为硬件电路的关键步骤。适配。利用适配器将综合后的网表文件针对某一具体的
22、目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。适配完成后,产生多项设计结果:适配报告(包括芯片内部资源利用情况)、引脚分配和设计的布尔方程描述情况;适配后的仿真模型;器件编程文件。时序仿真。根据适配后的仿真模型,可以进行时序仿真(又称为后仿真),因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确地预期未来芯片的实际性能。如果仿真结果达不到设计要求,就需要修改HDL源代码或选择不同速度品质的器件,直至满足设计要求为止。PLD编程。将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片可编程逻辑器件中。器件测试。在器件编程后,需要利用实验手段测试
23、器件最终的功能和性能指标。如果是大批量产品的开发,通过更换相应厂家的综合库,可以很容易转由掩膜ASIC形式实现。8.2 硬件描述语言硬件描述语言VHDL初步初步8.2.1 VHDL源程序的基本结构源程序的基本结构 一个完整的VHDL源程序通常包含实体说明(Entity Declaration)、结构体(Architecture)、库(Library)、程序包(Package)和配置(Configuration)5个部分。设计实体(Design Entity)是VHDL源程序的基本单元,由实体说明和结构体两部分组成。实体所代表的对象几乎没有限制,小可至一个逻辑门,大可至一个复杂的CPU芯片,甚至
24、整个系统。如果设计时采用自顶向下的层次化设计和模块划分,则各层的设计模块都可以作为实体,高层次的实体可以调用低层次的实体。1 实体说明(实体说明(Entity Declaration)实体说明是一个实体的外部视图,其中包括对该实体输入/输出端口的描述。下面就是实体说明语句的格式:ENTITY 实体名 IS 类属参数说明 端口说明 实体说明部分 BEGIN 实体语句部分 END ENTITY实体名;其中,实体名是设计者为该实体取的一个名称。必须强调的是,VHDL语句都以分号(;)结尾,一般不可省略。端口说明的书写格式如下:PORT(端口名,端口名:端口方向 数据类型;端口名,端口名:端口方向 数
25、据类型);端口名是设计者赋予每个外部端口的名称。表表8-2 端口方向说明端口方向说明 数据类型用于定义端口数据的具体类型,VHDL中的数据类型将在后面再作介绍。在逻辑设计中,通常用位(BIT或STD-LOGIC)定义单个端口,用位矢量(BIT-VECTOR或STD-LOGIC-ECTOR)定义总线端口。2 结构体(结构体(Architecture)结构体与实体说明相配合,用于描述实体的具体功能,也就是输入和输出信号之间的逻辑关系。在VHDL文件中,结构体的位置在实体说明之后,编译器通常是先编译实体说明,再对其结构体进行编译。一个实体中可以包含多个结构体,它们分别代表了对实体功能的不同实现方案或
26、不同的描述风格。一个结构体的具体结构描述如下:ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并发描述语句 END ARCHITECTURE结构体名;说明语句用于定义或说明在该结构体中用到的信号(Signal)、常量(Constant)、共享变量、元件(Component)和数据类型。并发描述语句是描述实体功能的主要语句,也是最富有变化的部分。必须强调的是,这些语句都是并发(同时)执行的,与它们在程序中出现的先后次序无关。【例8-1】1位二进制全加器的VHDL源程序。设被加数、加数分别为a、b,进位输入为c-in,进位输出为c-out,和数为sum。ENTITY
27、one-bit-full-adder IS PORT(a,b,c-in:IN BIT;-定义输入端口 c-out,sum:OUT BIT);-定义输出端口 END ENTITY one-bit-full-adder;ARCHITECTURE arch OF one-bit-full-adder IS BEGIN c-out=(a AND b)OR(a XOR b)AND c-in);-用输出变量的逻辑方程进行描述 sum=(a XOR b)XOR c-in;END ARCHITECTURE arch;3 配置(配置(Configuration)在层次化设计中,一个已经设计好的设计实体可以在另一
28、个设计实体中被定义成一个元件来使用,而且任何一个设计实体都可以有多个结构体。配置语句描述的就是高层设计中的元件与低层实体之间的对应关系以及实体与结构体之间的连接关系。在对实体进行仿真时,设计者可以利用配置语句为实体选择不同的结构体,进行性能对比以求获得性能最佳的结构体。配置语句一般跟在结构体的后面,其基本书写格式如下:CONFIGURATION 配置名 OF 实体名 IS 配置说明语句 END配置名;其中,配置说明语句有多种形式,有简有繁。对于不包含块(Block)语句和元件(Component)语句的结构体,配置说明语句有最简单的形式:FOR 选配的结构体名 END FOR;【例8-2】含有
29、两个结构体的1位二进制全加器的VHDL源文件。ENTITY one-bit-full-adder IS PORT(a,b,c-in:IN BIT;c-out,sum:OUT BIT);END ENTITY one-bit-full-adder;ARCHITECTURE arch1 OF one-bit-full-adder IS BEGIN c-out=(a AND b)OR(a XOR b)AND c-in);sum=(a XOR b)XOR c-in;END ARCHITECTURE arch1;ARCHITECTURE arch2 OF one-bit-full-adder IS SIG
30、NAL temp-in:BIT-VECTOR(2 DOWNTO 0);SIGNAL temp-out:BIT-VECTOR(1 DOWNTO 0);BEGIN temp-in=a&b&c-in;(c-out,sum)temp-out temp-out temp-out temp-out temp-out temp-out temp-out temp-out=11;END CASE;END PROCESS;END ARCHITECTURE arch2;CONFIGURATION config OF one-bit-full-adder IS FOR arch2 END FOR;END CONFI
31、GURATION config;对于包含Component语句的结构体,配置说明语句可以采用如下形式:FOR 选配结构体名 FOR 元件标号,元件标号:元件名 USE ENTITY WORK.实体名(结构体名);END FOR;FOR 元件标号,元件标号:元件名 USE ENTITY WORK.实体名(结构体名);END FOR;END FOR;这里还可以使用 FOR OTHERS:元件名 USE ENTITY WORK.实体名(结构体名);FOR ALL:元件名USE ENTITY WORK.实体名(结构体名);如果没有指定实体所对应的结构体,则默认最新编译的结构体与实体连接。4 程序包(程
32、序包(Package)在一个设计的实体说明和结构体说明部分定义的数据类型、常量和子程序等,对其它设计单元是不可见(不能引用)的,为了使它们可以为多个设计单元所共享,VHDL语言提供了程序包机制。程序包是一个可以单独编译的单元,在其中可以定义一些公用数据类型、常量、子程序和元件等,作用与C语言中的H文件类似。在VHDL编译系统中有许多标准的程序包,用户也可以自己编写程序包。一个程序包由两大部分组成:程序包说明和程序包体,其基本格式为:PACKAGE 程序包名 IS 说明语句 END PACKAGE程序包名;PACKAGE BODY程序包名 IS 说明语句 END PACKAGE BODY程序包名
33、;在程序包说明中首先对数据类型、常量、子程序(函数、过程)和元件等进行定义,在程序包体中再描述各项的具体细节,如常量赋值、子程序的实现等。程序包说明程序包体【例8-3】一个用户自己编写的程序包。PACKAGE pkg-example IS TYPE digit IS INTEGER RANGE 0 TO 9;CONSTANT pi:REAL:=3.1415926535897936;-定义常量并赋值 CONSTANT deferred-constant:INTEGER;-定义常量,没有赋值 COMPONENT and2-gate IS -定义元件 PORT(a,b:IN BIT;c:OUT BI
34、T);END CONPONENT and2-gate;FUNCTION sum(a1,a2,a3:digit)RETURN INTEGER;-定义函数 END PACKAGE pkg-example;PACKAGE BODY pkg-example IS CONSTANT deferred-constant:INTEGER:=10;-常量赋值 FUNCTION sum(a1,a2,a3:digit)RETURN INTEGER IS -函数的实现 BEGIN RETURN(a1+a2+a3);END FUNCTION sum;END PACKAGE BODY pkg-example 除了子程序
35、的实现必须放在程序包体中以外,其它实质性操作(如常量赋值)也可以在程序包说明中完成,所以在程序包说明中没有定义子程序时,程序包体可以省略。5 库(库(Library)库的作用与程序包类似,是VHDL设计的公共资源,但级别高于程序包。库中存放着已经编译过的实体说明、结构体、配置和程序包,相当于操作系统中的目录。在VHDL语言中,主要有以下几种库:1)STD库 STD库是VHDL的标准库,库中有两个程序包:STANDARD和TEXTIO(文本文件输入输出)。在STANDARD程序包中定义了多种VHDL常用的数据类型(如BIT、BIT-ECTOR)、子类型和函数等;在TEXTIO程序包中定义了支持A
36、SCII I/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逻辑单元信息,在进行门级仿真时可针
37、对具体的公司进行。5)用户自定义库 用户根据自身设计需要而开发的一些公用程序包、实体等汇集在一起定义成一个库,这就是用户自定义库或称为用户库。如果在设计中要用到某个库中所定义的项目(数据类型、子程序、实体等),首先必须在设计之前,用LIBRARY和USE语句使这些项目对设计而言是可见的。这两条语句的作用与C语言中的INCLUDE语句的作用类似,其一般格式为:LIBRARY 库名 ,库名;USE 库名.程序包名.项目名;第一个语句表明使用什么库,第二个语句表明使用库中的哪个程序包以及程序包中的哪个项目。最后的项目名也可以用关键字ALL代替,表明程序包中的所有内容都可以使用。例如,在使用数据类型S
38、TD-LOGIC和STD-LOGIC-VECTOR时,由于这两个数据类型都是在IEEE库的STD-LOGIC-1164程序包中定义的,所以必须在实体说明之前增加两条语句:LIBRARY IEEE;USE IEEE.STD-LOGIC-1164.ALL;但是,“LIBRARY STD,WORK;”和“USE STD.STANDARD.ALL”这两条语句对于任何VHDL源程序都是隐含存在的,不必再显式写出。LIBRARY和USE语句的作用范围从跟在其后的设计实体开始,直到这个实体的配置结束。如果一个VHDL程序中有多个设计实体,那么在每个设计实体之前应根据需要重复使用这两条语句。8.2.2 VHD
39、L的基本语法的基本语法 1标识符标识符 VHDL87中关于标识符的语法规则被VHDL93全部接受并加以扩展。为了对两者加以区分,前者称为短标识符,后者称为扩展标识符。1)短标识符 VHDL中使用的短标识符应遵循以下规则:(1)有效字符:英文字母、数字和下划线。(2)必须以英文字母开头。(3)下划线的前后必须有英文字母或数字。(4)短标识符不区分大小写。下面这些标识符是VHDL语言的关键字(保留字),用户自定义的标识符不能与这些关键字重名。VHDL语言的关键字包括:ABS、ACCESS、AFTER、ALIAS、ALL、AND、ARCHITECTURE、ARRAY、ASSERT、ATTRIBUTE
40、、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、
41、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)永远与短标识符不同。如:val
42、id与valid不同。(3)区分大小写。如:valid与Valid不同。(4)允许包含图形符号和空格符。如:mode A and B,$100,p%name。(5)反斜杠之间的字符可以是保留字。如:entity,architecture。(6)允许下画线相邻。如:two-computers。(7)扩展标识符的名字中如果有一个反斜杠,则用两个相邻的反斜杠代表它。如:abc表示该标识符的名字为abc。2 对象对象 VHDL语言中的对象(Object)是一些能够存放或接收数据的容器(客体),共有4种基本类型:常量(CONSTANT)、变量(VARIABLE)、信号(SIGNAL)和文件(FILE)。
43、1)常量 常量中存放的是固定不变的值,可以在程序包、实体说明、结构体、子程序(函数、过程)和进程中定义,定义的格式如下:CONSTANT 常量名 ,常量名:数据类型 约束条件:初值;例如,CONSTANT a1,a2:STD-LOGIC-VECTOR(3 DOWNTO 0):1001;CONSTANT a3:INTEGER RANGE 0 TO 15:9;常量只能被赋值一次,一般在定义一个常量时必须同时给它一个值,但在某些特殊情况下,如在程序包说明中定义常量时可以先不赋值,在程序包体中再赋值,这种常量被称为缓定常量,如例8-3中的常量deferred-constant。2)变量 变量用于暂时数
44、据的存储,普通变量只能在子程序(函数、过程)和进程中定义,定义的格式为:VARIABLE 变量名 ,变量名:数据类型 约束条件:初值;例如,VARLABLE sum:BIT:1;在VHDL93中增加了“共享变量”,共享变量可以在程序包、实体说明或结构体中进行定义,定义的格式为:SHARED VARIABLE 变量名 ,变量名:数据类型 约束条件:初值;3)信号 信号代表电路中各元件之间的连接线,可以在程序包、实体说明或结构体中定义,设计实体的端口也被默认为信号。信号定义的格式为:SIGNAL 信号名 ,信号名:数据类型 约束条件:初值;例如,SIGNAL clock:STD-LOGIC:1;4
45、)文件 在VHDL93中,文件也被看作对象。文件用于存放大量数据,在仿真测试时,测试输入的激励数据和测试的结果都可以存放在文件中。文件不能像变量或信号那样通过赋值更新内容,但可以作为参数向子程序传递,通过子程序对文件进行读和写操作。文件定义的格式为:FILE 文件名:文件的类型 OPEN 打开文件的模式 IS 物理文件名;例如,FILE in-file:TEXT OPEN READ-MODE IS test/test1.dat;FILE out-file:TEXT OPEN WRITE-MODE IS result1.dat;该例说明,in-file是一个文本(TEXT)文件,由于打开文件的模
46、式为READ-MODE,所以in-file是一个输入文件,其代表的实际文件为当前工作目录下test子目录下的test1.dat;out-file则是一个输出文本文件,其代表的实际文件为当前工作目录下的result1.dat。另外,如果打开文件的模式缺省,则默认为READ-MODE。需要强调的是,对象必须遵循先定义后使用的原则,而且其作用范围与其定义的位置密切相关。例如,在结构体说明部分定义的共享变量可以用于整个结构体;而在某个进程中定义的普通变量,其作用范围仅限于该进程,如果希望该变量的值作用于进程之外,则只能将该变量赋值给相同数据类型的信号或共享变量。另外,一条对象说明语句中的初值是赋给这条
47、语句中所有对象的,初值的形式除了可以是直接的具体数值以外,还可以是表达式或函数,例如:CONSTANT const-a:INTEGER:your-function(TRUE,3);变量和信号均可多次被赋予不同的值,如果说明信号或变量时没有赋初值,则编译系统取其默认值,相同数据类型的信号与变量之间可以相互赋值。3 数据类型数据类型 VHDL有很强的数据类型,这种强类型语言的特点在于:每个对象都具有惟一的数据类型,而且只能被赋予那个类型的数据;施加于某个对象的操作也必须与该对象的数据类型相匹配,即定义一个操作时必须同时指明其操作对象(操作数)的数据类型。1)标准数据类型 在STD库的STANDAR
48、D程序包中预定义了10种数据类型,这些数据类型被称为标准数据类型或预定义数据类型,如表8-3所示。表表8-3 标准数据类型标准数据类型 2)其它常用程序包中定义的数据类型 在其它的一些程序包中也有数据类型的定义,但在使用之前必须首先声明使用相应的程序包。例如,在STD库的TEXTIO程序包中定义了一个文件类型TEXT:TYPE TEXT IS FILE OF STRING;在IEEE库的STD-LOGIC-1164程序包中定义了应用非常广泛的数据类型STD-LOGIC和STD-LOGIC-VECTOR,STD-LOGIC共有9个值,除了0和1外,还有U(初始值)、X(不定)、Z(高阻抗)、W(
49、弱信号不定)、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 数据类型定义;SUBTYPE TYPE
50、子类型名 IS 数据类型名 范围;可由用户定义的数据类型有枚举(Enumberated)类型、整数(Integer)类型、数组(Array)类型和记录(Record)类型等。例如:TYPE week IS(sun,mon,tue,wed,thu,fri,sat);-枚举类型 TYPE word IS ARRAY(1 TO 8)OF STD-LOGIC;-一维数组类型 TYPE mem IS ARRAY(0 TO 4,7 DOWNTO 0)OF STD-LOGIC;-二维数组类型 在VHDL中,数据的类型可以变换。表8-4中列出了在程序包中定义的一些数据类型转换函数。表表8-4 数据类型转换函数