下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 FPGA设计经验分析

FPGA设计经验分析.doc

FPGA设计经验分析

seclu
2018-09-07 0人阅读 举报 0 0 暂无简介

简介:本文档为《FPGA设计经验分析doc》,可适用于工程科技领域

FPGACPLD数字电路设计经验技术交流讲义FPGACPLD数字电路设计经验分享摘要:在数字电路的设计中时序设计是一个系统性能的主要标志在高层次设计方法中对时序控制的抽象度也相应提高因此在设计中较难把握但在理解RTL电路时序模型的基础上采用合理的设计方法在设计复杂数字系统是行之有效的通过许多设计实例证明采用这种方式可以使电路的后仿真通过率大大提高并且系统的工作频率可以达到一个较高水平。关键词:FPGA数字电路时序时延路径建立时间保持时间数字电路设计中的几个基本概念:建立时间和保持时间:建立时间(setuptime)是指在触发器的时钟信号上升沿到来以前数据稳定不变的时间如果建立时间不够数据将不能在这个时钟上升沿被打入触发器保持时间(holdtime)是指在触发器的时钟信号上升沿到来以后数据稳定不变的时间如果保持时间不够数据同样不能被打入触发器。 如图。数据稳定传输必须满足建立和保持时间的要求当然在一些情况下建立时间和保持时间的值可以为零。PLDFPGA开发软件可以自动计算两个相关输入的建立和保持时间(如图)图建立时间和保持时间关系图注:·在考虑建立保持时间时应该考虑时钟树向后偏斜的情况在考虑建立时间时应该考虑时钟树向前偏斜的情况。在进行后仿真时最大延迟用来检查建立时间最小延时用来检查保持时间。·建立时间的约束和时钟周期有关当系统在高频时钟下无法工作时降低时钟频率就可以使系统完成工作。保持时间是一个和时钟周期无关的参数如果设计不合理使得布局布线工具无法布出高质量的时钟树那么无论如何调整时钟频率也无法达到要求只有对所设计系统作较大改动才有可能正常工作导致设计效率大大降低。因此合理的设计系统的时序是提高设计质量的关键。在可编程器件中时钟树的偏斜几乎可以不考虑因此保持时间通常都是满足的。FPGA中的竞争和冒险现象信号在FPGA器件内部通过连线和逻辑单元时都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素多路信号的电平值发生变化时在信号变化的瞬间组合逻辑的输出有先后顺序并不是同时变化,往往会出现一些不正确的尖峰信号这些尖峰信号称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现就说明该电路存在"冒险"。(与分立元件不同由于PLD内部不存在寄生电容电感这些毛刺将被完整的保留并向下一级传递因此毛刺现象在PLD、FPGA设计中尤为突出)图是一个逻辑冒险的例子从图的仿真波形可以看出"A、B、C、D"四个输入信号经过布线延时以后高低电平变换不是同时发生的这导致输出信号"OUT"出现了毛刺。(我们无法保证所有连线的长度一致所以即使四个输入信号在输入端同时变化但经过PLD内部的走线到达或门的时间也是不一样的毛刺必然产生)。可以概括的讲只要输入信号同时变化(经过内部走线)组合逻辑必将产生毛刺。将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的这可能会导致严重的后果。所以我们必须检查设计中所有时钟、清零和置位等对毛刺敏感的输入端口确保输入不会含有任何毛刺图存在逻辑冒险的电路示例 图图所示电路的仿真波形冒险往往会影响到逻辑电路的稳定性。时钟端口、清零和置位端口对毛刺信号十分敏感任何一点毛刺都可能会使系统出错因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题。如何处理毛刺我们可以通过改变设计破坏毛刺产生的条件来减少毛刺的发生。例如在数字电路设计中常常采用格雷码计数器取代普通的二进制计数器这是因为格雷码计数器的输出每次只有一位跳变消除了竞争冒险的发生条件避免了毛刺的产生。毛刺并不是对所有的输入都有危害例如D触发器的D输入端只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间就不会对系统造成危害我们可以说D触发器的D输入端对毛刺不敏感。根据这个特性我们应当在系统中尽可能采用同步电路这是因为同步电路信号的变化都发生在时钟沿只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间就不会对系统造成危害。(由于毛刺很短多为几纳秒基本上都不可能满足数据的建立和保持时间) 去除毛刺的一种常见的方法是利用D触发器的D输入端对毛刺信号不敏感的特点在输出信号的保持时间内用触发器读取组合逻辑的输出信号这种方法类似于将异步电路转化为同步电路。图给出了这种方法的示范电路图是仿真波形。图消除毛刺信号方法之二图图所示电路的仿真波形如前所述优秀的设计方案如采用格雷码计数器同步电路等可以大大减少毛刺但它并不能完全消除毛刺。毛刺并不是对所有输入都有危害例如D触发器的D输入端只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间就不会对系统造成危害。因此我们可以说D触发器的D输入端对毛刺不敏感。但对于D触发器的时钟端置位端清零端则都是对毛刺敏感的输入端任何一点毛刺就会使系统出错但只要认真处理我们可以把危害降到最低直至消除。下面我们就对几种具体的信号进行探讨。清除和置位信号在FPGA的设计中全局的清零和置位信号必须经过全局的清零和置位管脚输入因为他们也属于全局的资源其扇出能力大而且在FPGA内部是直接连接到所有的触发器的置位和清零端的这样的做法会使芯片的工作可靠、性能稳定而使用普通的IO脚则不能保证该性能。在FPGA的设计中除了从外部管脚引入的全局清除和置位信号外在FPGA内部逻辑的处理中也经常需要产生一些内部的清除或置位信号。清除和置位信号要求象对待时钟那样小心地考虑它们因为这些信号对毛刺也是非常敏感的。在同步电路设计中有时候可以用同步置位的办法来替代异步清。在用硬件描述语言的设计中可以用如下的方式来描述:异步清的描述方法:process(rst,clk)beginifrst=’’thencount<=(others=>’’)elsifclk’eventandclk=’’thencount<=countendifendprocess同步清的描述方法:processbeginwaituntilclk’eventandclk=’’ifrst=’’thencount<=(others=>’’)elsecount<=countendifendprocess图异步清、置位逻辑图图同步清、置位关系图触发器和所存器:我们知道触发器是在时钟的沿进行数据的锁存的而所存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新而所存器只能在使能电平有效器件才会被更新。在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是所存器。那么在使用硬件描述语言进行电路设计的时候如何区分触发器和所存器的描述方法哪?其实有不少人在使用的过程中可能并没有特意区分过所以也忽略了二者在描述方法上的区别。下面是用VHDL语言描述的触发器和所存器以及综合器产生的电路逻辑图。触发器的语言描述:processbeginwaituntilclk’eventandclk=’’q<=dendprocess图触发器所存器的语言描述:process(en,d)beginifen=’’thenq<=dendifendprocess图所存器由上述对Latch的描述可见其很容易于选择器的描述相混淆用VHDL语言对选择器的描述方法如下:process(en,a,b)beginifen=’’thenq<=aelseq<=bendifendprocessFPGACPLD中的一些设计方法FPGA设计中的同步设计异步设计不是总能满足(它们所馈送的触发器的)建立和保持时间的要求。因此异步输入常常会把错误的数据锁存到触发器或者使触发器进入亚稳定的状态,在该状态下触发器的输出不能识别为l或。如果没有正确地处理亚稳性会导致严重的系统可靠性问题。另外在FPGA的内部资源里最重要的一部分就是其时钟资源(全局时钟网络)它一般是经过FPGA的特定全局时钟管脚进入FPGA内部后经过全局时钟BUF适配到全局时钟网络的这样的时钟网络可以保证相同的时钟沿到达芯片内部每一个触发器的延迟时间差异是可以忽略不计的。在FPGA中上述的全局时钟网络被称为时钟树无论是专业的第三方工具还是器件厂商提供的布局布线器在延时参数提取、分析的时候都是依据全局时钟网络作为计算的基准的。如果一个设计没有使用时钟树提供的时钟那么这些设计工具有的会拒绝做延时分析有的延时数据将是不可靠的。在我们日常的设计中很多情形下会用到需要分频的情形好多人的做法是先用高频时钟计数然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计。其实这样的方法是不规范的。比如下面的描述方法:processbeginwaituntilclk’eventandclk=’’iffck=’’thencount<=(others=>’’)elsecount<=countendifendprocessprocessbeginwaituntilcount()’eventandcount()=’’shiftreg<=dataendprocess在上述的第一个process电路描述中首先计数器的输出结果(count())相对于全局时钟clk已经产生了一定的延时(延时的大小取决于计数器的位数和所选择使用的器件工艺)而在第二个process中使用计数器的bit作为时钟那么shiftreg相对于全局clk的延时将变得不好控制。布局布线器最终给出的时间分析也是不可靠的。这样产生的结果波形仿真如下图所示:正确的做法可以将第二个process这样来写。processbeginwaituntilclk’eventandclk=’’ifcount(downto)=””thenshiftreg<=dataendifendprocess或者分成两步来写:process(count)beginifcount(downto)=””thenen<=’’elseen<=’’endifendprocessprocessbeginwaituntilclk’eventandclk=’’ifen=’’thenshiftreg<=dataendifendprocess这样做是相当于产生了一个分频的使能信号在使能信号有效的时候将data数据采样到shiftreg寄存器中。但此种情形下shiftreg的延时是相对于全局时钟clk的。下面的图形更能看得清楚。图上图中波形的局部放大FPGA设计中的延时电路的产生:在日常的电路设计中有时候我们需要对信号进行延时处理来适应对外接口的时序关系最经常也是最典型的情况是做处理机的接口因为与处理的接口时序关系是异步的而一个规范的FPGA设计应该是尽可能采用同步设计。那么遇到这种情况该如何处理呢?首先在FPGA中要产生延时信号必须经过一定的物理资源。在硬件描述语言中有关键词Waitforxxns需要说明的是该语法是仅仅用于仿真而不能用于综合的可综合的延时方法有:·使信号经过逻辑门得到延时(如非门)·使用器件提供的延时单元(如Altera公司的LCELLXilinx公司的)注意:当使用多级非门的时候综合器往往会将其优化掉因为综合器会认为一个信号非两次还是它自己。需要说明的是在FPGACPLD内部结构是一种标准的宏单元下图是Xilinx公司的SpartansII系列器件的一个标准宏单元。虽然不同的厂家的芯片宏单元的结构不同但概括而言都是由一些组合逻辑外加一或二个触发器而构成。在实际应用中当一个模块内的组合逻辑被使用了那么与其对应的触发器也就不能用了同样如果触发器单元被用了那么组合逻辑单元也就废了。这就是有时候(特别是使用CPLD)虽然设计使用的资源并不多但布局布线器却报告资源不够使用的原因。现面的一个例子是前一段时间我在公司遇到的一个设计。设计使用Altera公司的EPM型号的CPLD。该设计实际使用的寄存器资源只有个占整个器件资源的。可是该设计使用了如下图所示的延时方法来做处理器接口的时序:在该电路的设计中使用了大量的LCELL来产生多纳秒的延时这样做的后果是虽然整个电路的触发器资源只使用了可是用MaxplusII进行布局布线已经不能够通过了。而且我怀疑经过这么多逻辑的延时后所产生的信号还能保持原来的性能不。当需要对某一信号作一段延时时初学者往往在此信号后串接一些非门或其它门电路此方法在分离电路中是可行的。但在FPGA中开发软件在综合设计时会将这些门当作冗余逻辑去掉达不到延时的效果。用ALTERA公司的MaxplusII开发FPGA时可以通过插入一些LCELL原语来产生一定的延时但这样形成的延时在FPGA芯片中并不稳定会随温度等外部环境的改变而改变因此并不提倡这样做。在此可以用高频时钟来驱动一移位寄存器待延时信号作数据输入按所需延时正确设置移位寄存器的级数移位寄存器的输出即为延时后的信号。此方法产生的延时信号与原信号比有误差误差大小由高频时钟的周期来决定。对于数据信号的延时在输出端用数据时钟对延时后信号重新采样就可以消除误差。对于这样大的延时我建议的实现方法是采用时钟锁存来产生延时的方法我们知道当一个信号用时钟锁存一次将会占用一个触发器资源信号会向后推移一个时钟周期该同事的设计里CPLD芯片正好连接有MHz的时钟那么每用时钟锁存一次ssp信号就会推移ns这样只需多使用个触发器资源就可以达到目的了。电路图和仿真波形如下图所示:当然这样做对原来信号高低电平的宽度会稍有改变但只要是在与其接口的芯片的容许范围之内就不会影响到功能的实现。图用于延时的电路图上图仿真波形如何提高系统的运行速度同步电路的速度是指同步时钟的速度。同步时钟愈快电路处理数据的时间间隔越短电路在单位时间处理的数据量就愈大我们先来看一看同步电路中数据传递的一个基本模型如下图:(Tco是触发器时钟到数据输出的延时Tdelay是组合逻辑的延时Tsetup是触发器的建立时间)假设数据已经被时钟的上升沿打入D触发器那么数据到达第一个触发器的Q端需要Tco再经过组合逻辑的延时Tdelay到达的第二个触发器的D端要想时钟能在第二个触发器再次被稳定的锁入触发器则时钟的延迟不能晚于TcoTdelayTsetup(我们可以回顾一下前面讲过的建立和保持时间的概念就可以理解为什么公式最后要加上一个Tdelay)由以上分析可知:最小时钟周期:T=TcoTdelayTsetup 最快时钟频率F=T  PLD开发软件也正是通过这个公式来计算系统运行速度Fmax注:在这个逻辑图中有个参数:Tpd,即时钟的延时参数我们在刚才做时间分析的时候没有提这个参数(如果使用PLD的全局时钟型号Tpd可以为如果是普通时钟则不为)。所以如果考虑到时钟的延时精确的公式应该是T=TcoTdelayTsetupTpd。当然以上全部分析的都是器件内部的运行速度如果考虑芯片IO管脚延时对系统速度的影响那么还需要加一些修正。由于Tco、Tsetup是由具体的器件和工艺决定的我们设计电路时只可以改变Tdelay。所以缩短触发器间组合逻辑的延时是提高同步电路速度的关键。由于一般同步电路都不止一级锁存(如图)而要使电路稳定工作时钟周期必须满足最大延时要求缩短最长延时路径才可提高电路的工作频率。如图所示:我们可以将较大的组合逻辑分解为较小的几块中间插入触发器这样可以提高电路的工作频率。这也是所谓“流水线”(pipelining)技术的基本原理。对于图的上半部分它时钟频率受制于第二个较大的组合逻辑的延时通过适当的方法平均分配组合逻辑可以避免在两个触发器之间出现过大的延时消除速度瓶颈。FPGACPLD开发软件中也有一些参数设置通过修改这些设置可以提高编译布局布线后系统速度但是根据经验这种速度的提高是很有限的假如按照要求我们需要设计一个可以工作到MHz的系统实际布局布线器报告出来的Fmax只有MHz此时如果我们使用布局布线器的设置选项最多可以提高到MHz这还是运气比较好的情况。而且你必须了解这些选项的含义、使用背景等。其实在一个设计里影响速度的瓶颈经常只会有几条我们将延时最大的路径称作关键路径。当设计的运行速度不符合系统设计要求的时候我们可以首先找到不能满足要求的关键路径按照上述的方法将关键路径上的组合逻辑拆分成多个中间用触发器隔开这样很容易就可以从根本上提升系统的运行速度了。有的设计在设计开始就知道那部分电路会产生比较大的组合逻辑导致速度瓶颈的产生那么就应该在开始就想好解决办法。比如现在设计需要产生一个位的加法器并且要求能够工作在MHz。根据经验直接用位加法器肯定是达不到MHz的要求的这时我们可以将其分成个位计数器来操作后面的计数器只要将前面计数器结果的高位(进位位)相加就可以了。下面是原来在宽带接入服务器设计中的流量统计单元中的位加法器的描述:flowcountelementtemporarycomputingbitsadderprocess(Counten,countbuffer,Len,Carry,Carry)begincaseCountenisstStepaddition(downto)(downto)when""=>adda<=(''countbuffer()(downto))addb<=(''Len(downto))ndStepaddition(downto)Carrywhen""=>adda<=(''countbuffer()(downto))addb<=(""Carry)rdStepaddition(downto)Carrywhen""=>adda<=(""countbuffer()(downto))addb<=(""Carry)whenothers=>adda<=(others=>’X’)addb<=(others=>’X’)endcaseendprocessbitsadderaddresult<=addaaddbBytesCountprocess(RST,CLKMHz,IO,OEbar,datasel,Counten)beginif(RST='')thensystemResetcountbuffer()<=(others=>'')Carry<=''Carry<=''Carry<=''elsif(CLKMHz'eventandCLKMHz='')thenif(OEbar=''anddatasel='')thencountbuffer()<=IOCarry<=''elsecaseCountenisstStepaddition(downto)(downto)when""=>countbuffer()(downto)<=addresult(downto)Carry<=addresult()firststepcarryndStepaddition(downto)Carrywhen""=>countbuffer()(downto)<=addresult(downto)Carry<=addresult()SecondstepcarryrdStepaddition(downto)Carrywhen""=>countbuffer()(downto)<=addresult(downto)Carry<=addresult()Thirdstepcarrywhenothers=>Carry<=''endcaseendifendifendprocess信号输出 当你需要将FPGACPLD内部的信号通过管脚输出给外部相关器件的时候如果不影响功能最好是将这些信号通过用时钟锁存后输出。因为通常情况下一个板子是工作于一种或两种时钟模式下与FPGACPLD相连接的芯片的工作时钟大多数情形下与FPGA的时钟同源如果输出的信号经过时钟锁存可以起到如下的作用:·容易满足芯片间信号连接的时序要求·容易满足信号的建立保持时间如上图所示比如FPGACPLD在CLK的时钟沿锁存一个信号得到SIG所示的波形SIG信号需要给另外的一个与其接口的芯片那么该芯片将一定会在CLK的时钟沿正确采样到SIG信号。但是如果该信号在FPGACPLD中输出的时候不是用时钟沿锁存的那将有可能出现SIGSIG所示的时序关系则与其接口的芯片在时钟沿处采样该信号的时候有可能出现建立保持时间不满足要求而出现采样不可靠、沿打沿等情况。另外通过组合逻辑输出还有可能出现毛刺的情况。所有这些不规范的设计都会引起系统工作时的不可靠、不稳定的情形。寄存异步输入信号我们在日常的设计工作中FPGACPLD总是要与别的芯片相连接的FPGACPLD会给别的芯片输出信号同时也要处理别的芯片送来的信号这些信号往往对FPGACPLD内部的时钟系统而言是异步的为了可靠的采样到这些输入信号建议将这些输入信号使用相应的时钟锁存后在处理这样做:·将原来的异步信号转化成同步来处理·去除输入信号中的毛刺(特别是对于数据总线)图FPGACPLD中信号的输入、输出锁存FPGACPLD中的时钟设计无沦是用离散逻辑、可编程逻辑还是用全定制硅器件实现的任何数字设计为了成功地操作可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下将导致错误的行为并且调试困难、花销很大。在设计FPGACPLD时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。无论采用何种方式电路中真实的时钟树也无法达到假定的理想时钟因此我们必须依据理想时钟建立一个实际工作时钟模型来分析电路这样才可以使得电路的实际工作效果和预期的一样。在实际的时钟模型中我们要考虑时钟树传播中的偏斜、跳变和绝对垂直的偏差以及其它一些不确定因素。对于寄存器而言当时钟工作沿到来时它的数据端应该已经稳定这样才能保证时钟工作沿采样到数据的正确性这段数据的预备时间我们称之为建立时间(setuptime)。数据同样应该在时钟工作沿过去后保持一段时间这段时间称为保持时间(holdtime)。因此具体的时钟如图所示。其中网络延迟是指时钟的传播延时以及因为跳变不垂直等效的偏差在此基础上考虑一些不确定因素实际的工作时钟沿如图中所示。保持时间(hold)和建立时间(setup)都是相对于实际时钟跳变而言的。因此在确定电路时序时必须要考虑到这些因素使得建立时间和保持时间符合要求。为了使电路正常工作建立时间和保持时间应该分别满足:其中tclockQmax是时钟沿变化到数据输出端变化的最慢变化情况tlogicmax是寄存器间组合逻辑的最大可能延迟tclockQmin和tlogicmin表示最快情况。在考虑建立保持时间时应该考虑时钟树向后偏斜的情况在考虑建立时间时应该考虑时钟树向前偏斜的情况。在进行后仿真时最大延迟用来检查建立时间最小延时用来检查保持时间。全局时钟对于一个设计项目来说全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLDFPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLDFPGA都具有专门的全局时钟引脚它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。图示出全局时钟的实例。图定时波形示出触发器的数据输入D应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求则必须用时钟同步输入信号(参看下一章“异步输入”)。图全局时钟(最好的方法是用全局时钟引脚去钟控PLD内的每一个寄存器于是数据只要遵守相对时钟的建立时间tsu和保持时间th)门控时钟在许多应用中整个设计项目都采用外部的全局时钟是不可能或不实际的。PLD具有乘积项逻辑阵列时钟(即时钟是由逻辑产生的)允许任意函数单独地钟控各个触发器。然而当你用阵列时钟时应仔细地分析时钟函数以避免毛刺。  通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关用地址线去控制写脉冲。然而每当用组合函数钟控触发器时通常都存在着门控时钟。如果符合下述条件门控时钟可以象全局时钟一样可靠地工作:·驱动时钟的逻辑必须只包含一个“与”门或一个“或”门。如果采用任何附加逻在某些工作状态下会出现竞争产生的毛刺。·逻辑门的一个输入作为实际的时钟而该逻辑门的所有其它输入必须当成地址或控制线它们遵守相对于时钟的建立和保持时间的约束。图和图是可靠的门控时钟的实例。在图中用一个“与”门产生门控时钟在图中用一个“或”门产生门控时钟。在这两个实例中引脚nWR和nWE考虑为时钟引脚引脚ADDo..是地址引脚两个触发器的数据是信号Dn经随机逻辑产生的。图“与”门门控时钟  图“或”门门控时钟图和图的波形图显示出有关的建立时间和保持时间的要求。这两个设计项目的地址线必须在时钟保持有效的整个期间内保持稳定(nWR和nWE是低电平有效)。如果地址线在规定的时间内未保持稳定则在时钟上会出现毛刺造成触发器发生错误的状态变化。另一方面数据引脚D..n只要求在nWR和nWE的有效边沿处满足标准的建立和保持时间的规定。我们往往可以将门控时钟转换成全局时钟以改善设计项目的可靠性。图示出如何用全局时钟重新设计图的电路。地址线在控制D触发器的使能输入许多PLD设计软件如MAXPLUSII软件都提供这种带使能端的D触发器。当ENA为高电平时D输入端的值被钟控到触发器中:当ENA为低电平时维持现在的状态。图“与”门门控时钟转化成全局时钟图中重新设计的电路的定时波形表明地址线不需要在nWR有效的整个期间内保持稳定而只要求它们和数据引脚一样符合同样的建立和保持时间这样对地址线的要求就少很多。图给出一个不可靠的门控时钟的例子。位同步加法计数器的RCO输出用来钟控触发器。然而计数器给出的多个输入起到时钟的作用这违反了可靠门控时钟所需的条件之一。在产生RCO信号的触发器中没有一个能考虑为实际的时钟线这是因为所有触发器在几乎相同的时刻发生翻转。而我们并不能保证在PLDFPGA内部QA,QB,QC到D触发器的布线长短一致因此如图的时间波形所示在器从计到时RCO线上会出现毛刺(假设QC到D触发器的路径较短即QC的输出先翻转)。图不可靠的门控时钟(定时波形示出在计数器从到改变时RCO信号如何出现毛刺的)图给出一种可靠的全局钟控的电路它是图不可靠计数器电路的改进RCO控制D触发器的使能输入。这个改进不需要增加PLD的逻辑单元。图不可靠的门控时钟转换为全局时钟多级逻辑时钟当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象但实际上仍然可能存在着危险。通常我们不应该用多级组合逻辑去钟控PLD设计中的触发器。图给出一个含有险象的多级时钟的例子。时钟是由SEL引脚控制的多路选择器输出的。多路选择器的输入是时钟(CLK)和该时钟的分频(DIV)。由图的定时波形图看出在两个时钟均为逻辑的情况下当SEL线的状态改变时存在静态险象。险象的程度取决于工作的条件。多级逻辑的险象是可以去除的。例如你可以插入“冗余逻辑”到设计项目中。然而PLDFPGA编译器在逻辑综合时会去掉这些冗余逻辑使得验证险象是否真正被去除变得困难了。为此必须应寻求其它方法来实现电路的功能。图有静态险象的多级时钟图给出图电路的一种单级时钟的替代方案。图中SEL引脚和DIV信号用于使能D触发器的使能输入端而不是用于该触发器的时钟引脚。采用这个电路并不需要附加PLD的逻辑单元工作却可靠多了。 不同的系统需要采用不同的方法去除多级时钟并没有固定的模式。 图无静态险象的多级时钟(这个电路逻辑上等效于图但却可靠的多) 行波时钟另一种流行的时钟电路是采用行波时钟即一个触发器的输出用作另一个触发器的时钟输入。如果仔细地设计行波时钟可以象全局时钟一样地可靠工作。然而行波时钟使得与电路有关的定时计算变得很复杂。行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时使系统的实际速度下降。   用计数翻转型触发器构成异步计数器时常采用行波时钟一个触发器的输出钟控下一个触发器的输入参看图 同步计数器通常是代替异步计数器的更好方案这是因为两者需要同样多的宏单元而同步计数器有较快的时钟到输出的时间。图给出具有全局时钟的同步计数器它和图功能相同用了同样多的逻辑单元实现却有较快的时钟到输出的时间。几乎所有PLD开发软件都提供多种多样的同步计数器。 图行波时钟 图行波时钟转换成全局时钟(这个位计数器是图异步计数器的替代电路它用了同样的个宏单元但有更短的时钟到输出的延时) 多时钟系统许多系统要求在同一个PLD内采用多时钟。最常见的例子是两个异步微处理器器之间的接口或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间所以上述应用引进了附加的定时约束条件。它们也会要求将某些异步信号同步化。图给出一个多时钟系统的实例。CLKA用以钟控REGACLKB用于钟控REGB由于REGA驱动着进入REGB的组合逻辑故CLKA的上升沿相对于CLKB的上升沿有建立时间和保持时间的要求。由于REGB不驱动馈到REGA的逻辑CLKB的上升沿相对于CLKA没有建立时间的要求。此外由于时钟的下降沿不影响触发器的状态所以CLKA和CLKB的下降沿之间没有时间上的要求。如图.II所示电路中有两个独立的时钟可是在它们之间的建立时间和保持时间的要求是不能保证的。在这种情况下必须将电路同步化。图给出REGA的值(如何在使用前)同CLKB同步化。新的触发器REGC由GLKB触控保证REGG的输出符合REGB的建立时间。然而这个方法使输出延时了一个时钟周期。图ll多时钟系统(定时波形示出CLKA的上升沿相对于CLKB的上升沿有建立时间和保持时间的约束条件) 图具有同步寄存器输出的多时钟系统(如果CLKA和CLKB是相互独立的则REGA的输出必须在它馈送到REGB之前用REGC同步化) 在许多应用中只将异步信号同步化还是不够的当系统中有两个或两个以上非同源时钟的时候数据的建立和保持时间很难得到保证我们将面临复杂的时间问题。最好的方法是将所有非同源时钟同步化。使用PLD内部的锁项环(PLL或DLL)是一个效果很好的方法但不是所有PLD都带有PLL、DLL而且带有PLL功能的芯片大多价格昂贵所以除非有特殊要求一般场合可以不使用带PLL的PLD。这时我们需要使用带使能端的D触发器并引入一个高频时钟。 图不同源时钟如图所示系统有两个不同源时钟一个为MHz一个为MHz不同的触发器使用不同的时钟。为了系统稳定我们引入一个MHz时钟将M和M时钟同步化如图所示。M的高频时钟将作为系统时钟输入到所有触发器的的时钟端。MEN和MEN将控制所有触发器的使能端。即原来接M时钟的触发器接M时钟同时MEN将控制该触发器使能原接M时钟的触发器也接M时钟同时MEN将控制该触发器使能。这样我们就可以将任何非同源时钟同步化。图同步化任意非同源时钟(一个DFF和后面非门与门构成时钟上升沿检测电路) 另外异步信号输入总是无法满足数据的建立保持时间容易使系统进入亚稳态所以也建议设计者把所有异步输入都先经过双触发器进行同步化 小结:稳定可靠的时钟是系统稳定可靠的重要条件我们不能够将任何可能含有毛刺的输出作为时钟信号并且尽可能只使用一个全局时钟对多时钟系统要注意同步异步信号和非同源时钟。多时钟系统设计的一些方法:如果时钟间存在着固定的频率倍数这种情况下它们的相位一般具有固定关系可以采用下述方法处理·使用高频时钟作为工作时钟使用低频时钟作为使能信号当功耗不作为首要因素时建议使用这种方式·在仔细分析时序的基础上描述两个时钟转换处的电路如果电路中存在两个不同频率的时钟并且频率无关可以采用如下策略:·利用高频时钟采样两个时钟在电路中使用高频时钟作为电路的工作时钟经采样后的低频时钟作为使能·在时钟同步单元中采用两次同步法·使用握手信号·使用双时钟FIFO进行数据缓冲时钟同步化如果系统中存在两个时钟clka和clkb,设计者可以使用频率高于max(clka,clkb)两倍的时钟来作为采样时钟两个低频时钟经过处理后可以作为触发器的使能信号采用这种方案的好处是整个电路采用单时钟工作但需要一个额外的高频时钟当电路有功耗要求时设计者应该仔细考虑使用M采样M和M,synM作为原来M信号驱动寄存器的使能信号图使用高频时钟采样个低频时钟原理图图使用高频时钟采样个低频时钟波形图在构件由两个不同系统时钟控制工作的模块之间的同步模块时应该遵守下面原则:两个采用不同时钟工作的寄存器之间不应该再出现逻辑电路而应该仅仅是一种连接关系具体如下图所示这种方法有利于控制建立保持时间的满足。握手信号机制是异步系统之间通信的基本方式我们在处理不同时钟之间的接口时也可以采用这种方式但需要注意的是设计者应该仔细分析握手和应答信号有效持续的时间确保采样数据的正确性。目前各种器件中提供的双时钟FIFO宏单元很好的提供了对异步双时钟的访问单元的内部有协调两个时钟的电路确保读写的正确性。可以利用这个器件完成数据的同步。采用全局时钟不要将时钟参与运算。系统提供一定数量的全局时钟线在布局布线时尽量满足这些信号的要求以减小时钟偏移和倾斜。如果时序安排不合理使用了较多gatedclock那么这些时钟的偏斜就会较大不能保障建立时间和保持时间导致电路工作频率降低或无法工作。以寄存器为边界划分工作模块。在设计较大规模的电路时分模块设计是必不可少的在各模块通过之后再进行系统的联调。但由于在单模块调试和联调时布线资源的占用紧张程度不同使得每个模块的输出无法保持与单独布线时相同在联调时造成困难。如果每一个模块的输出端口都采用寄存器输出那么即使在整体布局布线后各模块的输出依然可以保证原来的时序这使得联调的工作效率大大提高。加入这些寄存器也使得电路的可测性有所提高。组合逻辑尽量采用并行结构降低寄存器间组合路径的延迟是提高系统工作频率最主要的手段因此在完成相同功能的前提下应该尽量使用并行逻辑如图所示。如果没有优先级要求应该尽量采用case语句来描述这样综合出来的电路并行度要大一些如果采用ifthenelse结构综合出来的电路都是串行的增大了时延路径。在描述中应该消除锁存器如果某个数据需要保存应该合理安排使用寄存器因为锁存器在整个工作电平有效期间都对输入敏感输入中的任何毛刺经过锁存器后都不会消除这样使得在其后的组合电路发生竞争冒险的可能性大为提高影响电路性能。一些不适当的描述也会使得产生不必要的锁存器增加了电路的面积。在设计中应该尽量采用同步设计信号被时钟采样后再参与逻辑运算这样可以隔断组合路径也可以消除毛刺。在设计中组合信号的输出不允许反馈作为该组合逻辑的输入这样可以避免组合环。�EMBEDWordPicture����EMBEDWordPicture����EMBEDEquation����EMBEDEquation���PAGE西安大唐电信有限公司iEx项目部FPGA设计底层驱动组doc�EMBEDVisioDrawing���图四输入比较器的串行和并行实现vsdvsdunknowndoc�EMBEDVisioDrawing���图工作时钟模型vsdvsdunknown

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/27

FPGA设计经验分析

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利