您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > VHDL设计风格和实现(华为)
VHDL设计风格和实现,2000年6月10日第1页VHDL设计风格和实现VHDL设计风格和实现,2000年6月10日第2页内容概述一、同步设计二、速度三、资源四、其他VHDL设计风格和实现,2000年6月10日第3页一、同步设计VHDL设计风格和实现,2000年6月10日第4页什么是同步设计?同步设计:上游数据到下游逻辑单元的传递是通过时钟来同步的。-只要能满足时延要求,就可以确保下游逻辑单元能正确采样到上游数据。异步设计:上游数据发生变化的时机是不确定的,甚至会出现中间态。-下游逻辑对上游数据的采样是不确定的,会发生数据传递的错误。VHDL设计风格和实现,2000年6月10日第5页为什么要做同步设计?两年前我做的FPGA设计,现在却不能工作。FPGA本身有什么变化吗?-如果采用的是异步设计,能否工作有很多无法控制的随机因素。我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?-异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?-对于异步设计,通过了时间仿真也不一定能正常工作。要小心,时钟信号可别产生毛刺啊。要小心,异步复位可别有毛刺啊。快速FPGA中的触发器会对非常窄的毛刺信号作出反应。-异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的毛刺,但这一点在异步设计中很困难,甚至不可能。异步设计可能会产生以下问题:同步设计的一个简单原则:永远不要将组合逻辑产生的信号用作时钟、异步复位/置位。VHDL设计风格和实现,2000年6月10日第6页门产生的时钟有问题此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起问题。-MSB布线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,会输出高电平的毛刺,从而引起寄存器的误动作。布线更短此处会产生毛刺,并且与计数器的时钟无关MSB01111000计数器的操作为:011111111000因为MSB更快计数器flopMSB此处的与门为电平敏感VHDL设计风格和实现,2000年6月10日第7页相应的VHDL代码signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signalflop:std_logic;process(Clk)beginifrising_edge(Clk)thenCounter=Counter+1;endif;endprocess;TC=‘1’whenCounter=“1111”else‘0’;--TC为组合逻辑输出process(TC)beginifrising_edge(TC)then--使用组合逻辑输出作时钟,是异步设计,禁止!!!flop=…endif;endprocess;VHDL设计风格和实现,2000年6月10日第8页毛刺和同步设计u组合逻辑的毛刺通常总是存在,难于甚至无法消除u毛刺只有在异步设计中(连接到时钟、异步复位、锁存器的使能端)才存在问题u在同步设计中,由于寄存器在时钟沿才会动作,只要能满足时延要求,就能确保采样到稳定正确的结果u毛刺无法消除,但其造成的问题却可以消除—采用同步设计并达到时延要求VHDL设计风格和实现,2000年6月10日第9页安全同步化异步输入一例——去抖动逻辑DQR异步输入系统时钟同步输入设备外围DQDQ延迟一个周期后才复位,确保D端输入脉冲至少有一个周期的宽度,没有中间态异步输入的信号变化时机和宽度不确定,有抖动(毛刺),不能直接被同步系统正确采样•该逻辑确保能正确得到异步输入的上升沿。•一个时钟周期内的多次电平变化被认为是抖动(毛刺),最后只得到一个上升沿。VHDL设计风格和实现,2000年6月10日第10页相应的VHDL代码signalAsynInput:std_logic;signalInputReg:std_logic;signalDelay:std_logic;signalSynInput:std_logic;process(SynInput,AsynInput)beginifSynInput=‘1’then--此置位为寄存器信号,为同步设计,可行InputReg=‘0’;ifrising_edge(AsynInput)thenInputReg=‘1’;endif;endprocess;process(Clk)beginifrising_edge(Clk)thenDelay=InputReg;SynInput=Delay;endif;VHDL设计风格和实现,2000年6月10日第11页DQ3AsyncRINPUTCLOCKCounterQ2Q1Q0DQ同步设计方法中TC的生成和使用对照前面异步设计中TC生成和使用的例子TCVHDL设计风格和实现,2000年6月10日第12页相应的VHDL代码signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signalflop:std_logic;process(TC,Clk)beginifTC=‘1’then--此复位为寄存器信号,为同步设计,可行Counter=“0000”;TC=‘-’;elsifrising_edge(Clk)thenCounter=Counter+1;ifCounter=“1110”then--注意和异步设计中TC信号的比较--此处TC为寄存器输出TC=‘1’;elseTC=‘0’;endif;endif;endprocess;VHDL设计风格和实现,2000年6月10日第13页同步设计的更多例子(可行)DQ1DTCCounterINPUTCLOCKCounterQ0INPUTCLOCKDCEQRSDATAVHDL设计风格和实现,2000年6月10日第14页相应的VHDL代码例2signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signals:std_logic;process(Clk)beginifrising_edge(Clk)thenifINPUT=‘1’thenCounter=Counter+1;endif;ifTC=‘1’then--TC用在寄存器的CE端,为同步设计,可行s=DATA;endif;endif;endprocess;TC=‘1’whenCounter=“1111”else‘0’;--TC为组合逻辑输出例1signalCounter:std_logic_vector(1downto0);process(Clk)beginifrising_edge(Clk)thenifINPUT=‘1’andCounter/=“11”thenCounter=Counter+1;endif;--组合逻辑用在寄存器的D端,--为同步设计,可行endif;endprocess;VHDL设计风格和实现,2000年6月10日第15页异步设计的更多例子(禁止)DQ1AsyncRDTCCounter这些例子有什么问题?INPUTCLOCKCounterQ0INPUTCLOCKDCEQRSDATAVHDL设计风格和实现,2000年6月10日第16页相应的VHDL代码例2signalCounter:std_logic_vector(3downto0);signalTC:std_logic;signals:std_logic;process(Clk)beginifrising_edge(Clk)thenifINPUT=‘1’thenCounter=Counter+1;endif;endif;endprocess;TC=‘1’whenCounter=“1111”else‘0’;--TC为组合逻辑输出process(TC)beginifrising_edge(TC)=‘1’then--TC用作寄存器的时钟,为异步设计,禁止!s=DATA;endif;endprocess;例1signalCounter:std_logic_vector(1downto0);process(Counter,Clk)beginifCounter=“11”then--组合逻辑用作寄存器的异步复位,--为异步设计,禁止!!!Counter=“00”;elsifrising_edge(Clk)thenifINPUT=‘1’thenCounter=Counter+1;endif;endif;endprocess;VHDL设计风格和实现,2000年6月10日第17页二、速度VHDL设计风格和实现,2000年6月10日第18页中间态、时延和速度当寄存器间数据传递的时延超过一个时钟周期,下游寄存器不能在下一个时钟周期采样到本时钟周期给出的上游数据,出现错误。当时钟来临时,寄存器输入发生变化,会采样到中间态。-建立时间不能被满足,就会采样到中间态,最后的采样结果不确定。避免采样不到和采样到中间态的方法是满足时延要求系统中的最大时延决定了系统的速度,也决定了系统能正常工作的最大时钟频率。DCLKQCLKDQ当建立时间不够时,会采样到中间态,最后的采样结果不确定。建立时间DCLKQDCLKQVHDL设计风格和实现,2000年6月10日第19页时延中包括时钟歪斜(Skew)下面逻辑中,数据时延很小(最大3.6ns),如果时钟歪斜较小,该逻辑可以跑200MHz以上。由于存在时钟歪斜,FlopB到FlopC的实际时延为3.3+12.1-3.6=11.8ns,在100MHz下就不能工作。计算速度时要考虑时钟歪斜的影响。使用全局驱动,可以减少时钟歪斜。DQINPUTCLOCKDQDQFlopC12.13.63.33.63.13.0FlopBFlopAVHDL设计风格和实现,2000年6月10日第20页时延级数怎么算?FPGA的时延通常布线占50%,逻辑占50%不要忘记了时钟到输出的时间(tco,输出时间)和时钟到建立的时间(tsu,建立时间)-逻辑时延级数总会包括这两级。还需要检查I/O的速度。DCEQRPDCEQRPVHDL设计风格和实现,2000年6月10日第21页XCV100-4的例子3级逻辑的速度有多快?布线时延大致可估算为与逻辑时延相等—下面Slice的时延是Tilo,从F,G经过LUT输出的时延DCEQDCEQTcko+布线+Tilo+布线+Tilo+布线+Tilo+布线+Tdick1.372+1.057+0.738+1.057+0.738+1.057+0.738+1.405+0.765=8.927ns或者110MHzVHDL设计风格和实现,2000年6月10日第22页速度估计用逻辑时延作为网络时延的估计已知系统的时钟频率,可以估计允许的逻辑深度—和功能需求相对照,修改设计以满足性能需要。在50MHz下使用XCV100-4的例子:时钟周期20ns一级布线时延-5ns(Tcko+Tnet+Tick)Tcko+Tick=2.871ns允许增加时延=15ns每增加一级的时延/1.5~2ns(Tilo+Tnet)Tilo=0.738ns允许增加的级数=7~10SlicesTckoTnetTiloTnetTiloTnetTickSliceSliceSliceSlice注意此Slice中使用了LUT,所以建立时间是Tick而不是Tdick,这种映射结果减少了一级布线时延VHDL设计风格和实现,2000年6月10日第23页对高扇出的网络使用全局驱动设计中,有高扇出的时钟使能、IOB三态以及其他信号吗?使用剩余的BUFG来驱动它们,以达到更小的歪斜和更高的性能使用BUFG,时钟和CE输入的歪斜可以小于1ns使用BUFG的方法,实例化BUFG,将相应信号连接上去DCEQRPCEorOEorRSTINPUTCLOCKBUFGVHDL设计风格和实现,2000年6月10日第24页使用全局复位
本文标题:VHDL设计风格和实现(华为)
链接地址:https://www.777doc.com/doc-4911450 .html