组合电路设计_第1页
组合电路设计_第2页
组合电路设计_第3页
组合电路设计_第4页
组合电路设计_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

第六章面向仿真和综合的VHDL设计描述在可编程ASIC设计过程中仿真和综合是两个功效不同的过程仿真是验证,而综合是生成。如果由设计要求到设计实现的整个过程,是靠人工完成,通常简单地称之为设计。如果依靠EDA工具软件自动生成,则通常称之为综合。在VHDL设计中可以用行为、RTL和结构化三种描述方式对一个硬件系统进行不同风格的描述。在当前情况下,采用RTL、结构化描述的VHDL语言程序可以进行逻辑综合。而采用行为描述的VHDL程序,大部分只能用于系统仿真,少数的也可以进行逻辑综合。

§6.1面向仿真的VHDL设计描述所谓仿真(即模拟:Simulation)是从电路的描述(语言描述或图形描述)抽象出模型,然后将外部激励信号或数据施加于此模型,通过观察该模型在外部激励信号作用下的反应来判断该电路系统是否能实现预期的功能。仿真方法是目前最常用的验证方法,根据不同的电路级别,有不同的模拟工具。通常仿真是对电路设计的一种间接的检测方法,对电路设计的逻辑行为和运行功能进行模拟测试,可以获得许多对原设计进行排错、改进的信息。对于利用VHDL设计的大型系统,能进行可靠、快速、全面的仿真测试尤为重要。验证的目的有三个:电路设计都需要进行验证,验证的目的如下:验证原始描述的正确性;验证设计结果的逻辑功能符合原始规定的逻辑功能;验证设计结果中不含有违反设计规则的错误。对于纯硬件的电路系统如纯模拟或数字电路系统,其仿真较简单,设计者可以对它们作直接的硬件系统测试。但是,如果发现有问题,特别是当问题比较大或根本无法运行时,就只能全部推翻从头开始设计。对于具有微处理器的系统如单片机系统,可以在一定程度上进行仿真测试。如果希望得到可靠的仿真结果,通常必须利用单片机仿真器进行硬件仿真,以便了解软件程序对外围接口的操作情况。这类仿真耗时长,成本高,而且获得的仿真信息不全面。因为单片机主要是对软件程序的检测和排错,对于硬件系统中的设计问题和错误则难以检查,这种方法通常只适用于小系统的设计调试。

利用VHDL完成的系统设计的电路规模往往达到数万、数十万乃至上千万个等效逻辑门构成的规模。显然,必须利用先进的仿真工具才能快速、有效地完成所必需的测试工作基于EDA工具和FPGA的关于VHDL设计的仿真有多种形式如VHDL行为仿真、时序仿真以及硬件仿真等。VHDL行为仿真:这是进行系统级仿真的有效工具,它既可以在早期对系统的设计可行性进行评估和测试,也可以在短时间内以极低的代价对多种方案进行测试比较、系统模拟和方案论证,以获得最佳系统设计方案:时序仿真可获得与实际目标器件电气性能最为接近的设计模拟结果,但由于针对具体器件的逻辑分割和布局布线的适配过程耗时过大,不适合大系统进行仿真:硬件仿真在VHDL设计中也有其重要地位最后的设计必须用硬件电路实现硬件仿真的工具除必须依赖EDA软件外还依赖于良好的开发模型系统和规模比较大的SRAM型FPGA器件。一项较大规模的VHDL系统设计的最后完成必须经历多层次的仿真测试过程,其中将包括:1、针对系统的VHDL行为仿真2、分模块的时序仿真和硬件仿真3、直至最后系统级的硬件仿真。VHDL源程序可以直接用于仿真。这是VHDL的重要特性。完成VHDL仿真功能的软件工具称为VHDL—仿真器目前PC机上流行的VHDL仿真器有ModelTechnology公司的ModelSimAldec公司的Active—VHDL等,这些软件都可以在Windows上运行

VHDL仿真的一般过程如图6-1所示工程上VHDL仿真类型可分为功能仿真(或称:前仿真)和时序仿真(或称:后仿真)功能仿真:是在未经布线和适配之前,使用VHDL源程序综合后的文件进行仿真时序仿真则是将VHDL设计综合之后,再由FPGA/CPLD适配器(完成芯片内自动布线等功能),映射于具体芯片后得到的文件进行仿真。目前大规模IC器件供应商提供的大多数适配器都配有一个输出选项功能,可以生成VHDL网表文件,用户可用VHDL仿真器针对网表文件进行仿真。

