资源描述
VHDL,设计风格和实现,2000,年6月10日 第,*,页,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,fpga数字电路设计基础(李桥),一、同步设计,什么是同步设计?,同步设计:上游数据到下游逻辑单元的传递是通过时钟来同步的。,-只要能满足时延要求,就可以,确保下游逻辑单元能正确采样到上游数据。,异步设计:上游数据发生变化的时机是不确定的,甚至会出现中间态。,-下游逻辑对上游数据的采样是不确定的,会发生数据传递的错误。,为什么要做同步设计?,两年前我做的,FPGA,设计,现在却不能工作。,FPGA,本身有什么变化吗?,-,如果采用的是异步设计,能否工作有很多无法控制的随机因素。,我的设计原来可以工作,但将,FPGA,重新布线后,就不行了。怎么回事?,-异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?,我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?,-对于异步设计,通过了时间仿真也不一定能正常工作。,要小心,时钟信号和异步复位可别产生毛刺啊。,快速,FPGA,中的触发器会对非常窄的毛刺信号作出反应。,-,异步设计可能会产生以下问题,:,异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的毛刺,但这一点很困难,甚至不可能。,同步设计的一个简单原则,:,永远不要将组合逻辑产生的信号用作时钟、异步复位/置位。,门产生的时钟有问题,此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起问题。,-,MSB,布线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,会输出高电平的毛刺,从而引起寄存器的误动作。,布线更短,此处会产生毛刺,并且与计数器的时钟无关,MSB,0111 1000,计数器,的操作为:,0111 1111 1000,因为,MSB,更快,计数器,flop,MSB,此处的与门为电平敏感,相应的VHDL代码,signal Counter:std_logic_vector(3 downto 0);,signal TC:std_logic;,signal flop:std_logic;,process(Clk),begin,if rising_edge(Clk)then,Counter=Counter+1;,end if;,end process;,TC=1 when Counter=“1111”else 0;,-TC,为,组合逻辑输出,process(TC),begin,if rising_edge(TC)then-,使用组合逻辑输出作时钟,是异步设计,禁止!,flop=,end if;,end process;,毛刺和同步设计,组合逻辑的毛刺通常总是存在,难于甚至无法消除,毛刺只有在异步设计中(连接到时钟、异步复位、锁存器的使能端)才存在问题,在同步设计中,由于寄存器在时钟沿才会动作,只要能满足时延要求,就能确保采样到稳定正确的结果,毛刺无法消除,但其造成的问题却可以消除,采用同步设计并达到时延要求,D,Q3,Async R,INPUT,CLOCK,Counter,Q2,Q1,Q0,D,Q,同步设计方法中,TC,的生成和使用,对照前面异步设计中,TC,生成和使用的例子,TC,相应的VHDL代码,signal Counter:std_logic_vector(3 downto 0);,signal TC:std_logic;,signal flop:std_logic;,process(TC,Clk),begin,if TC=1 then,-,此复位为寄存器信号,为同步设计,可行,Counter=“0000”;,TC=-;,elsif rising_edge(Clk)then,Counter=Counter+1;,if Counter=“,1110,”then,-,注意和异步设计中TC信号的比较,-此处TC为寄存器输出,TC=1;,else,TC=0;,end if;,end if;,end process;,同步设计的更多例子(可行),D,Q1,D,TC,Counter,INPUT,CLOCK,Counter,Q0,INPUT,CLOCK,D,CE,Q,R,S,DATA,相应的VHDL代码,例2,signal Counter:std_logic_vector(3 downto 0);,signal TC:std_logic;,signal s:std_logic;,process(Clk),begin,if rising_edge(Clk)then,if INPUT=1 then,Counter=Counter+1;,end if;,if TC=1 then,-TC,用在寄存器的,CE,端,为同步设计,可行,s=DATA;,end if;,end if;,end process;,TC=1 when Counter=“1111”else 0;,-TC,为组合逻辑输出,例1,signal Counter:std_logic_vector(1 downto 0);,process(Clk),begin,if rising_edge(Clk)then,if INPUT=1 and Counter/=“11”then,Counter=Counter+1;,end if;,-,组合逻辑用在寄存器的,D,端,,-为同步设计,可行,end if;,end process;,异步设计的更多例子(禁止),D,Q1,Async R,D,TC,Counter,这些例子有什么问题,?,INPUT,CLOCK,Counter,Q0,INPUT,CLOCK,D,CE,Q,R,S,DATA,相应的VHDL代码,例2,signal Counter:std_logic_vector(3 downto 0);,signal TC:std_logic;,signal s:std_logic;,process(Clk),begin,if rising_edge(Clk)then,if INPUT=1 then,Counter=Counter+1;,end if;,end if;,end process;,TC=1 when Counter=“1111”else 0;,-TC,为组合逻辑输出,process(TC),begin,if rising_edge(TC)=1 then,-TC,用作寄存器的时钟,为异步设计,,禁止!,s=DATA;,end if;,end process;,例1,signal Counter:std_logic_vector(1 downto 0);,process(Counter,Clk),begin,if Counter=“11”then,-,组合逻辑用作寄存器的异步复位,,-为异步设计,,禁止!,Counter=“00”;,elsif rising_edge(Clk)then,if INPUT=1 then,Counter=Counter+1;,end if;,end if;,end process;,二、速度,中间态、时延和速度,当寄存器间数据传递的时延超过一个时钟周期,下游寄存器不能在下一个时钟周期采样到本时钟周期给出的上游数据,出现错误。,当时钟来临时,寄存器输入发生变化,会采样到中间态。,-建立时间不能被满足,就会采样到中间态,最后的采样结果不确定。,避免,采样不到和采样到中间态的,方法是,满足时延要求,系统中的最大时延决定了系统的速度,也决定了系统能正常工作的最大时钟频率。,D,CLK,Q,CLK,D,Q,当建立时间不够时,会采样到中间态,,最后的采样结果不确定。,建立时间,D,CLK,Q,D,CLK,Q,时延中包括时钟相差,下面逻辑中,数据时延很小(最大3.6,ns),,如果时钟相差较小,该逻辑可以跑200,MHz,以上。,由于存在时钟相差,,Flop B,到,Flop C,的实际时延为3.3+12.1-3.6=11.8,ns,,在100,MHz,下就不能工作。,计算速度时要考虑时钟相差的影响。,使用全局驱动,可以减少时钟相差。,D,Q,INPUT,CLOCK,D,Q,D,Q,Flop C,12.1,3.6,3.3,3.6,3.1,3.0,Flop B,Flop A,时延级数怎么算,?,FPGA,的时延,通常,布线占,5,0%,逻辑占,50%,不要忘记了时钟到输出的时间,(,tco,,输出时间)和时钟到建立的时间,(,tsu,,建立时间),-逻辑时延级数总会包括这两级。,D,CE,Q,R,P,D,CE,Q,R,P,?,XCV100-4,的例子,3,级逻辑的速度有多快?,布线时延大致可估算为与逻辑时延相等,下面,Slice,的时延是,Tilo,,从,F,G,经过,LUT,输出的时延,D,CE,Q,D,CE,Q,Tcko+,布线,+,Tilo+,布线,+,Tilo+,布线,+,Tilo+,布线,+,Tdick,1.372,+1.057+0.738+1.057+0.738+1.057+0.738+1.405+0.765,=8.927,ns,或者,110,MHz,速度估计,用逻辑时延作为网络时延的估计,已知系统的时钟频率,可以估计允许的逻辑深度,和功能需求相对照,修改设计以满足性能需要。,在,50 MHz,下使用,XCV100-4,的例子:,时钟周期,20 ns,一级布线时延,-5 ns(Tcko+Tnet+Tick)Tcko+Tick=2.871ns,允许增加时延,=15 ns,每增加一级的时延,/1.52 ns(Tilo+Tnet)Tilo=0.738ns,允许增加的级数,=710 Slices,Tcko,Tnet,Tilo,Tnet,Tilo,Tnet,Tick,Slice,Slice,Slice,Slice,注意此,Slice,中使用了LUT,所以建立时间是,Tick,而不是,Tdick,,这种映射结果减少了一级布线时延,对高扇出的网络使用全局驱动,设计中,有高扇出的时钟使能、,IOB,三态以及其他信号吗,?,使用剩余的,BUFG,来驱动它们,以达到更小的相差和更高的性能,使用,BUFG,,时钟输入的相差可以小于,1,ns,使用,BUFG,的方法,实例化,BUFG,,将相应信号连接上去,D,CE,Q,R,P,CE or OE or RST,INPUT,CLOCK,BUFG,使用全局复位有助于提高速度,所有的,触发器,在上电时通过全局置位/复位(,GSR),网络进行初始化,你可以通过实例化,STARTUP,元件访问,GSR,网络。,GSR,自动连接到所有,CLB,的触发器,使用专用的布线资源。,使用,GSR,,可以节约通用布线资源,减小布线时延,提高系统速度,不要连接,GSR,到触发器的复位、置位输入端,任何信号,(,如内部信号、外部输入等)都可以连接到,GSR,,但该信号必须在设计中定义。,VHDL代码中的复位,在下面的,VHDL,中,应该在,Rst,中对寄存器赋值,否则,Rst,信号会被综合成寄存器的,CE,端的一个输入。,-浪费布线资源、增加逻辑级数,降低系统速度,即使不关心寄存器的复位状态,也应该对其赋初值,可以赋初值为“-”,即“,Donnt care”。,这样,寄存器的复位端不会被使用,节约布线资源,Process(Rst,Clk),begin,if Rst=1 then,DataValid=0;,Data(31 downto 0)-);,-,这个语句一定要写,否则,Rst,信号会被综合成寄存器,-,Data,到,DataCE,端,的一个输入,elsif rising_edge(Clk)then,DataValid=f(x);,Data=g(y);-,f(x),g(x),表示组合逻辑,end if;,end process;,小技巧:对于逻辑向量,s,td_logic_vector,的赋值,可以使用“()”来表示。如:,signal ptr:std_logic_vector(14 downto 0);,ptr=000,可以写成,ptr 0);,ptr(12 downto 7)=-,可以写成,ptr(12 downto 7)-);,ptr 0);,采用流水线逻辑来提高速度,FPGA,触发器资源丰富,增加流水线逻辑级数,可提高系统速度,D,CE,Q,R,P,D,CE,Q,R,P,?,D,CE,Q,R,P,D,CE,Q,R,P,?,D,CE,Q,R,P,?,25,MHz,50,MHz,4-5输入的逻辑函数对速度和密度最有利,Xilinx FPGA,由四输入查找表(,LUT),组成。,一个查找表能实现其输入形成的任何逻辑函数,相当于编址,ROM,,将输入作为地址,查找出函数结果。,LUT,能实现的函数只受输入数目限制,不受函数复杂度限制,一个,Slice,中可用两个,LUT,和选择器实现5输入的任何逻辑。,减少函数输入(扇入)来适合,Slice,,,可以提高逻辑密度和速度。,取反不耗费资源(,free),。,CLB Lookup Table,状态机的三种类型编码,与速度,二进制:,状态序列如同计数器序列,,S1=001,S2=010,S3=011,S4=100,etc,枚举:,状态有指定的值,,S1=100,S2=110,S3=101,S4=111,etc,One Hot,:,每个状态只有一个寄存器有效,,S1=00000001,S2=00000010,S3=00000100,etc,在状态机从当前状态跳到下一状态时,二进制和枚举类型有大量的反馈输入。,在,FPGA,中,使用二进制和枚举类型,比,one-hot,编码慢。,-,One Hot,每个状态只需提供一位反馈输入,状态机的速度,对于较大的状态机,使用,One Hot,编码,二进制或者枚举编码,对于较小的状态机合适。,记住四输入查找表!,状态机可能会有很多的扇入,和大量的反馈,对速度不利,使用,One Hot,并限制输入状态数,使输入限制到4-5,可以达到最高的速度。,Input 1,Input 3,State 4,State 6,State 19,1,LUT,D,Q,fn1,D,Q,fn1,D,Q,fn1,对高扇出网络,通过,复制寄存器来提高速度,高扇出网络难于布线,而且较慢,通过复制寄存器来改进布线和速度,Foundation,工具不会自动完成这种功能,将复制寄存器命名为,_,a,_b,_c,不要,用,1,2,3。,计数终点信号提前译码以提高速度,对大的计数器而言,译码产生计数终点信号需要逻辑级数较多,-,提前一个时钟周期译码计数终点信号,寄存后使用,可以提高速度,并保持时序关系不变。,Q0,Q1,Q2,Q3,CO,D0,D1,D2,D3,CE,C,Q,DATA0,DATA1,DATA2,DATA3,ENABLE,CLOCK,D,Q0,Q1,Q2,Q3,CO,D0,D1,D2,D3,CE,C,DATA0,DATA1,DATA2,DATA3,ENABLE,CLOCK,其他逻辑,其他逻辑,速度关键输入应在逻辑最后一级提供,关键输入应该在逻辑最后一级提供,关键输入为,芯片、,Slice,、,或者,LUT,提供的时延最大的输入,将关键输入连接在逻辑最后一级,在,VHDL,中,将关键输入放在,ifelsif,链的第一级,IN(Critical),OUT,IN(Critical),OUT,A,A,编码:只有在必要时才使用二进制序列,可以生成各种需要的序列,而不仅限于二进制,使用,预缩放,(,prescal,e,),技术,来提高速度,低位翻转很快,参见,Application Notes,XAPP001 and XAPP014,如果要译码输出,使用格雷(,Gray),码计数器,两位编码,00,01,11,10,每次只翻转一位,可以避免译码产生毛刺,如果只需要计数终点,考虑使用线性反馈移位寄存器(,LFSR),提高速度。,生成序列可以覆盖的地址空间为,2,n,-1,全0不包含在序列中。,n,取不同值时,用来生成反馈位的两位不同,参见相关资料,在可以采用任意规则序列的情况下,也可以使用,LFSR (,比如,FIFO),进位较慢的,大计数器,TC,CE,快速的,小,计数器,10-,bit SR,Q0,Q9,Q6,10,位的线性反馈移位寄存器,process(Rst,Clk),begin,if Rst=1 then,Q=(others=0);,Q(0)=1;,elsif rising_edge(Clk)then,for I in 1 to 9 loop,Q(I)=Q(I-1);,end loop;,Q(0)=Q(6)xor Q(9);,end if;,end process;,使用预缩放,(,Pre-scale),提高计数器速度,计数器的速度由从,LSB,到,MSB,的进位延迟决定,预缩放技术对较大的计数器特别有益,-低位翻转很快,用低位的TC作为高位的CE,可以降低高位的时钟频率,-,使用,TimeSpecs,进行约束,预缩放技术限制了载入时间,故计数器不可加载,参考,XAPP014,快速的,小计数器,进位较慢的,大计数器,TC,CE,I/O 速度:FPGA的建立时间 Tsu,FPGA,的输入输出也有时延要求。,满足时延要求的,FPGA,建立时间由:全局时钟时延,Tbufg,、板上时延,Tbrd,和上游器件的输出时间,Tco(up),决定。,FPGA,建立时间,(,Tsu),的计算公式,:,Tsu-fpga=Tcyc-Tco(up)-Tbrd+Tbufg,可以使用“,OFFSET IN”,对,Tsu,进行,约束,D,CE,Q,上游器件,D,CE,Q,XCV400 FPGA,Clock(Tcyc),Tco(up),Tbrd,Tbufg,Tsu,I/O速度:FPGA的输出时间Tco,FPGA,输出时间的计算公式:,Tco=Tcyc-Tsu(down)-Tbrd-Tbufg,使用“,OFFSET OUT”,对,Tco,进行约束,D,CE,Q,XCV400 FPGA,D,CE,Q,下游器件,Clock(Tcyc),Tco,Tbrd,Tbufg,Tsu(down),OPAD,OBUF,FAST,使用快跳变提高输出速度,管脚输出可以控制跳变速度。,缺省跳变速度为“,slow”,,以降低噪音,当速度重要时,将跳变速度设为“,fast”,可以通过管脚加入,FAST,约束实现。,使用,I/O,寄存器提高输入和输出速度,使用,IOB中的I/O寄存器,可以提高输入和输出速度,-,输入或输出可以去除从内部布线的时延,,IOB,中的时延也更小,-还可以节约寄存器资源,实现,选项中,选择“,Pack I/O Registers/Latches into IOBs for Inputs and Outputs,”,-,输入若未寄存,直接扇入到组合逻辑,则不能,map,到IO寄存器中,-输出若为组合逻辑输出,或者需要反馈为输入,则不能,map,到IO寄存器中,D,CE,Q,D,CE,Q,I/O pad,From:FPGA,Into:FPGA,OFF,IFF,Output Clock,Input Clock,使用,I/O,寄存器的例子(,FPGA-FPGA),D,CE,Q,发送器(,XCV100-4 FPGA),D,CE,Q,接收器(,XCV100-4 FPGA),使用,IOB,中寄存器的时延,Tiockp+PCB,网络时延 +,Tiopick,5.649 1.962=7.611,不使用,IOB,中寄存器的时延,(,Tcko+Tnet+Tioop)+PCB,网络时延,+(,Tiopi+Tnet+Tdick),(1.372+0.756+5.652)(0.989+1.930+0.728),7.7803.647 =11.427,三、资源,资源使用量是指,FPGA,使用了的百分率,在宏、库、以及,XAPP application notes,中找到可比较的函数来估计资源使用量,也可以根据别的设计的经验来估计器件使用率,快速实现,然后查看,MAP,报告,选择“,Implementation,/View Report Files/Map report”,Slices,IOBs,Block RAMs,以及其他部件分别列出,并给出使用百分率。最后给出相当于,ASIC,的门数,资源估计,Design Summary,-,Number of errors:0,Number of warnings:644,Number of Slices:1,147 out of 1,200 95%,Slice Flip Flops:735,4 input LUTs:1,046(1 used as a route-thru),Dual Port RAMs:312,Number of Slices containing,unrelated logic:0 out of 1,147 0%,Number of bonded IOBs:85 out of 98 86%,IOB Flip Flops:68,Number of Block RAMs:10 out of 10 100%,Number of GCLKs:2 out of 4 50%,Number of GCLKIOBs:2 out of 4 50%,Number of DLLs:1 out of 4 25%,Number of Startups:1 out of 1 100%,Number of RPM macros:9,Total equivalent gate count for design:224,805,Additional JTAG gate count for IOBs:4,176,可以把查找表用作,RAM,使用,CoreGen,或,LogiBLOX,,,可以用,LUT,生成,RAM,选择功能,-,单/双端口,-,同步/异步,-深度扩展时,基于BUFT还是LUT,选择大小,-,没有浪费的资源,-,可扩展为需要的大小,选择位置,-,布置在基片的任何地方,-,邻近关键电路以提高速度,选择编程方法,-,通过启动时的比特流,-,通过设计中的操作,Address,Data,WE,Distributed,RAM,Clock,Data 2,Address,2,Optional,Dual Port,使用,RAM,作状态寄存器可以节约资源,和触发器比,,Slice,密度提高为16:1,而且,FPGA,的布线更容易,例如10,个16位可读写状态寄存器需要,:,160,个寄存器,即80个,Slice,使用,RAM,同样10个状态寄存器需要:,16,个4输入,LUT,即8个,Slice,也可以用,RAM,实现移位寄存器,vs.,寄存器.,RAM,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,
展开阅读全文