基本原则之二:硬件原则 其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较 高,仅仅是说这个设计由硬件向HDL代码这种表现形式转换的更流畅、合理。而一个设计 的最终性能,在更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。 初学者,特别是由软件转行的初学者,片面追求代码的整洁、简短,这是错误的,是与 评价HDL的标准背道而驰的!正确的编码方法是,首先要做到对所需实现的硬件电路"心有 成竹",对该部分硬件的结构与连接十分清晰,然后再用适当的HDL语句表达出来即可。 另外,Verilog作为一种HDL语言,是分层次的。比较重要的层次有:系统级 (System)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关 级(Switch)设计等。系统级和算法级与C语言更相似,可用的语法和表现形式也更丰富。自 RTL级以后,HDL语言的功能就越来越侧重于硬件电路的描述,可用的语法和表现形式的 局限性也越大。相比之下C语言与系统级和算法级Verilog描述更相近一些,而与RTL级, Gate级、Switch级描述从描述目标和表现形式上都有较大的差异。 例3.举例RTL级Verilog描述语法和C语言描述语法的一些区别。 简单的举例RTL级Verilog描述语法和C语言描述语法的一些区别。在C语言的描述 中,为了代码执行效率高,与表述简洁,经常用到如下所示的for循环语句: for(i=0;i<16:i++) DoSomething(); 但是在我们工作中,除了描述仿真测试激励(testbench)时,使用for循环语句外,极 少在RTL级编码中使用for循环。其原因是for循环会被综合器展开为所有变量情况的执行 语句,每个变量独立占用寄存器资源,每条执行语句并不能有效的复用硬件逻辑资源,造成 巨大的资源浪费。在RTL硬件描述中,遇到类似算法,推荐的方式是先搞清楚设计的时序 要求,做一个rg型计数器,在每个时钟沿累加,并在每个时钟沿判断计数器情况,做相应 的处理,如果能复用的处理模块,尽量复用,即使所有操作都不能复用,也采用cs语句 展开处理。如下所示: reg [3:0]counter; always (posedge clk) if (syn_rst) counter <4'b0; else counter <counter+1; always (posedge clk) begin case (counter) 4'b0000: 4b0001: default: 11
fcWÃ|Tk-xÈ.T" §$;.y!¯$ =/Ú·ç >>#($ |T =/Ñ|ùPÕ!Þ$ -)&Ø[s RØÙtL|TWÃ;_`CzPÕ! ÅÌ¡N#TÅÌ.Ý¿=/ìÓ##: ¯ ¨±Þa~/;<#q80rtóWÃ|Tk>N ã>rÇ|T\L:å ]^eQ¡þ ¢|}£,! ñ¤2 : ×Ñ #¥G!æçý¥GNfí»¦ ?!@0<¦?: 9@JKw§¦?@lm¦?:@¦?@k¨¦ ¦?;9@ !í»¦"0<¦: ¥,<"|Ãõ©ª!X ¦CQ ^-²«}«¬ýs|Tkc,<"|à ®õ«&!¥æ÷e :í»¦"0<¦ 2 : c¥¯9Þ: ¦ ¦;9 ¦cc7¨"|ÃRNç&°±! 5# 2 : ÓÔ&' ¦ 2 : c<" c<9 N!) c 8×Ò=/²`:|cÓ³0et4 / ´µ¢f )0()7#()22' B).'( #)23R8¶Òc·¸¹º»¼x!7.9yÎ / ´µ¢¤° ô) ¦~/8Î / ´µ!f½# / ´µ¾¿OPwÀ¨×tNsqo² ¢t$sqÁºJKwnot²¢+-N` |TlmnoÃã Ä&noÅÆ!) |Tc8Ç0U0<ÈÉ;#Ê]Ë ¿8$ : V pw)t$ÌUB)t$ÌS pwo8¥Æ #ÕL- #ÕÍq £ÎtNR+- õ ! ¢ À¨#Õ!et4f .*!+,/ ( 34 ./' ) 3-' / 70=5( / 70/ 2( 34 ./' 5.) // ' =5+ =5+ CCCCCC +
第I章FPGA设计的指导性原则 endcase end 另外在C语句描述中有f.else和switch条件判断语句,其语法如下所示: if (flag) /1表示f1ag为真 else switch语句的基本格式是: switch (variable) case valuel break; case value2 break; default: break; 两者之间的区别主要在于switch是多分支选择语句,而if语句只有两个分支可供选 择。虽然可以用嵌套的f语句来实现多分支选择,但那样的程序冗长难读。 对应Verilog也有f..else语句和case语句,if语句的语法相似,case语句的语法如 下: case(var)】 var_valuel: var valuel: default: endcase 姑且不论casex和casez的作用(这两个语句的应用一定要小心,要注意是否可综合), case语句和if.clse嵌套描述结构就有很大的区别。在Verilog语法中,if..else if.,.clse语句 是有优先级的,一般来说第一个f的优先级最高,最后一个lse的优先级最低。如果描述 一个编码器,在Xilinx的XST综合参数就有一个关于优先级编码器硬件原语的选项Priority Encoder Extraction。而case语句是“平行”的结构,所有的case的条件和执行都没有“优 先级”。而建立优先级结构(优先级树)会消耗大量的组合逻辑,所以如果能够使用cas语 句的地方,尽量用case替换if.clse结构。 关于这点简单的引申两点:第一,也可以用f,f;的结构描述出不带优先级的“平 行”条件判断语。第二,随着现在综合工具的优化能力越来越强,大多数情况下可以将不必 要的优先级树优化掉。关于if和case语句的更详细的阐释,见后面关于Coding Style的讨 论。 12
" / ñ¤) ¢c8N /A! " !;9 ÂTS¢f<et4f ) .' E/ . FG D D ÏÐÑÒÓÔ ¢Õ#f )/E)5' 8 /E + D 5( /E + D 5( D + D 5( 9 §Ì÷A N)s !;9 # ÖCD¢Þ / ¢1N§$Ö,×C D!e,CØÙ / ¢}Wà ÖCD üØÚbÛ{! rÆ 2 : õN /A! ¢" ! ¢/ ¢<¥! ¢< ef /E' E-E + E-E + CCCCCC + / ÜÝ+´ !1 " !B x§$¢ÆÂJK#Þ,OPy ! ¢" /A! ØÙc\L²N& N!) 2 : <8/A!/A! ¢ #N¦}(?$ / ¦Q$ ! ¦ß!Lc $~/w) 0.1 0 OPQp²N$¦s¦~/w|TC6 3. 31 .!Þ ! ¢#h·i\LtN ! ÂT"²RàNh ¦i!ÞẦ\Lx¦ây¾jk&qûPlmtCL-Î ! ¢A;Íq ! ã¹ /###! \L! ¦säÓÔFå§äf?õ,C /###( /A(\Lc+æ¦h· iÂTS!?çö«Ã)OPRÀ[-è«}«ë& poe,CZ+é ¦â[ê!¦s / " ! ¢ëìíîïQ.¦s .: ³ ´!
基本原则之三:系统原则 1.3基本原则之三:系统原则 系统原则包含两个层次的含义:更高层面上看,是一个硬件系统,一块单板如何进行模 块花费与任务分配,什么样的算法和功能适合放在PGA里面实现,什么样的算法和功能 适合放在DSP、CPU里面实现,以及FPGA的规模估算数据接口设计等:具体到FPGA设 计就要求对设计的全局有个宏观上的合理安排,比如时钟域,模块复用,约束,面积,速度 等问题。要知道在系统上复用模块节省的面积远比在代码上小打小闹来的实惠得多。 一般来说实时性要求高、频率快的功能模块适合使用FPGA/CPLD实现。而FPGA和 CPLD相比,更适合实现规模较大、频率较高、寄存器资源使用较多的设计。使用 FPGA/CPLD设计时,应该对芯片内部的各种底层硬件资源,和可用的设计资源有一个较深 刻的认识。比如FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富一些,这 点直接影响着两者使用的编码风格。FPGA/CPLD一般是由底层可编程硬件单元、Block RAM资源、布线资源、可配置IO单元、时钟资源等构成。底层可编程硬件单元一般由触 发器(FF)和查找表(LUT)组成,Xilinx的底层可编程硬件资源叫SLICE,由2个FF和 2个LUT组成,Altera的底层可编程硬件资源叫LE,由1个FF和1个LUT组成,评估两 者芯片的可编程资源时需要注意这个区别。可配置IO单元,是FPGA/CPLD内部的一个重 要单元,通过在实现中配置相应选项,可用使IO单元适配不同的IO接口标准,不同的器 件可支持的IO标准不同,一些高端器件可以支持:LVTTL、LVCMOS、PCI、GTL、 GTLP HSTL、SSTL、LDT、LVDS、LVDSEXT、BLVDS、ULVDS、LVPECL、LVDCI等 多种IO标准,在通信领域应用是否便捷。布线资源用以连接不同硬件单元,根据用途不 同,布线资源的工艺、速度、驱动能力都不同。有全铜层的全局时钟布线资源,也有速度较 快,抖动时延很小的长线资源,普通的布线资源也分很多种。时钟资源主要指片内集成的一 些DLL或者PLL,用于完成时钟的高精度、低抖动的倍频、分频、移相等操作。目前, Xilinx芯片主要集成的是DLL,而Altera芯片集成的是PLL,他们各有优缺点,时钟控制 的功能复杂,而精度却非常高,一般在ps的数量级。Block RAM是FPGA的一个重要资 源,在片内集成RAM是FPGA的优势之一,高端FPGA的片内RAM规模越来越大,应用 也越来越广泛,是SOPC(可编程片上系统)的有力硬件支持。使用片内RAM可以实现单 口RAM、双口RAM、同步/异步FIFO、ROM、CAM等常用单元模块。目前FPGA的两个 重要发展与突破是,大多数厂商在其高端器件上都提供了片上的处理器(如CPU、DSP) 等硬核(Hard Core)或固化核(Fixed Core)。比如Xilinx的VirtexⅡPro芯片可以提供 Power PC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模块。 在FPGA上集成微处理器,使SOPC设计更加便利与强大。另一个发展是在不同器件商推 出的高端芯片上大都集成了高速串行收发器,一般能够达到3G/s以上的数据处理能力,在 Xilinx、Altera、Lattice都有相应的器件型号提供该功能。这些新功能是FPGA的数据吞吐 能力大幅度增强。 一般FPGA系统规划的简化流程如6所示。 13
í»Èɧ$¥GÉðf¥."#$|Tí»Ôñ* òÆ:óôEõ ü0<"^-¡Pö) g.WÃõ ü0<"^- ¡Pö) g.WÃCz Í@0på: ðÀ¾0 ²¿r FN$ !PÕ÷øæù ú.T '(!û)í» ü.Tæ)=/ÂýÂþ}W\ ! }(W¿-^-¡PÎ WÃ!Þ " ¥æ¡PWÃÍç&çJKwnoÎç !Î ÆÇrcÑ¥|Tno", noN$ç ßO!æ uvwnoæç©ªÞ ûPlmno©ª9 ääå«§ÌÎ~/Õ! #¥,~Ø|TÔ 4 no 7no,E 8 Ô no Lã!¥,~Ø|TÔ u vwxy"z{|x yûã0.1 ¥,~Ø|Tno 83 * $ " * $ ûã ¥,~Ø|Tno 3 " $ " " $ ûã¯@§ Ì,~ØnoóJK$ N!,E 8 Ô # c$ý Ô )WÃ8E¥ÆC6,Î 8 Ô ¡E+H 8 å:¨±+Hw T,Ö 8 ¨±+H99wT,CÖ f228 2 2 3042 2 232 8 Ñ 8 ¨±)@ùÆ#ÞM! 7noCå+H|TÔ + H 7noR -èR+H!NF¥F 7noõN ç -Âb7no 7noõ Ñ!nocã 9 ËÌ sÛãß_¥ !7Ê 0.1 ã# Þ ã# 3Nä ^- Þ%) ! pq¦!4 # $ýn o)cã # ÷9 c Í«}«&Æ õ«}« !# x,~Øí»yNè|TÖ !Îc ,CWÃÔ : ": H2±2 8 Ô !7Ê §$ ývÀ:##& p$,)f9wTR=×Ò#Õwx y |%x yË&[%x1 y!æ 0.1 2 1 88 ,C=× ; Þ 1317 í',C=× C! " ! ) ã(#ÕwÎ BMp:ë&!ñ$vÀ#)+HwT,È 9&RãÒ )vw-0 57! Cp#Õ-è) 0.1 RN¥ÆwTV*=×Ç^-!9+^-# pmn -è&ø,ë! í»Í-Ó[Ø - t4!
第I章FPGA设计的指导性原则 系统功能定义和逻辑功能划分 (包括端口定义、系统功能复用的考虑) ↓ 设计规模的初步预算 设计时序初步估算 (包括频率、时钟结构、可能的关键路径等) ↓ 芯片选型 (暂定) 逻辑模块的划分与模块间接口的定义 (模块划分应该遵循后面介绍的准则) 子模块A的设计 子模块B的设计 子模块C的设计 遵循FPGA的完整 遵循FPGA的完整 遵循FPGA的完松 设计流程 设计流程 设计流程 模块合并、仿真、测试 (包括完整系统的时序仿真和功能测试) 芯片定性、调试、转产 图16系统规划的简化流程 其中整设计的模块复用应该在系统功能定义后就初步考虑,并对模块的划分起指导性作 用。模块划分非常重要,除了关系到是否最大程度上发挥项目成员的协同设计能力,而且直 接决定着设计的综合、实现效果和相关的操作时间,模块划分的具体方法请参考第二章的 Coding Style中关于模块划分技巧的论述。 对于系统原则做一点引申,简单谈谈模块化设计方法。模块化设计是系统原则的一个很 好的体现,它不仅仅是一种设计工具,它更是一种设计思路、设计方法,它是是由顶向下、 模块划分、分工协作设计思路的集中体现。是当代大型复杂系统的推荐设计方法。目前很多 的EDA厂商都提高了模块化设计工具,如Xilinx ISE5.x系列中的“Modular Design'”工具 包。在“Modular Design”设计流程中,实现步骤的第一步,也是整个设计流程的最重要的 一步就是Initial Budgeting,Initial Budgeting就重复的体现了系统原则的设计理念,在该步 骤,设计管理者对设计的整体进行位置布局,并完成约束每个子模块的规模和区域,定位每 14
" !" #$ %&'()*+,- ./01 2 3 4356 3 789:;<=>?@ A3B 9:CDEBFG HI A3J 9:CDEBFG HI A3K 9:CDEBFG HI 3LMNOPQ FG !NOPQ ./RSQTU "- f8ì ÆÇ)í»^-ðQ²256r-G !-%ý¶Ò¦í0#Þ&Øv.67ã/0H -èÞÝä å« OPWÃ`L"¥¦A-À¾;<1Q5?çb .: 8¦s-´c! rsí»8äFåÓÔ22[ ;<![ #í»$ `¾Ãà+>>#Ñ RÀà#Ñ k ;<à##3e -R0 k8¾Ã!#þ=&V í»ÈÉ ;<!7Ê 3 $,R=Ò[ RÀ 0.1 83 6#1 í'8h !:.iRÀ È!)h !:.i Ø8WÃ24?2õ#ì$ Øý 2²# 8. 4:.:8. 4:.: ²ý ¾ÃÒí» Õ¶)Ç2 4 5ÕÌr ì¾ò Ûãút$aÍ" ùòt
基本原则之四:同步设计原则 个模块的输入输出,对设计进行全局时序约束等任务。 例4.在系统层次复用模块。 某公司在一篇专利中提到可编程匹配滤波器实现NCDMA基站的方案,就重复利用了 系统原则,提高单元模块的复用率,从而大大的降低硬件消耗。其简单功能框图7所示。 切换匹配状态 可编程 帧匹配滤波器 指示相关峰 S MF F MF 控 可更数所需匹配的指示序列 器 本地扩频、扰 选择扩频、扰码序列 码序列发生器 解扩、解扰输出 图1-7可编程匹配滤波器原理框图 其设计思想是:利用信道固有特点(如信道pilot导频,信道结构等),应用现代可编程 数字信号处理的技术(如DSP、FPGA等),采取反馈与控制匹配滤波方式,实现对某信道 的己扩信息的自动解扩解扰。该可编程MF的主要组成部分为以下四部分:本地码发生器、 可编程信号MF(SMF)、帧匹配滤波器(FRAME MF)和控制器。本地码发生器可生成各 种所需的扩频、加扰序列。可接收控制器的指示脉冲,产生规定的本地解扩、解扰序列,作 为SMF的参考序列:SMF是完成匹配滤波的主体,可接收控制器的指示脉冲,将自己的 匹配状态切换倒下一匹配状态:FMF完成对导频信号等特殊信号(信息比特待选集有限) 的检测,生成指示相关峰,通知控制器将SMF切换倒下一匹配状态:控制器统一协调各部 分工作。这种可编程滤波器可以在如越区切换、同步方面、CPCH收发信机等多方面应用, 如果适当安排时序流程,可以在较大的程度上节约硬件资源。 1.4基本原则之四:同步设计原则 采用同步时序设计是FPGA/CPLD设计的一个重要原则。简单比较一下异步电路和同步 电路的特点。 ·异步电路 ·电路的核心逻辑用组合逻辑电路实现。比如异步的FFO/RAM读写信号,地 址译码等电路。 15
!" $Ir Fú óô! ,# 645)78p8=0,~Ø9E:;wWà $ <;_²ý pÒ í»=Ô Þ&&=ß|Tjk!fÓÔ^-H3 % t4! "% f #fp&N¡äx \L yÆÃ=,~Ø p>*#Õ?x y[@:9E:;;WÃr6 ABCXÖBÖD!Ç,~Ø ûã×Ce1fA/vEw ,~Ø* x yF9E:;wx3 y"w!A/vEw,Eã ÑtóBBD'!,å)w4GáEÍAÖBÖD' × Q5'ð #Ûã9E:;¾,å)w4GZXY 9EH¤¹Ie9EHð Ûãr * ¡J*xCæ¡KCN®y L¹Eã4¥¦MûwZ ¤¹Ie9EHðw»0N R!Ñ,~Ø:;w,C)« ¤¹H2;. )vO ;.Æ L¡þ÷øØ,C)ç&Ø|Tno! H2 # $ý!ÓÔæçe±2k"H2 k¡ä! 8