VHDL网表文件实际上也是VHDL程序,不过程序中只使用门级元件进行低级结构描述。门级电路网络完全根据适配器布线的结果生成,因此,VHDL网表文件中包含了精确的仿真延时信息,因而仿真的结果将非常接近实际。当设计者描述或设计了一个电路时需要验证其正确性对大规模集成电路一般分阶段自上而下地进行每一个阶段都要进行正确性验证以保证设计中的错误早期发现、早期消除否则将造成不可弥补的损失。§6.2面向综合的VHDL设计描述综合:就是针对给定的电路应实现的功能和实现此电路的约束条件,如速度、功耗、成本及电路类型等,通过计算机的优化处理,获得一个满足上述要求的电路设计方案。这就是说被综合的文件是VHDL程序。综合的依据是逻辑设计的描述和上述各种约束条件。综合的结果则是一个硬件电路的实现方案该方案必须同时满足,预期的功能和约束条件的要求。对于综合来说满足要求的方案可能有多个综合器将产生一个最优的或接近最优的结果因此,综合的过程同时也是设计目标的优化过程最后获得的结果与综合器的工作性能有关§6.2.1逻辑综合在集成电路设计领域综合(Synthesis)是指把一个比较概念化的设计形式转化为比较具体、比较实在的设计形式,这通常称作自顶向下的过程。早期的综合全靠人的脑力劳动完成。这里所说的综合是指靠计算机完成的自动综合自动综合逻辑综合的作用:是根据一个系统逻辑功能与性能的要求,在一个包含众多结构、功能、性能均已知的逻辑元件的逻辑单元库的支持下,寻找出一个逻辑网络结构的最佳的实现方案。一般的逻辑综合过程如图6-2所示:设计实现即:利用给定的逻辑单元工艺库对已生成的逻辑网络进行元件配置进而估算性能与成本这里,性能主要指芯片的速度成本主要指芯片的面积与功耗从而允许使用者对速度与面积或速度与功耗互相矛盾的指标进行性能与成本的折衷

§6.2.2面向综合的VHDL设计描述的特点

