第I章FPGA设计的指导性原则 0ut14<={In7[14],In7}+{In15[14],In15}; 0ut15<={In7[14],In7}+{In15Co[14],In15Co}: end end end endmodule 当评估完系统的流水线时间余量后,发现整个流水线有16个时钟周期,而FHT模块的 频率很高,加法本身仅仅消耗1个时钟周期,加上数据的选择和分配所消耗时间,也能完全 满足频率要求,所以将单步FT运算复用4次,就能大幅度节约所消耗的资源。这种复用 单步算法的FHT实现框图如图2所示,由输入选择寄存、单步FHT模块、输出选择寄存、 计数器构成。 将T中间结果反馈 输 输 选 单步FHT 选 选择的 运算 HT中 4步FH 1/Q 寄 间结果 的结果 入 数据 存 存 计数器 系统轻制器 的控制信号 图1-2HT运算复用结构图 代码如下: //复用单步算法的EHT运算模块 module wch fht(Clk,Reset, PreFhtStar, In0,In1,In2,In3,In4,In5,In6,In7, In8,In9,In10,In11,In12,In13,In14,In15, Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8, 0ut9,0ut10,0ut11,0ut12,0ut13,0ut14,0ut15 ) input clk; //设计的主时钟 input Reset; /异步复位信号 input PreFhtStar; //FHT运算指示信号,和上级模块运算关联 input [11:0]In0,In1,In2,In3,In4,In5,In6,In7; input [11:0]In8,In9,In10,In11,In12,In13,In14,In15; //FHT 6
" 708$*,$928"*,"9( "708$*,$928"*,"9( þ¯@Ûí»Ú7AÏqQvÃì$Ú7N "- $Þ B<B>>jk " $BpCD"EtjkAõ-ÛF ¿tCZÔ2 0 , G²-&øtjkno!Ñ Ô20< WÃH33 * t4ICDJKÔ2 CDJK pwLã! "* =/ef + /- : !"#$ %& !" ! " # $ % & ! " '( ) ( ) ( $% ) :(+./$%012+34 ) *+, !"#$( ) *+,%& !"(
基本原则之一:面积和速度的平衡与互换 的16个输入 output [15:0]Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7; output [15:0]Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15;//FHT 16个输出 //EHT输出寄存信号 reg [15:0]Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7; reg[15:0]0ut8,0ut9,0ut10,0ut11,0ut12,0ut13,out14,0ut15; //EHT的中间结果 wire [15:0]Temp0,Temp1,Temp2,Temp3,Temp4,Temp5,Temp6,Temp7; wire [15:0]Temp8,Temp9,Temp10,Temp11,Temp12,Temp13,Temp14,Temp15; /FHT运算控制计数器,和前一级流水线模块配合 reg [2:0]Cnt3;//count from 0 to 4,when Reset Cnt3=7; reg FhtEn;//Enable fht culculate always @(posedge clk or negedge Reset) begin if (!Reset) Cnt3<=#13'b111; else begin if(PreFhtStar) Cnt3<=#13'b100: else cnt3<=#1Cnt3-1: end end always @(posedge clk or negedge Reset) if (!Reset) FhtEn<=#1 0; else begin if (PreFhtStar) FhtEn<=#11; if (Cnt3==1) FhtEn<=#1 0; end
# &' *"+, ! " # $( *"+, % & ! "( # &( &(56$% .*"+, ! " # $( .*"+, % & ! "( 789: )*"+, !"#$( )*"+,%& !"( +"#;<0=>2?@ABC .* +,!(/ !0$( .;(;5 / / 34 .. .' 5.) ) 6' !70<!=5( 5.) ) :' !70<!=5( !70<!>( 34 .. .' ) 6' ;70<( 5.) ) :' ;70<( ) !00' ;70<(
第I章FPGA设计的指导性原则 //补码运算,复制符号位 assign Temp0=(Cnt3==4)?(4(In0[11]},In0):Out0; assign Templ=(Cnt3==4)?(4(In1[11]),In1):Out1; assign Temp2=(Cnt3==4)?(4(In2[11]),In2):Out2; assign Temp3=(Cnt3==4)?(4{In3[11]),In3):Out3; assign Temp4=(Cnt3==4)?(4(In4[11]),In4):Out4; assign Temp5=(Cnt3==4)?(4{In5[11]),In5):Out5; assign Temp6=(Cnt3==4)?(4{In6[11]),In6):Out6; assign Temp7=(Cnt3==4)?(4(In7[11]},In7):Out7; assign Temp8=(Cnt3==4)?{4{In8[11]},In8):Out8; assign Temp9=(Cnt3==4)?(4{In9[11]},In9}:Out9; assign Temp10=(cnt3==4)?{4{In10[11]},In10}:0ut10: assign Temp11=(cnt3==4)?{4{In11[11]},In11}:0ut11; assign Temp12=(cnt3==4)?{4{In12[11]},In12}:0ut12: assign Temp13=(Cnt3==4)?{4{In13[11]},In13}:0ut13; assign Temp14=(cnt3==4)?{4{In14[11]},In14}:0ut14: assign Temp15=(Cnt3==4)?{4{In15[11]},In15}:0ut15; always @(posedge clk or negedge Reset) begin if (!Reset) begin 0ut0<=0;0ut1<=0:0ut2<=0;0ut3<=0: 0ut4<=0;0ut5<=0:0ut6<=0;0ut7<=0: 0ut8<=0:0ut9<-0:0ut10<=0;0ut11<=0: 0ut12<=0:0ut13<=0;0ut14<=0:0ut15<=0: end else begin if ((Cnt3<=4)&&Cnt3>=0&&FhtEn) begin 0ut0[15:0]<=#1Temp0[15:0]+Temp8[15:0]: 0ut1[15:0]<=#1Temp0[15:0]-Temp8[15:0]; 0ut2[15:0]<=#1Temp1[15:0]+Temp9[15:0]; 0ut3[15:0]<=#1Temp1[15:0]-Temp9[15:0]: 0ut4[15:0]<=#1Temp2[15:0]+Temp10[15:0]; 0ut5[15:0]<=#1Temp2[15:0]-Temp10[15:0]; 0ut6[15:0]<=#1Temp3[15:0]+Temp11[15:0]: 8
" ,-+#D% ).0!00'?88*,99+ ( ).0!00'?88*,99+ ( ). 0!00'?88 *,9 9+ ( ).!0!00'?88!*,9!9+ !( ).0!00'?88*,99+ ( )."0!00'?88"*,9"9+ "( ).#0!00'?88#*,9#9+ #( ).$0!00'?88$*,9$9+ $( ).%0!00'?88%*,9%9+ %( ).&0!00'?88&*,9&9+ &( ).0!00'?88*,99+ ( ).0!00'?88*,99+ ( ). 0!00'?88 *,9 9+ ( ).!0!00'?88!*,9!9+ !( ).0!00'?88*,99+ ( )."0!00'?88"*,9"9+ "( 34 .. .' 5.) ) 6' 5.) 70( 70( 70( !70( 70( "70( #70( $70( %70( &70( 70( 70( 70( !70( 70( "70( 5.) ) !70'@@!A0@@;' 5.) *"+,70<*"+,2%*"+,( *"+,70<*"+,>%*"+,( *"+,70<*"+,2&*"+,( !*"+,70<*"+,>&*"+,( *"+,70< *"+,2*"+,( "*"+,70< *"+,>*"+,( #*"+,70<!*"+,2*"+,(
基本原则之一:面积和速度的平衡与互换 0ut7[15:0]<-#1Temp3[15:0]-Temp11[15:0]: 0ut8[15:0]<=#1Temp4[15:0]+Temp12[15:0]: 0ut9[15:0]<-#1Temp4[15:0]-Temp12[15:0]: 0ut10[15:0]<=#1Temp5[15:0]+Temp13[15:0]; 0ut11[15:0]<=#1Temp5[15:0]-Temp13[15:0]: 0ut12[15:0]<=#1Temp6[15:0]+Temp14[15:0]; 0ut13[15:0]<=#1Temp6[15:0]-Temp14[15:0]; 0ut14[15:0]<=#1Temp7[15:0]+Temp15[15:0]: 0ut15[15:0]<=#1Temp7[15:0]-Temp15[15:0]: end end end endmodule 为了便于对比两种实现方式的资源消耗,我在Synplify Pro对两种实现方法分别做了综 合。两次综合选用的参数都完全一致,器件类型为:Xilinx Virtex-EXCV100E一6BG352, 出于仅仅考察设计所消耗的寄存器和逻辑资源,Enable“Disable I/O Insertion”选项,不插 入IO,取消Synplify Pro中诸如“FSM Compiler”、“FSM Explorer'”、“Resource Sharing”、 “Retiming”、“Pipelining'”等综合优化选项。两次综合的结果如图3,图4所示。 Log Parameter rev 2 fhtpart Part zcv100ebg352-6 fhtpart 1/0 primitives Not Available fhtpart 1/0 Register bits 0 fhtpart Register bits (Non I 928 (38%) fhtpart Total Luts 1328(550 夫复用的T实现方案古用的资源。取消了所有综 合优化选项,并“Disable-I/0 Insertion”。 图1-3未采样复用方案的“tpart'”模块综合所消耗的资源 Log Parameter uch fht Part zcv100ebg352-6 wch fht I/0 primitives Not Available wch fht 1/0 Register bits 0 wch_tht Kegister bits (Non I 263 (10M ch_fht Total Luts 392(16 复用的T实现方案占用的资源。取消了所有综 合优化选项,并 “Disable I/0 Insertion”。 图1-4采样复用方案的“wch fht'”模块综合所消耗的资源 通过对比可以清晰的观察到,采样复用实现方案所占面积约为原方案的1/4,而得到这 个好处的代价是:完成整个FHT运算的周期为原来的4倍。这个例子通过运算周期的加 9
$*"+,70<!*"+,>*"+,( %*"+,70<*"+,2 *"+,( &*"+,70<*"+,> *"+,( *"+,70<"*"+,2!*"+,( *"+,70<"*"+,>!*"+,( *"+,70<#*"+,2*"+,( !*"+,70<#*"+,>*"+,( *"+,70<$*"+,2"*"+,( "*"+,70<$*"+,>"*"+,( ×ÒMsræ§ÑWÃ;nojk2) ./ r§ÑWÃ;<N8ÒO P!§GOPCQpRÛFSwTUV×f0.12 1302"&&3 W-456* s>>5X tjkJKw"lmno3.7h !7 8 8.! .iC6+Y I 8[j ./ 8Zh ih 31 ih! 9 .:i h.:ih..:i OP[C6!§GOP\L3 53 , t4! "5 /9 ", ;9</9 ræ,C]^!X0ü WÃ;_t.T×;_ ",Þ\0 $`#=#fÛãì$ 0×} , _!$'a0B
第I章FPGA设计的指导性原则 长,换取了消耗芯片面积的减少,是前面所述的用频率换面积的一种体现。本例所述“频率 换面积”的前提是:FHT模块频率较高,运算周期的余量较大,采用4步复用后,仍然能 够满足系统流水线设计的要求。其实,如果流水线时序允许,FHT运算甚至可以采用1bt 全串行方案实现,该方案所消耗的芯片面积资源更少! 例2.如何使用“面积复制换速度提高”? 举一个路由器设计的一个例子。假设输入数据流的速率是450Mb/s,在而FPGA上设计 的数据处理模块的处理速度最大为150Mb/s,由于处理模块的数据吞吐量满足不了要求,看 起来直接在FPGA上实现是一个“impossible mission”。这种情况下,就应该利用“面积换 速度”的思想,至少复制3个处理模块,首先将输入数据进行串并转换,然后利用这三个模 块并行处理分配的数据,然后将处理结果“并串变换”,就完成数据速率的要求。我们在整 个处理模块的两端看,数据速率是45OM6/S,而在FPGA的内部看,每个子模块处理的数据 速率是150M6/s,其实整个数据的吞吐量的保障是依赖于3个子模块并行处理完成的,也就 是说利用了占用更多的芯片面积,实现了高速处理,通过“面积的复制换取处理速度的提 高”的思想实现了设计。设计的示意框图如图5所示。 150Mb/s 150Mb/s 的处理模块 串 450Mb/s 150Mb/s 串 转 150h/s 的处理模块 换 换 150Mb/s 150b/s 的处理模块 图1-5“面积换速度”示意图 上面仅仅是对“面积换速度”思想的一个简单的举例,其实具体操作过程中还涉及很多 的方法和技巧,例如,对高速数据流进行串并转换,采用“乒乓操作”方法提高数据处理速 率等。希望读者通过平时的应用进一步积累。 1.2基本原则之二:硬件原则 硬件原则主要针对HDL代码编写而言的。 首先应该明确FPGA/CPLD、ASIC的逻辑设计所采用的硬件描述语言(HDL)与同软 件语言(如C,C+等)是有本质区别的!以VerilogHDL语言为例(我们公司多数逻辑工 程师使用Verilog),虽然Verilog很多语法规则和C语言相似,但是Verilog作为硬件描述语 言,它的本质作用在于描述硬件!应该认识到Verilog是采用了C语言形式的硬件的抽象, 它的最终实现结果是芯片内部的实际电路。所以评判一段HDL代码的优劣的最终标准是: 10
" b¹[Òjk.Túô#Ê.tc¹.TѾÃ!'tch ¹.TiÊ=#f ç0Ïqç& , 2 Qde- í»Ú7 ¿!fWLÚ7gh 0ij,C "7 F;_WÃÇ;_tjk.Tnoôa *# &$kw $'a!l Ip # ,6&7!)Þ p#Õ#Õ &× "6&7!s#Õpmnq+Ò¿" G}äå) WÃ#$h!!7 !!.i!Ñoe²ÆÇph.T¹ ijô 5 $#ÕqZIp¹eQpr$ #ÕEpeQZ#Õ\Lhs¹i²Ûãp ¿!23)ì $#Õ§9"p # ,6&7!Þ) c"t$a#Õp # "6&7!fWì$pmnqîu#vws 5 $a#ÕÛãõ² #(pÒ .TWÃÒ #Õh.T ¹[#Õ = iWÃÒ ! 4KH33 6 t4! "6 !" .>>#rh.T¹ i$ÓÔ&'fWÀ¾Ø8xyz ;<"'r p¹hi;<=p#Õ !DE{Ì·Æ2TU! |T}r =/~Þ! qÆÇ) 8 lm t|Tcx y:H Tx == y#N® NaC 2 : ×'x2345 plmR ØÙÎ 2 :ye 2 : <Í" ¥# 2 : ×|Tc à®)sc|TaÆÇßO0 2 : #Ò |T àWÃ\L#cWk!tC¯ =/¨±#f