第I章FPGA设计的指导性原则 ·电路的主要信号,输出信号等并不依赖于任何一个时钟性信号。不是由时钟信 号驱动F产生的。 。异步时序电路的最大缺点是容易产生毛刺。在布局布线后仿真和用逻辑分析仪 观测实际信号时,这种毛刺尤其明显。 ·同步时序电路 ·电路的核心逻辑用各种各样的触发器实现, ·电路的主要信号,输出信号等都是由某个时钟沿驱动触发器产生出来的。 ·同步时序电路可以很好的避免毛刺。布局布线后仿真,和用逻辑分析仪采样实 际工作信号都没有毛刺。 由于大家对同步时序设计的原则都有一定的了解,在此不累述同步时序设计的重要性, 仅仅对同步时序设计中一些常见疑问做以分析和解答。 ·是否同步时序电路一定比异步电路使用更多的资源呢? 如果单纯的从ASIC设计来看,大约需要7个门来实现一个D触发器,而一个 门即可实现一个2输入与非门,所以一般来说A$IC设计中,同步时序电路比 异步电路占用更大的面积。但是由于FPGA/CPLD是定制好的底层单元,对于 Xilinx器件一个底层可编程单元Slice包含2个触发器(FF)和2个查找表 (LUT),对于Altera器件,一个底层可编程单元LE包含1个触发器(FF) 和1个查找表(LUT)。其中FF用以实现同步实现电路,LUT用以实现组合 电路。FPGA/CPLD的最终使用率用Slice或者LE的利用率来衡量。所以对于 某个选定器件,其可实现为同步实现电路和异步电路的资源的数量和比例是固 定的。这点造成了过度使用LUT,会浪费F℉资源;过度使用FF,会浪费 LUT资源的情况,因而对于FPGA/CPLD同步时序设计不一定比异步设计多 消耗资源,单纯的从节约资源的角度考虑,应该按照芯片配置的资源比例实现 设计,但是设计者还要时刻权衡到同步时序设计带来的没有毛刺,信号稳定的 优点,所以从资源使用的角度上看,PGA/CPLD设计,也是推荐采用同步时 序设计的。 如何实现同步时序电路的延时? 异步电路产生延时的一般方法是插入一个Buffer、两级非门等,这种延时调整 手段是不适用于同步时序设计思想的。首先要明确一点HDL语言中的延时控 制语法,例如: #5a<=4b0101; 其中的延时5个时间单位,是行为级代码描述,常用于仿真测试激励,但是在 电路综合是会被忽略,并不能启动延时作用。 同步时序电路的延时一般是通过时序控制完成的。换句话说,同步时序电路的 延时被当做一个电路逻辑来设计。对于比较大的和特殊定时要求的延时,一般 用高速时钟产生一个计数器,根据计数器的计数,控制延时;对于比较小的延 时,可以用D触发器打一下,这种做法不仅仅使信号延时了一个时钟周期, 而且完成了信号与时钟的初次同步,在输入信号采样和增加时序约束余量中使 16
" !"#$%&'()*+ !,-)* ./ 01 )23456,78019: ;<=<>?@ABCDE FGH)IJ9:KLMN OJOPQRS T,-U()*V./QRS01W X)2YZ[\]^9: <=<>?@ABCDE_P H`aTbc9: s&MrH2 RNÒÖ)*+UcH2 ý >>rH2 89ïP'8CQ"ÖR! defg 8 hiWj4kl % (mW'( QRSn'( moY'( * pqrmsZ'tWu 8 hivX)2 wx4yz {,-$ ,|}\~e$ 0.1 S'(~Ye * (QRSB * ( $ S'(~Ye 3 " (QRS B " ( Lv ZX Z 3 3 W sZ$ U(|SLYXBB, | I6 ¡¢ £ ¡¢ ¤¥¦n$ X)2hi!'|hi§ ¨©efgªk«¬®¯°±²³´µ hi{,hi¶)·¸¹X)2hiºWbc9:»| ¼6sZg«½j hi¾,¿À_X) 2hi !"#$% 01Á)'tÂÃ,Äp'( 4// ÅÆÇrmIJÁ)ÈÉ ÊË,!Ì$X)2hiÍÎ ÏÐMÑ'6 ÒÓvÁ)Ô }ÒÃÕ D6EF,G7&"&"( LvÁ) 6 ()Öe×,ØÇÙÚÛÜ$@AGÝÞß{,; à , áâã !äå/Á)a X)2Á)'t,æ)2Ô}ç èéêuX)2 Á)áëì'(Whi $í4Bîï|)ðÁ)'t ñò)*01'(iSóôiSiÔ}Á)£$íõÁ )YZ QRSö'÷IJìÃ!øøÁ)'()*ùú nûçq)*üýX;p_PBþ)2kv
基本原则之四:同步设计原则 用。 同步时序电路的时钟如何产生? 同步时序电路的核心就是时钟,时钟沿驱动F控制数据的产生,是同步时序 电路的主要表现形式。所以时钟的质量和稳定性直接决定着同步时序电路的性 能。 为了获得高驱动能、低抖动时延、稳定的占空比的时钟信号,一般使用 FPGA/CPLD内部的专用时钟资源产生同步时序电路的主工作时钟。专用时钟 资源主要指两部分,一部分是布线资源,包括全局时钟布线资源,和长线资源 等。另一部分是FPGA内部的PLL或者DLL。关于专用时钟资源和PLL/DLL 模块的使用方法,详见“常用模块之三:全局时钟资源与时钟锁相环”。 ·输入信号的同步 同步时序电路要求对输入信号进行同步化,同步化的主要作用是使本级时钟的 处理沿获得相对于数据的最长有效处理时间,从而获得了更长的时间余量。如 果输入数据的节拍和本级芯片的处理时钟同频,并且建立、保持时间匹配,可 以直接用本级芯片的主时钟对输入数据寄存器采样,完成输入数据的同步化。 如果输入数据和本级芯片的处理时钟是异步的,特别是频率不匹配的时候,则 只是要用处理时钟对输入数据做两次寄存器采样,才能完成输入数据的同步 化。需要说明的是,两次寄存器采样的作用在于有效地防止了亚稳态(数据状 态不定)的传播,是后级电路获得的电平为有效电平,但是这种处理并不能防 止错误采样电平的产生。关于输入数据的同步化的详细论述,参见“基本设计 思想与技巧之四:数据接口的同步方法”。 ·是不是定义为rg型,就一定综合成寄存器,并且是同步时序电路呢? 答案是否定的。在Verilog代码中最常用的两种数据类型是wire和reg,一般 来说,wire型指定的数据和网线通过组合逻辑实现,而reg型指定的数据不一 定就是用寄存器实现。下面的例子就是一个纯组合逻辑的译码器。请大家注 意,代码中将输出信号Dout定义为reg型,但是综合与实现结果却没有使用 FF,这个电路是一个纯组合逻辑设计。 module reg cmb(Reset, CS, Din, Addr, Dout); input Reset; //Asynchronous reset input CS; //Chip select,low effect input [7:0]Din; //Data in input [1:0]Addr; /Address output [1:0]Dout; //Data out reg [1:0]Dout; 17
&!"'( X)2,)*)*V./ Ô}ô01,X)2 sZ)*B»|+ |X)2+ ä ñ./äÅ/)ÁÅ»|w)*'t )*01X)2`a)* )* ÆC'C,<> =)*<>B> 'C, $)*B ÂÃÜ Õ=)*q)*!"#$ )*+, X)2ðp%ØX&X&a,'Ç)* ()V "$ô3c*())Ögn x)Ö dpôª+B'Dz³())*X, û-.Å/0)Ö1´Y Z 'Dz³)*pô23S_PçpôX& dpôB'Dz³())*,î4,,!1´)56 7,())*pôìÆý23S_P8äçpôX & luM,Æý23S_Pa;$c*9:;»<ô= <!|>?,?Ç @c*@{,IJ() !ä9 :AB_P@01 $pôX&CDÛEF'hi ÍÎqGHIÕô JXÂÃ$ -./ 01234567819: KL,M| ; 2 : Ùv3ÜÆJôNO, ; B :'t Wu; O|ôBP>æ n : O|ô!' |,23S ÷yQ,'(f S R4ST UÙvV |W : O{,à qXdYbc I(,'(f hi .-/5 B) F B '( ) (F3/ ) ()/ / ) *$+,B)(B) ) *+,F (F *+,B (B .*+,B (
第I章FPGA设计的指导性原则 always @(Reset or cs or Addr or Din if (Reset) Dout =0; else if (!CS) begin case (Addr) 2'b00:Dout=-Din[1:0]; 2'b01:Dout-Din[3:2]: 2'b10:Dout=Din[5:4]: default:Dout Din[7:6]; endcase end else Dout 2'bzz; endmodule 1.5基本设计思想与技巧之一:乒乓操作 后面3个小节,简单介绍一些FPGA的设计思想与操作技巧。FPGA的设计思想和技巧 多种多样,篇幅所限,我们不可能将日常工作中涉及的所有设计思想和技巧都一一讨论,在 此仅仅挑选了3个有代表性的方法加以简要介绍,希望读者能够通过日常工作实践,总结出 更多的设计思想与技巧。 “乒乓操作”是一个常常应用于数据流控制的处理技巧。典型的乒乓操作方法如图8所 示。 输 数据缓冲 输出 据 模块1 数据 流选 流选 择单 数据流运算 元 元 处理模块 MUX 数据缓冲 MUX 2选1 模块2 2选1 图1-8乒乓操作示意图 乒乓操作的处理流程描述如下:输入数据流通过“输入数据选择单元”,等时的将数据 流等时分配到两个数据缓冲区。数据缓冲模块可以为任何存储模块,比较常用的存储单元为 双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。在第一个缓冲周期,将输入的数据 流缓存到“数据缓冲模块1”。在第2个缓冲周期,通过“输入数据选择单元”的切换,将 18
" 34F B)' ) ' B 0( ) 6' 5.) /F ' =5+B 0B)*+,( =5+B 0B)*!+ ,( =5+B 0B)*"+,( +B 0B)*$+#,( / B 0 =5GG( Q. 5 $ÂÓÔ9 :! " Ñ ü7øt®23+,-ZPR8yztN "R³´) *>>SCÒ 5 $N=|;<BCÓDE{Ì-PRWTU\ :! hi#$Æsp#Õ!VV;<3 ) t 4! ") #ÕØcefIphIpCDÔ i Zp E0§$pW !pW,C×ó*KXæçKXÔ × ": x yÔ: ?@8 !)?$WZIp WK0hpW "i!)? * $WhIpCDÔ i¤¹Z
基本设计思想与技巧之一:乒兵操作 输入的数据流缓存到“数据缓冲模块2”,与此同时,将“数据缓冲模块1”缓存的第1个周 期的数据通过“输入数据选择单元”的选择,送到“数据流运算处理模块”被运算处理。在 第3个缓冲周期,通过“输入数据选择单元”的再次切换,将输入的数据流缓存到“数据缓 冲模块1”,与此同时,将“数据缓冲模块2”缓存的第2个周期的数据通过“输入数据选择 单元”的切换,送到“数据流运算处理模块”被运算处理。如此循环,周而复始。 乒乓操作的最大特点是,通过“输入数据选择单元”和“输出数据选择单元”按节拍、 相互配合的切换,将经过缓冲的数据流没有时间停顿的送到“数据流运算处理模块”,被运 算与处理。把乒乓操作模块当做一个整体,站在这个模块的两端看数据,输入数据流和输出 数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒 乓操作常常并应用于流水线式算法,完成数据的无缝缓冲与处理。 乒乓操作的第二个优点是可以节约缓冲区空间。比如在WCDMA基带应用中,1帧 (Frame)是由I5个时隙(Slot)组成的,有时需要将1整帧的数据延时一个时隙后处理, 比较直接的办法是将这帧数据缓存起来,然后延时1个时隙,进行处理。这时缓冲区的长度 是1整帧数据长,假设数据速率是3.84Mb/s,1帧长10s,则此时需要缓冲区长度是 384O0bit。如果采用乒乓操作,只需定义两个能缓冲1个slot数据的RAM(单口RAM即 可),当向一块RAM写数据的时候,从另一块RAM读数据,然后送到处理单元处理,此 时,每块RAM的容量仅需2560bit即可。2块RAM加起来也只有5120bit的容量。 另外巧妙的运用乒乓操作,还可以达到用低速模块处理高速数据流的效果。如图9所 示, 数据缓冲模块采用了双口RAM,并在DPRAM后引入了一级数据预处理模块,这个数 据预处理可以根据需要是各种数据运算,比如在WCDMA设计中,对输入数据流的解扩、 解扰、去旋转等。假设端口A的输入数据流的速率为100Mb/s,乒乓操作的缓冲周期是 10s。我们下面一起分析一下各个节点端口的数据速率。 B1 数据缓冲 C1 DI 输入 数据预处 模块 输出 数据 理模块1 DPRAM1 数据 流选 流选 择单 择单 数据流运算 元 处理模块 MUX 数据缓冲 MUX 2选1 模块 数据预处 DPRAM2 理模块1 2选1 B2 C2 D2 图19利用乒乓操作降低数据速率 输入数据流A端口处数据速率为100M6/s,在第1个缓冲周期10ms内,通过“输入数 据选择单元”,从B1到达DPRAM1。B1的数据速率也是1OOMb/s,在IOms内,DPRAM1 要写入1Mb数据。同理在第2个I0s,数据流被切换到DPRAM2,端口B2的数据速率也 是100Mb/s,DPRAM2在第2个10ms被写入1Mb数据。周而复始,在第3个10ms,数据 流又切换到DPRAM1,DPRAM1被写入1Mb数据。 仔细分析一下,就会发现到第3个缓冲周期时,留给DPRAM1读取数据并送到“数据 预处理模块1”的时间一共是20Ms。有的同事比较困惑于DPRAM1的读数时间为什么是 19
IpWK0hpW *i:*HZhpW "iWK? " $ phIpCDÔ iCDY0hp0#Õi¿0#Õ!) ? 5 $WhIpCDÔ iG¤¹ZIpWK0hpW "i:*HZhpW *iWK? * $phIpCD Ô i¤¹Y0hp0#Õi¿0#Õ!*´µÞ ¬! &¡ä#hIpCDÔ i"hpCDÔ iZ[ ¥¸EP¤¹Z³WpàNA\]Y0hp0#Õi¿ 0:#Õ!^þ8$ì¾<)$§9"pIp" pR#_+SàNó*\]½*%¡PrpÚ7#Õ!tC ÆsÚ70<Ûãp`aW:#Õ! ?ç$ä#,CW bA!æ) $ æÆ8" F x y# "6 $cxyûãNóZ " ìFp$cQ#Õ æçäåd<#ZFpWKG}eQ " $c#Õ!W b # " ìFpbl p # 5#),7!" Fb "&!*óW b# 5),&&7!L1óð§$-W " $ ! p xÔ: £ ,yþ peñ {peQY0#ÕÔ #Õ* t dq>ó *6-&7 £,!* BG}õ1N 6"*&7 dq! ñ¤fx,C0ß #Õ p`L!3 H t 4pWÒ": ) QFIÒ¦p+#Õ$p +#Õ,Có#Ñp0æ) $ 8rIpÖB ÖDgh !l 9: Ip × "&&7!W# "&!!23e.GQe$ä9:p ! "H Ip 9:#p × "&&7!)? " $W "&! chIp CDÔ i 4" 0 "!4" p õ# "&&7!) "&! c " I "7 p!HÕ)? * $ "&!p¿¤¹0 *9: 4* p õ # "&&7! * )? * $ "&! ¿I "7 p!Þ ¬)? 5 $ "&!p i¤¹0 " " ¿I "7 p! jìQe²¾vÃ0? 5 $Wkl " {[pY0hp +#Õ "iAm# *&!!NHIæçnos " {pA×õ #
第I章FPGA设计的指导性原则 20ms,其实这一点完全可以实现。首先在在第2个缓冲周期,向DPRAM2写数据的10ms 内,DPRAM1可以进行读操作:另外在第1个缓冲周期的第5ms起(绝对时间为5ms时 刻),DPRAM1就可以边向500K以后的地址写数,边从地址0读数,到达10s时, DPRAM1刚好写完了1Mb数据,并且读了500K数据,这个缓冲时间内DPRAM1读了5ms 的时间:另外在第3个缓冲周期的第5ms起(绝对时间为35ms时刻),同理可以边向500K 以后的地址写数,边从地址0读数,又读取了5个s,所以截止DPRAM1第一个周期存入 的数据被完全覆盖以前,DPRAM1最多可以读取了20ms时间,而所需读取的数据为 1Mb,所以端口C1的数据速率为:1Mb/20ms=50Mb/s。因此“数据预处理模块1”的最低 数据吞吐能力也仅仅要求为50Mb/s。同理“数据预处理模块2”的最低数据吞吐能力也仅 仅要求为50M6/s。换言之,通过乒乓操作,“数据预处理模块”的时序压力减轻了,所要求 的数据处理速率仅仅为输入数据速率的12。 通过乒乓操作实现低速模块处理高速数据的实质是:通过DPRAM这种缓存单元,实 现了数据流的串并转换,并行用“数据预处理模块1”和“数据预处理模块2”处理分流的 数据,是面积与速度互换原则的有一个体现! 1.6基本设计思想与技巧之二:串并转换 串并转换是FPGA设计的一个重要技巧,从小的着眼点讲,它是数据流处理的常用手 段,从大的着眼点将它是面积与速度互换思想的直接体现。串并转换的实现方法多种多样, 根据数据的排序和数量的要求,可以选用寄存器、RAM等实现。前面在乒乓操作图9的举 例,就是通过DPRAM实现了数据流的串并转换,而且由于使用了DPRAM,数据的缓冲区 可以开的很大。对于数量比较小的设计可以采用寄存器完成串并转换。如无特殊需求,应该 用同步时序设计完成串并之间的转换。比如数据从串行到并行,数据排列顺序是高位在前, 可以用下面的编码实现: prl temp <{prl temp,srl in); 其中,prl temp是并行输出缓存寄存器,srlin是串行数据输入。 对于排列顺序有规定的串并转换,可以用cas语句判断实现。对于复杂的串并转换, 还可以用状态机实现。串并转换的方法总的来说比较简单,在此不做更多的解释。 1.7基本设计思想与技巧之三:流水线操作 首先需要声明的是这里所讲述的流水线是指一种处理流程和顺序操作的设计思想,并非 FPGA、ASIC设计中优化时序所用的“Pipelining”,关于Pipelining优化时序的方法在第二 章有详细介绍。 流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步 骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下 一个步骤的输入则可以考虑采用流水线设计方法提高系统的工作频率。 流水线设计的结构示意图如图10所示: 20
" *&!fWäÛF,CWÃ!q))? * $W * p "&! c " ,C{ðñ¤)? " $W? 6! GxprA× 6! y " ²,Cq 6&&I CQArpqAr & {p0 "&! " s`ÛÒ "7 pÝ{Ò 6&&I p$WAc " {Ò 6! Aðñ¤)? 5 $W? 6! GxprA× 56! yHÕ,Cq 6&&I CQArpqAr & {pi{[Ò 6 $ !tCtu " ?$KI p¿ÛFvwCÊ " ,C{[Ò *&! AÞtó{[p× "7tC9: " p ×f"7*&!F6&7!!½*hp+#Õ "iß pmn-èõ>>¿× 6&7!!HÕhp+#Õ *ißpmn-èõ> >¿× 6&7!!¹÷hp+#ÕixèúyÒt¿ p#Õ >>×Ip "*! WÃß #Õ pW®#f ÑWKÔ W ÃÒp¹hp+#Õ "i"hp+#Õ *i#Õ p#.T: ¸¹N$¾Ãa ¹# $ý«zäà#p#Õ{ &«zäZà#.T: ¸¹äå¾Ã!¹WÃ;< Ñ ü pø"pq¿,CCJKw WÃ!Ê.)3 H & '²# WÃÒp¹ÞÝsÎÒ pW ,C¨&!rspqæç ,CJKwÛã¹!`¡Jó¿ÆÇ H2 Ûã÷A¹!æp0pø'|#ò)Ê ,Ce.~/WÃf -708--)9( f8 < #WKJKw! <. #pI! rsø'|N͹,C ! ¢SWÃ!rs ¹ x,CHOWÃ!¹;<U}(æçÓÔ)*+8 Öî! qó})#gtcÚ7#Ñ#ÕØ"| % 8 8[th..:i¦s ..: [;<)?ç bNëì! Ú7#Õ# 8$ {!L6$ #ÕØ×~2 4ÞÝì$p#Õ#hÔi£àN@ËÌ=0Ê$24#e $24I,C56Ú7 ;<=í»R! Ú7 \L4K33 "& t4f