在EDA过程中综合(Synthesis)是将软件描述(VHDL就其描述方式来说,仍属软件描述)与硬件结构相联系的关键步骤,是文字描述与硬件实现的一座桥梁。综合就是将电路的高级语言(如行为描述)转换成低级的、可与FPGA/CPLD或构成ASIC的门阵列基本结构相映射的网表文件或程序。EDA的实现在很大程度上依赖于性能良好的综合器。VHDL程序设计必须完全适应VHDL综合器的要求,使软件设计牢固植根于可行的硬件实现中;另一方面,并非所有可综合的VHDL程序都能在硬件中实现。这涉及到两方面的问题1、首先要看此程序将对哪一系列的目标器件进行综合。例如,含有内部三态门描述的VHDL程序,原则上是可综合的,但对于特定的目标器件系列却不一定支持,即无法在硬件中实现;2、其次是资源问题这是实用VHDL面临的最尖锐的问题例如在VHDL程序中,直接使用乘法运算符。尽管综合器和绝大多数目标器件都是支持的,但即使是一个16位乘16位的组合逻辑乘法器,在普通规模的PLD器件(1万门左右)中也是难以实现的。因此,实用的VHDL程序设计中必须注意硬件资源的占用问题。对于综合来说满足要求的方案可能有多个综合器将产生一个最优的或接近最优的结果。因此综合的过程同时也是设计目标的优化过程最后获得的结果与综合器的工作性能有关VHDL综合器将根据设定的系列目标器件的特点对综合的VHDL程序进行面向目标器件优化从而生成利于映射到具体目标芯片的元件模块目前的综合工具都可以设置一些优化选项,以满足不同的需要。由于VHDL是高级设计语言它的电路描述与具体器件和综合器都无关,不同公司的综合器也不完全兼容,而且,针对不同的目标器件系列,综合后的结果有所不同。因而,同一个VHDL程序,经由不同的综合器综合后生成的电路,其逻辑功能虽然在总体上是相同的,但电路结构却不尽相同。目前流行的EDA综合工具Synopsys公司的DesignCompiler、FPGAExpress、FPGACompilerII;Synplicity公司的Synplicity;Candence公司的Synergy;MentorGraphics公司的AutologicII等此外,DATAI/O公司的Synario、Viewlogic公司的WorkviewOfficeAltera公司的MAX+plusII等综合工具都集成了VHDL综合器在工程中,支持FPGA/CPLD的VHDL设计工具,综合后最终生成EDIF网表文件。EDIF(电子数据交换格式的简称)是一种网表文件格式标准由一些EDA厂商及PLD厂商制订是为了解决当前各种EDA工具生成的电路网表文件不兼容的问题而设的目前最常用的版本是EDIF200从VHDL设计描述到具体实现成为集成电路芯片,受到许多因素的影响首先是该描述能否被综合;其次是包括有硬件、软件及物理特性的系统级模型能否被综合;再次是综合的质量问题,这和VHDL的书写风格、编码约定、优化选择、工艺技术选择等有关。两种设计描述的比较面向综合的VHDL设计描述和面向仿真的VHDL设计描述相比,前者受到更多的约束。例如,对于一个向计算机写入数据的选通脉冲,在面向仿真的VHDL描述中就不必考虑该脉冲有没有“毛刺”的问题,而面向综合的VHDL描述就必须要保证该选通脉冲,必须适应某特定的存储器的具体要求。面向仿真的VHDL描述中一般都使用关键字AFTER或TRANSPORT对延时加以规定而综合器对此不予理解因为作为综合的结果实际电路的延时不仅取决于VHDL描述还取决于所采用的工艺技术。在仿真模型中可能出现无限循环或无范围限制的整数但不可能存在与之对应的硬件故各综合器对此问题的处理方法也不尽相同面向仿真的VHDL描述可能用到枚举类型用来表示一组方式的编码例如表示符号形式的有限状态机的状态或者表示信号线所处的电信号状态(高阻级、低阻级、深度级)在这种情况下VHDL综合器无法知道这些枚举类型值的真正含义为此综合器必须有一些约定(默认编码方式)为了编写一个能被综合器所接受的VHDL描述通常可使用下面的描述方式:如用并行赋值语句的简单门IF控制流语句CASE控制流语句顺序语句等等。一般来说VHDL语句描述的运算的综合结果一般对应于组合逻辑;条件控制语句(IF、CASE)的综合结果是类似于多路开关的功能块;对时序逻辑的VHDL描述常用IF-THEN语句和WAIT语句§6.3组合逻辑电路设计从VHDL设计描述到具体实现成为集成电路,受到许多因素的影响首先是该描述能否被综合,例如测试基准(testbench)就是来供仿真之用,不能被综合;其次是包含有硬件、软件的物理特性的系统级模型也不能被综合;再次,是综合的质量问题。这是和VHDL书写风格、编码约定、优化选择、工艺技术选择等因素有关按照数字系统的组成从组合逻辑设计开始通过不同的设计例子分别介绍VHDL设计方法、包括编写VHDL程序的要求和格式、各个指令之间的一些特点和差别。所有的例子是以综合为目的来列举的。VHDL语句描述的运算的综合结果一般对应于组合逻辑,而VHDL中的运算符和常见的程序设计语句中的运算符没有多少区别。但不同的硬件实现所对应的成本(硬件资源花费)和运行速度有着很大的差异因此,我们主要研究如何用并发语句和顺序语句,并结合一些简单的例子来描述组合逻辑电路。§6.3.1用并行语句中的布尔方程来描述组合逻辑例6-1:利用一个布尔算符设计二选一多路转换器()LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYMUX2to1ISPORT(S:INSTD_LOGIC;Zero:INSTD_LOGIC_VECTOR(7DOWNTO0);One:INSTD_LOGIC_VECTOR(7DOWNTO0);Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDMUX2to1;例6-1ARCHITECTUREbehaviorOFMUX2to1ISsignaltemp:STD_LOGIC_VECTOR(7DOWNTO0);BEGINtemp<=(s,s,s,s,others=>s);Y<=(tempandOne)or(nottempandZero);ENDbehavior;即:当temp=(0,…,0)时,Y=Zero

当temp=(1,…,1)时,Y=One例6-1中布尔算符用来在一个赋值语句中产生mux运算因为类型不匹配,信号s不能用在具有信号One或Zero的布尔运算中信号s是std_logic类型,信号One/Zero是std_logic_vector类型。一个类型为std_logic_vector的内部信号temp被采用,注意对内部信号没有模式说明Temp信号用在与One/Zero信号的布尔运算中temp的每个位设置成等于s信号值。数组赋值将被利用,它可以取以下几种形式:1、temp<=(others=>s),关键字others给予缺省值;2、Temp<=(s,s,s,s,s,s,s,s),位置赋值7DOWNTO0;3、Temp<=(4=>s,7=>s,2=>s,5=>s,3=>s,1=>s,6=>s,0=>s,),名称赋值或位置赋值与名称赋值结合例6-2用VHDL描述的半加器。半加器的真值表和电路符号如图6-3所示图6-3半加器的真值表和电路符号

例6-2LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYhalf_adderIS PORT(a,b:INSTD_LOGIC;

c0,s:OUTSTD_LOGIC);ENDhalf_adder;例6-2ARCHITECTUREhalfOFhalf_adderISSIGNALc,d:STD_LOGIC;

BEGINc<=aORb;

d<=aNANDb;

c0<=NOTd;

s<=cANDd;ENDhalf;例6-3:描述全加器的程序基于上例中半加器的描述用两个半加器就可以构成一个全加器全加器的电路图如图6-4所示:图6-4全加器的电路图例6-3LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfull_adderIS PORT(a,b,cin:

INSTD_LOGIC;

s,c0:INSTD_LOGIC);ENDfull_adder;ARCHITECTUREfullOFfull_adderISCOMPONENThalf_adderPORT(a,b:INSTD_LOGIC;

s,c0:INSTD_LOGIC);

ENDCOMPONENT;例6-3SIGNALu0_c0,u0_s,u1_s0:STD_LOGIC;BEGINu0:half_adderPORTMAP(a,b,u0_s,u0_c0);u1:half_adderPORTMAP(u0_s,cin,s,u1_c0);c0<=u0_c0ORu1_c0;ENDfull;§6.3.2用顺序语句描述组合逻辑下面讨论如何用进程和顺序语句来描述组合逻辑。但不要将顺序语句与时序语句相混淆。例6-5:利用WHEN,ELSE语句设计二选一多路转换器例6-5二选一多路转换器LIBRARYIEEE;USEIEEE.std_logic_1164.all;

ENTITYMUX2to1ISPORT(S:INSTD_LOGIC;Zero:INSTD_LOGIC_VECTOR(7DOWNTO0);One:INSTD_LOGIC_VECTOR(7DOWNTO0);Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDMUX2to1;

ARCHITECTUREbehaviorOFMUX2to1ISBEGINY<=OneWHEN(S='1')ELSEZero;ENDbehavior;例6-6:译码器已知一个16位地址描述的存储器区映象如图6-6所示设计一个译码器来选顶相应的地址空间图6-6译码器例6-6LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecodeIS PORT(address:INSTD_LOGIC_VECTOR(15DOWNTO0);

valid,boot_up:INSTD_LOGIC;

sram,prom,eeprom,shadow,periph1,

perph2:OUTSTD_LOGIC);ENDdecode;例6-6ARCHITECTUREmem_decodeOFdecodeISBEGINmapper:

PROCESS(address,valid,boot_up)

BEGIN shadow<=’0’;

prom<=’0’;

periph1<=’0’;

periph2<=’0’;

sram<=’0’;

eeprom<=’0’;例6-6

IFvalid=’1’THEN IFaddress>=”0000”ANDaddress<x”4000”THEN IFboot_up=’1’THEN shadow<=’1’;

ELSE prom<=’1’;

ENDIF;

ELSIFaddress>=”4000”ANDaddress<x”4008”THENperiph1<=’1’;例6-6ELSIFaddress>=”4008”ANDaddress<”4010”THENperiph2<=’1’;ELSIFaddress>=”8000”ANDaddress<=”c000”THENsram<=’1’;ELSIFaddress>=”c000”THENeeprom<=’1’;ENDIF;ENDPROCESS;ENDmem_decode;§6.3.4其它组合逻辑设计举例

例6-8:IF语句和CASE语句应用举例1、IF语句

IFsel=“00”THENp_encoder_out<=IN0;ELSIFsel=“01”THENp_encoder_out<=IN1;ELSIFsel=“10”THENp_encoder_out<=IN2;ELSEp_encoder_out<=IN3;ENDIF;2、CASE语句

CASESELIS WHEN“00”=>mux_out<=IN0; WHEN“01”=>mux_out<=IN1; WHEN“10”=>mux_out<=IN2; WHENothers=>mux_out<=IN3;ENDCASE;图

6-8(a)利用IF语句

(b)利用CASE语句

图6-7(a)和(b)分别给出利用IF和CASE语句的例8(a)和例8(b)的实现结构通常,“IF_THEN_ELSE”语句实现的速度较慢,除非要求建立优先权的编码器才利用它,并应分配最高的特权到后到达的关键信号,嵌套的“IF_THEN_ELSE”语句可能增加面积和延时。如果可能应该尽量用“CASE语句”来描述相同的功能“CASE”语句的所有分支必须定义CASE语句的优点是紧凑且延时优化,可以在单个CLB中实现。但是CASE语句使用时必须注意,有限的状态都要被定义。std_logic并非只有‘0’,‘1’;当出现“不考虑‘-’”时也可以采用。而逻辑化简是选择‘0’或‘1’,和std_logic的‘-’求素覆盖来实现的。 对于“CASE”语句说明“不考虑‘-’”的条件是十分重要的,这个说明可能在综合时消除好几层逻辑。三态门及总线缓冲器是接口电路和总线驱动电路经常用到的器件。(它们不属于组合电路)三态门电路图及真值表如图6-9所示:图6-9三态门电路图及真值表例6-9:三态门电路

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYrei_gateIS PORT(din,en:INSTD_LOGIC;

dout:OUTSTD_LOGIC);ENDtri_gate;ARCHITECTUREtri_gateOFtri_gateISBEGINtri_gate1:PROCESS(din,en)

BEGIN IF(en=’1’)THENdout<=din;

ELSEdout<=’z’;

ENDIF;

ENDPROCESS;

ENDtri_gate;例:双向总线缓冲器双向总线缓冲器用于对数据总线的驱动和缓冲,如下图所示。双向缓冲器有两个数据输入输出端a和b,一个方向控制端dr和一个选通端en。当en=1时缓冲器未被选通,a和b都呈现高阻;en=0时,缓冲器被选通,如果dr=0,那么a=b;如果dr=1,那么b=a。双向总线缓冲器

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_bigateISPORT(a,b:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);en,dr:INSTD_LOGIC);ENDtri_bigate;ARCHITECTURErtlOFtri_bigateISSIGNALaout:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALbout:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN

PROCESS(a,dr,en)BEGINIF((en=‘0’)AND(dr=‘1’))THENbout<=a;ELSEbout<=“ZZZZZZZZ”;ENDIF;b<=bout;ENDPROCESS

PROCESS(b,dr,en)BEGINIF((en=‘0’)AND(dr=‘0’))THEN

aout<=b;ELSE

aout<=“ZZZZZZZZ”;ENDIF;a<=aout;ENDPROCESS;ENDrtl;

由上面的程序可以看出,双向缓冲器是由两组三态门构成的,利用信号aout和bout将两组三态门连接起来。例6-13:八级优先权编码器(利用ELSIF结构)LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYpriorityISPORT(input:INSTD_LOGIC_vector(7downto0);

vec:OUTSTD_LOGIC_VECTOR(2downto0));ENDpriority;例6-13

ARCHITECTUREpriority_archOFpriorityISBEGINPROCESS(input)BEGINIF(input(7)='1')THENvec<="111";ELSIF(input(6)='1')THENvec<="110";ELSIF(input(5)='1')THENvec<="101";ELSIF(input(4)='1')THENvec<="100";ELSIF(input(3)='1')THENvec<="011";ELSIF(input(2)='1')THENvec<="010";ELSIF(input(1)='1')THENvec

温馨提示

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

评论

0/150

提交评论