Intel FPGA CPLD设计(高级篇)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-07 22:59:26

点击下载

作者:王江宏,蔡海宁,颜远,王诚,吴继华

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Intel FPGA CPLD设计(高级篇)

Intel FPGA CPLD设计(高级篇)试读:

内容提要

本书作者凭借多年工作经验,深入地讨论了Intel FPGA/CPLD的设计和优化技巧。在讨论FPGA/CPLD设计指导原则的基础上,介绍了Intel FPGA器件的高级应用;引领读者学习逻辑锁定设计工具,详细讨论了时序约束与静态时序分析的方法;针对市场应用需求,分别介绍了SoC FPGA和OpenCL系统应用技术;结合实例讨论如何进行设计优化,介绍了Intel的可编程器件的高级设计工具与系统级设计技巧。

本书所有实例的完整工程、源代码和使用说明文件,都以云存储的方式存放在云端,读者可以通过扫描二维码的方式进行下载。

本书可作为高等院校通信工程、电子工程、计算机、微电子与半导体等专业的教材,也可作为硬件工程师和IC工程师的实用工具书。序

Altera公司成立于1983年,后于2016年成为Intel公司可编程解决方案事业部(Programmable Solutions Group),总部位于硅谷。自从1984年发明世界上第一款可编程逻辑器件以来,一直为客户提供业界领先的定制逻辑解决方案。今天,分布在全球20多个地区的3000多名员工将为12000多家用户提供更巧妙的定制逻辑解决方案及广泛的技术支持,包括了FPGA、SoC、CPLD及电源管理产品等。

Intel的全系列定制逻辑解决方案解决了很多系统级难题,包括性能、功耗、总体拥有成本、电路板面积、产品及时面市和设计团队效能等。很多不同行业的业界领先公司都采用了Intel FPGA产品,包括数据中心、通信、汽车、广播、工业、医疗、军事、测试和测量、消费类等行业。

Intel公司可编程解决方案事业部的产品包括:● Stratix系列FPGA和SoC(支持实现性能最好的系统,用于数据

处理和算法加速);● Arria系列FPGA和SoC(以很低的功耗预算实现了高性能系

统);● Cyclone系列FPGA和SoC(以最低功耗实现了需要较高性能的大

批量应用系统);● MAX系列FPGA和CPLD(在大批量系统中实现了非易失、单芯

片集成);● Enpirion电源产品(为Intel FPGA、SoC和CPLD提供支持,在集

成产品中同时实现了高效、小外形封装、低噪声性能);● 软件开发工具、IP、参考设计和开发套件(方便了Intel FPGA、

SoC和CPLD的开发,保证了极高的设计团队效能)。

随着最终市场需求的发展,用户产品越来越复杂,我们的定制逻辑容量也随之快速增长。结果,设计工程师没有足够的设计方法和知识来满足需求的增长。设计人员在采用最新定制逻辑解决方案及Intel FPGA前沿产品和技术时,可以充分利用我们在中国本地开发的参考材料和指南。

我非常荣幸地向您推荐《Intel FPGA/CPLD设计(基础篇)》和《Intel FPGA/CPLD设计(高级篇)》。与前面版本图书相比,本版对内容进行了更新以反映Intel最新FPGA器件和设计工具。这两本书不仅介绍了传统PLD技术和设计技巧,而且还大量阐述了目前业界流行的硬浮点DSP、片外高速存储器、HMC(Hybrid Memory Controller)、JESD204B和片上系统FPGA,以及Intel推出的适用于异构平台并通过FPGA做加速处理的OpenCL软件开发套件。

这两本书以独特的视角解释了设计方法,帮助您掌握高级PLD设计技巧,还介绍了Intel FPGA器件和Quartus II设计软件。这些书有丰富的设计实例,通过实际练习,能帮助您深入理解概念,养成良好的设计习惯。

希望您能够从这些优秀的书中受益,预祝您的可编程逻辑设计获得成功!庄秉翰副总裁亚太区可编程解决方案事业部Intel公司

关于本书

内容和特点

FPGA/CPLD、GPU和CPU被称为未来数字电路系统的3块基石,也是目前硬件设计研究的热点。与传统电路设计方法相比,FPGA/CPLD具有功能强大,开发过程投资小、周期短,可反复编程修改,保密性能好,开发工具智能化等特点,特别是随着电子工艺的不断改进,低成本FPGA/CPLD器件推陈出新,这一切促使FPGA/CPLD成为当今硬件设计的首选方式之一。可以说FPGA/CPLD设计技术是当今高级硬件工程师与IC工程师的必备技能。

我国可编程逻辑器件设计技术落后于国外,目前立足工程实践,系统地介绍最新FPGA/CPLD设计工具的中文书籍较为贫乏。在这种情况下,为了满足广大工科在校生了解业界流行的高效FPGA/CPLD设计技术的需要,提高硬件工程师与IC工程师的工程实践技巧,我们编写了《Altera FPGA/CPLD设计(基础篇)》和《Altera FPGA/CPLD设计(高级篇)》。这两本书出版以来,广受读者好评,但随着技术的不断发展,器件型号和软件版本的不断更新,原有图书的内容和知识体系已经不适应目前的读者需求,为此我们根据Intel(注: 原Altera已于2016年被Intel收购)推出的一系列新型FPGA,以及新版Quartus II软件的特性,对上述两本书进行了改版升级,升级后的书名为《Intel FPGA/CPLD设计(基础篇)》和《Intel FPGA/CPLD设计(高级篇)》。

升级后的图书涵盖了Intel主流FPGA/CPLD的硬件结构与特性,详尽地讨论了Quartus II与第三方EDA工具的设计方法,系统地阐述了Intel可编程逻辑设计优化技术。

本书共7章,各章内容简要介绍如下。● 第1章:探讨了可编程逻辑设计的基本原则和常用思想与技巧,

并详细地讨论了Intel推荐的FPGA Coding Style。● 第2章:分别介绍了Intel FPGA器件的时钟管理、硬浮点数字信

号处理、片外高速存储器、HMC、JESD204B、高速串行收发器

等高级硬件特性和IP的应用方法。● 第3章:重点介绍Intel SoC FPGA嵌入式设计基础。● 第4章:在介绍时序分析的基本概念与常用约束方法的基础上,

讨论了高级时序分析的技巧。● 第5章:介绍资源利用率优化、I/O时序优化、最高频率优化等设

计优化的实用技术,并讨论了如何使用DSE进行优化的方法。● 第6章:介绍Tcl脚本、DSP Builder、Intel FPGA OpenCL软件开

发套件等高级工具的使用方法。● 第7章:重点讨论了信号完整性、电源设计、功耗分析与热设计、

SERDES与高速系统设计等系统级设计技巧。

本书的主要特点介绍如下。● 全面系统:涵盖了Intel FPGA软、硬件设计技术,基础与高级设

计工具,全面系统地论述了Intel可编程设计技术。● 实用价值高:本书的作者都有丰富的FPGA/CPLD、嵌入式SoC

和OpenCL设计经验,本书立足于工程实践的需要,对工程设计

有显著的指导意义。● 内容新颖:本书的作者长期工作在可编程逻辑设计的最前沿,与

FPGA器件制造公司和EDA软件设计公司联系紧密,所以有幸能

够在第一时间内使用最新版本的FPGA/CPLD设计工具。书中涉

及的所有工具均根据较新资料撰写,使图书介绍的内容新颖。● 剖析深刻:书中对FPGA/CPLD设计的基本原理、方法有较为详

尽的论述,对各种设计工具的介绍并不局限于操作方法,而是结

合作者多年的工作经验与心得,从较深的层面对各个工具的特点

进行剖析。

读者对象

本书可作为高等院校通信工程、电子工程、计算机、微电子与半导体学等理工专业的教材,也可作为硬件工程师和IC工程师的实用工具书。

配套资源

配套资源中提供了书中所有示例的完整工程文件、设计源文件和说明文件(读者可扫描封面上的二维码进行下载)。

每个工程示例都包括了该工程的项目文件、源文件、报告文件和生成结果等文件,读者可以用Quartus II或相应的软件直接打开。设计源文件根据设计输入类型分为源代码或原理图等,请读者将设计源文件复制到计算机硬盘上,并按照书中的操作步骤自行操作练习。示例说明文件包含了示例的详细信息和操作指南。

本书约定

为了方便读者阅读,书中设计了4个小图标,它们代表的含义如下。行家指点:用于介绍使用经验和心得,或罗列重要的概念。注意事项:用于提醒读者应该注意的问题。多学一招:用于介绍实现同一功能的不同方法。操作实例:用于引出一个操作题目和相应的一组操作步骤。

全书的各章节分别由王江宏、蔡海宁、颜远、王诚和吴继华等作者执笔,全书由Intel公司可编程解决方案事业部(Programmable Solutions Group)资深现场应用工程师王江宏统一修改整理。

资深高速I/O技术专家蔡海宁先生、资深高速I/O技术应用工程师董凡辉先生、资深内存接口技术应用工程师何虎刚先生、资深数字信号处理技术应用工程师王欣先生,对全书新版章节进行了审校。Intel公司亚太区可编程解决方案事业部现场应用工程总监邓海涛先生、亚太区应用工程总监罗小锋先生、中国区大客户销售总监吕家龙先生、现场应用工程经理赵敏先生对本书提出了许多建设性意见,并给予作者多方面的帮助。在这里要特别感谢Intel公司亚太区可编程解决方案事业部副总裁庄秉翰先生在百忙之中亲自为本书撰写序言。感谢所有关心并支持本书的同仁佳友!

感谢您选择了本书,如果您对书中内容有任何困惑和建议,请与我们联系。

电子邮件:adeli.wang@intel.com(作者),liyongtao@ptpress.com.cn(责任编辑)。

如果您需要得到Intel更全面的服务与技术支持,请访问http://www.altera.com.cn。编者2017年5月

第1章 可编程逻辑设计指导原则

本章旨在探讨可编程逻辑设计的一些基本规律。FPGA/CPLD的设计规律与方法是一个非常大的课题,在此不可能面面俱到,希望通过本章提纲携领的粗浅介绍,引起读者的注意。如果大家能在日后的工作实践中不断积累,有意识地用FPGA/CPLD的基本设计原则、设计思想作为指导,将取得事半功倍的效果。

本章主要内容如下。● 可编程逻辑基本设计原则。● 可编程逻辑常用设计思想与技巧。● Altera推荐的Coding Style。

1.1 可编程逻辑基本设计原则

可编程逻辑设计有许多内在规律可循,总结并掌握这些规律对于较深刻地理解可编程逻辑设计技术非常重要。本章从FPGA/CPLD的基本概念出发,总结出4个基本设计原则,这些指导原则范畴非常广,希望读者不仅仅是学习它们,更重要的是理解它们,并在今后的工作实践中充实、完善它们。(1)面积和速度的平衡与互换原则。提出了FPGA/CPLD设计的两个基本目标,并探讨了这两个目标对立统一的矛盾关系。(2)硬件原则。重点在于提醒读者转化软件设计的思路,理解HDL语言设计的本质。(3)系统原则。希望读者能够通过从全局、整体上把握设计,从而提高设计质量,优化设计效果。(4)同步设计原则。设计时序稳定的基本要求,也是高速PLD设计的通用法则。1.1.1 面积和速度的平衡与互换原则

这里的“面积”是指一个设计所消耗FPGA/CPLD的逻辑资源数量:对于FPGA,可以用所消耗的触发器(FF)和查找表(LUT)来衡量;对于CPLD,常用宏单元(MC)衡量。用设计所占用的等价逻辑门数来衡量设计所消耗FPGA/CPLD的逻辑资源数量也是一种常见的衡量方式。“速度”指设计在芯片上稳定运行时所能够达到的最高频率,这个频率由设计的时序状况决定,与设计满足的时钟周期、PAD to PAD Time、Clock Setup Time、Clock Hold Time和Clock-to-Output Delay等众多时序特征量密切相关。面积(Area)和速度(Speed)这两个指标贯穿着FPGA/CPLD设计的始终,是设计质量评价的终极标准。这里我们就讨论一下设计中关于面积和速度的基本原则:面积和速度的平衡与互换。

面积和速度是一对对立统一的矛盾体。要求一个设计同时具备设计面积最小,运行频率最高,这是不现实的。科学的设计目标应该是在满足设计时序要求(包含对设计最高频率的要求)的前提下,占用最小的芯片面积,或者在所规定的面积下,使设计的时序余量更大,频率更高。这两种目标充分体现了面积和速度的平衡思想。关于面积和速度的要求,我们不应该简单地理解为工程师水平的提高和设计完美性的追求,而应该认识到它们是与产品的质量和成本直接相关的。如果设计的时序余量比较大,运行的频率比较高,则意味着设计的健壮性更强,整个系统的质量更有保证;另一方面,设计所消耗的面积更小,则意味着在单位芯片上实现的功能模块更多,需要的芯片数量更少,整个系统的成本也随之大幅度削减。

作为矛盾的两个组成部分,面积和速度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。

面积和速度的互换是FPGA/CPLD设计的一个重要思想。从理论上讲,一个设计如果时序余量较大,所能跑的频率远远高于设计要求,那么就能通过功能模块复用减少整个设计消耗的芯片面积,这就是用速度的优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。从宏观上看,整个芯片满足了处理速度的要求,这相当于用面积复制换取速度的提高。面积和速度互换的具体操作技巧很多,如“模块复用”“乒乓操作”“串并转换”等,需要大家在日后工作中不断积累。下面举例说明如何使用“速度换面积”和“面积换速度”。【例1-1】如何使用“速度的优势换取面积的节约”?

在WCDMA(宽带码分多址)系统中,使用到了快速哈达码(FHT)运算,如图1-1所示。图1-1 FHT原理图

FHT的单步算法如下。Out[2i]=In[2i]+In[2i+8];i=0-7;Out[2i+1]=In[2i+1]-In[2i+1+8];i=0-7

考虑流水线式数据处理的要求,最自然的设计方法就是设计不同端口宽度的4个单步FHT,并将这4个单步模块串联起来,从而完成数据流的流水线处理。该FHT实现方式的代码如下。  //该模块是FHT的顶层,调用4个不同端口宽度的单步FHT模块,完成整个FHT算法  modulefhtpart(Clk,Reset,FhtStarOne,FhtStarTwo,FhtStarThree,FhtStarFour,   I0,I1,I2,I3,I4,I5,I6,I7,I8,   I9,I10,I11,I12,I13,I14,I15,   Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,   Out9,Out10,Out11,Out12,Out13,Out14,Out15);  input Clk; //设计的主时钟  input Reset; //异步复位  input FhtStarOne,FhtStarTwo,FhtStarThree,FhtStarFour; //4 个单步算法的时序控制信号  input [11:0] I0,I1,I2,I3,I4,I5,I6,I7,I8;  input [11:0] I9,I10,I11,I12,I13,I14,I15; //FHT的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个输出    //第1次FHT单步运算的输出  wire [12:0] m0,m1,m2,m3,m4,m5,m6,m7,m8,m9;  wire [12:0] m10,m11,m12,m13,m14,m15;    //第2次FHT单步运算的输出  wire [13:0] mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,mm9;  wire [13:0] mm10,mm11,mm12,mm13,mm14,mm15;    //第3次FHT单步运算的输出  wire [14:0] mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,mmm9;  wire [14:0] mmm10,mmm11,mmm12,mmm13,mmm14,mmm15;    //第4次FHT单步运算的输出  wire [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,Out9;  wire [15:0] Out10,Out11,Out12,Out13,Out14,Out15;  //第1次FHT单步运算  fht_unit1 fht_unit1(Clk,Reset,FhtStarOne,   I0,I1,I2,I3,I4,I5,I6,I7,I8,   I9,I10,I11,I12,I13,I14,I15,   m0,m1,m2,m3,m4,m5,m6,m7,m8,   m9,m10,m11,m12,m13,m14,m15   );    //第2次FHT单步运算  fht_unit2 fht_unit2(Clk,Reset,FhtStarTwo,   m0,m1,m2,m3,m4,m5,m6,m7,m8,   m9,m10,m11,m12,m13,m14,m15,   mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,   mm9,mm10,mm11,mm12,mm13,mm14,mm15   );  //第3次FHT单步运算  fht_unit3 fht_unit3(Clk,Reset,FhtStarThree,   mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7,mm8,   mm9,mm10,mm11,mm12,mm13,mm14,mm15,   mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,   mmm9,mmm10,mmm11,mmm12,mmm13,mmm14,mmm15   );  //第4次FHT单步运算  fht_unit4 fht_unit4(Clk,Reset,FhtStarFour,   mmm0,mmm1,mmm2,mmm3,mmm4,mmm5,mmm6,mmm7,mmm8,   mmm9,mmm10,mmm11,mmm12,mmm13,mmm14,mmm15,   Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,   Out9,Out10,Out11,Out12,Out13,Out14,Out15   );  endmodule

单步FHT运算如下(仅仅举例第4步的模块)。  module fht_unit4(Clk,Reset,FhtStar,   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,   Out9,Out10,Out11,Out12,Out13,Out14,Out15   );    input Clk; //设计的主时钟  input Reset; //异步复位  input FhtStar; //单步FHT运算控制信号  input [14:0] In0,In1,In2,In3,In4,In5,In6,In7,In8,In9;  input [14:0] In10,In11,In12,In13,In14,In15; //单步FHT运算输入  output [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,Out9;  output [15:0] Out10,Out11,Out12,Out13,Out14,Out15; //单步FHT运算输出    //Single FHT calculation  reg [15:0] Out0,Out1,Out2,Out3,Out4,Out5;  reg [15:0] Out6,Out7,Out8,Out9,Out10,Out11;  reg [15:0] Out12,Out13,Out14,Out15;  //补码运算  wire [14:0] In8Co =~In8+1;  wire [14:0] In9Co =~In9+1;  wire [14:0] In10Co=~In10+1;  wire [14:0] In11Co=~In11+1;  wire [14:0] In12Co=~In12+1;  wire [14:0] In13Co=~In13+1;  wire [14:0] In14Co=~In14+1;  wire [14:0] In15Co=~In15+1;    always @(posedge Clk or negedge Reset)  begin   if(!Reset)   begin   Out0<=0;Out1<=0;Out2<=0;Out3<=0;   Out4<=0;Out5<=0;Out6<=0;Out7<=0;   Out8<=0;Out9<=0;Out10<=0;Out11<=0;   Out12<=0;Out13<=0;Out14<=0;Out15<=0;   end   else   begin   if(FhtStar)   begin   Out0<={In0[14],In0 }+{In8[14],In8 };   Out1<={In0[14],In0 }+{In8Co[14],In8Co };   Out2<={In1[14],In1 }+{In9[14],In9 };   Out3<={In1[14],In1 }+{In9Co[14],In9Co };   Out4<={In2[14],In2 }+{In10[14],In10 };   Out5<={In2[14],In2 }+{In10Co[14],In10Co };   Out6<={In3[14],In3 }+{In11[14],In11 };   Out7<={In3[14],In3 }+{In11Co[14],In11Co };   Out8<={In4[14],In4 }+{In12[14],In12 };   Out9<={In4[14],In4 }+{In12Co[14],In12Co };   Out10<={In5[14],In5 }+{In13[14],In13 };   Out11<={In5[14],In5 }+{In13Co[14],In13Co };   Out12<={In6[14],In6 }+{In14[14],In14 };   Out13<={In6[14],In6 }+{In14Co[14],In14Co };   Out14<={In7[14],In7 }+{In15[14],In15 };   Out15<={In7[14],In7 }+{In15Co[14],In15Co };   end   end  end  endmodule

评估一下系统的流水线时间余量后,发现整个流水线有16个时钟周期,而FHT模块的频率很高,加法本身仅仅消耗1个时钟周期,加上数据的选择和分配所消耗的时间,也完全能满足系统频率要求,所以将单步FHT运算复用4次,就能大幅度节约所消耗的资源。这种复用单步算法的FHT实现框图如图1-2所示。它由输入选择寄存、单步FHT运算模块、输出选择寄存和计数器构成。图1-2 FHT运算复用结构图

代码如下。  //复用单步算法的FHT运算模块  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,   Out9,Out10,Out11,Out12,Out13,Out14,Out15   );  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的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个输出    //FHT输出寄存信号  reg [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7;  reg [15:0] Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15;  //FHT的中间结果  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<= #1 3'b111;   else   begin   if(PreFhtStar)   Cnt3<= #1 3'b100;   else   Cnt3<= #1 Cnt3-1;   end  end  always @(posedge Clk or negedge Reset)  if (!Reset)   FhtEn<= #1 0;  else  begin   if (PreFhtStar)   FhtEn<= #1 1;   if (Cnt3==1)   FhtEn<= #1 0;  end    //补码运算,复制符号位   assign Temp0=(Cnt3==4)?{4{In0[11]},In0}:Out0;   assign Temp1=(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}:Out10;   assign Temp11=(Cnt3==4)?{4{In11[11]},In11}:Out11;   assign Temp12=(Cnt3==4)?{4{In12[11]},In12}:Out12;   assign Temp13=(Cnt3==4)?{4{In13[11]},In13}:Out13;   assign Temp14=(Cnt3==4)?{4{In14[11]},In14}:Out14;   assign Temp15=(Cnt3==4)?{4{In15[11]},In15}:Out15;    always @(posedge Clk or negedge Reset)  begin  if (!Reset)  begin   Out0<=0;Out1<=0;Out2<=0;Out3<=0;   Out4<=0;Out5<=0;Out6<=0;Out7<=0;   Out8<=0;Out9<=0;Out10<=0;Out11<=0;   Out12<=0;Out13<=0;Out14<=0;Out15<=0;  end  else  begin   if ((Cnt3<=4) && Cnt3>=0 && FhtEn)   begin   Out0[15:0]<= #1 Temp0[15:0]+Temp8[15:0];   Out1[15:0]<= #1 Temp0[15:0]-Temp8[15:0];   Out2[15:0]<= #1 Temp1[15:0]+Temp9[15:0];   Out3[15:0]<= #1 Temp1[15:0]-Temp9[15:0];   Out4[15:0]<= #1 Temp2[15:0]+Temp10[15:0];   Out5[15:0]<= #1 Temp2[15:0]-Temp10[15:0];   Out6[15:0]<= #1 Temp3[15:0]+Temp11[15:0];   Out7[15:0]<= #1 Temp3[15:0]-Temp11[15:0];   Out8[15:0]<= #1 Temp4[15:0]+Temp12[15:0];   Out9[15:0]<= #1 Temp4[15:0]-Temp12[15:0];   Out10[15:0]<= #1 Temp5[15:0]+Temp13[15:0];   Out11[15:0]<= #1 Temp5[15:0]-Temp13[15:0];   Out12[15:0]<= #1 Temp6[15:0]+Temp14[15:0];   Out13[15:0]<= #1 Temp6[15:0]-Temp14[15:0];   Out14[15:0]<= #1 Temp7[15:0]+Temp15[15:0];   Out15[15:0]<= #1 Temp7[15:0]-Temp15[15:0];   end    end  end  endmodule

为了便于对比两种实现方式的资源消耗,在Synplify Pro中对两种实现方法分别做了综合。两次综合选用的参数完全一致,出于仅仅考察设计所消耗的寄存器和逻辑资源,Enable“Disable I/O Insertion”选项,不插入IO,取消Synplify Pro中诸如“FSM Compiler”“FSM Explorer”“Resource Sharing”“Retiming”“Pipelining”等综合优化选项。两次综合的结果如图1-3和图1-4所示。图1-3 未采用复用方案的“fhtpart”模块综合所消耗的资源图1-4 采用复用方案的“wch_fht”模块综合所消耗的资源

通过对比可以清晰地观察到,采用复用实现方案所占面积约为原方案的1/4,而得到这个好处的代价是,完成整个FHT运算的周期为原来的4倍。这个例子通过运算周期的加长,换取了消耗芯片面积的减少,是前面所述的用频率换面积的一种体现。本例所述“频率换面积”的前提是FHT模块频率较高,运算周期的余量较大,采用4步复用后,仍然能够满足系统流水线设计的要求。如果流水线时序允许,FHT运算甚至可以采用1bit全串行方案实现,该方案所消耗的芯片面积资源更少。【例1-2】如何使用“面积复制换速度提高”?

举一个路由器设计的例子。假设输入数据流的速率是450Mbit/s,而FPGA上设计的数据处理模块的处理速度最大为150Mbit/s,由于处理模块的数据吞吐量满足不了要求,看来直接在FPGA上实现是一个“不可能完成的任务”。这种情况下,就应该利用“面积换速度”的思想,至少复制3个处理模块,首先将输入数据进行串并转换,然后利用这3个模块并行处理分配的数据,最后将处理结果“并串转换”,完成数据速率的要求。我们在整个处理模块的两端看,数据速率是450Mbit/s,而在FPGA的内部看,每个子模块处理的数据速率是150Mbit/s,其实整个数据的吞吐量的保障是依赖于3个子模块并行处理完成的,也就是说利用占用更多的芯片面积,实现了高速处理,通过“面积的复制换取处理速度的提高”的思想实现了设计。设计的示意框图如图1-5所示。图1-5 “面积换速度”示意图

上面仅仅是对“面积换速度”思想的一个简单的举例,其实具体操作过程中还涉及很多的方法和技巧,例如,对高速数据流进行串并转换,采用“乒乓操作”方法提高数据处理速率等,希望读者通过平时的应用进一步积累。1.1.2 硬件原则

硬件原则主要针对HDL代码编写而言。首先应该明确FPGA/CPLD、ASIC的逻辑设计所采用的硬件描述语言(HDL)同软件语言(如C、C++等)是有本质区别的。以Verilog语言为例,虽然Verilog很多语法规则和C语言相似,但是Verilog作为硬件描述语言,它的本质作用在于描述硬件。应该认识到Verilog是采用了C语言形式的硬件的抽象,它的最终实现结果是芯片内部的实际电路,所以评判一段HDL代码的优劣的最终标准是其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向HDL代码这种表现形式转换得更流畅、合理。而一个设计的最终性能,在更大程度上取决于设计工程师所构想的硬件实现方案的效率及合理性。

初学者,特别是由软件转行的初学者,片面追求代码的整洁、简短,这是错误的,是与评价HDL的标准背道而驰的。正确的编码方法是,首先要做到对所需实现的硬件电路“胸有成竹”,对该部分硬件的结构与连接十分清楚,然后用适当的HDL语句表达出来即可。

硬件原则的另外一个重要理解是“并行”和“串行”的概念。大家知道,一般来说硬件系统比软件系统速度快、实时性高,其中一个重要原因就是硬件系统中各个单元的运算是独立的,信号流是并行的。而C语言编译后,其机器指令在CPU的高速缓冲队列中基本是顺序执行的,即使有一些并行处理的技术,在一定程度上也是十分有限的。所以在写HDL代码的时候,应该充分理解硬件系统的并行处理特点,合理安排数据流的时序,提高整个设计的效率。

另外,Verilog作为一种HDL语言,对系统行为的建模方式是分层次的。比较重要的层次有系统(System)级、算法(Algorithm)级、寄存器传输(RTL)级、逻辑(Logic)级、门(Gate)级和电路开关(Switch)级等。系统级和算法级与C语言更相似,可用的语法和表现形式也更丰富。自RTL级以后,HDL语言的功能就越来越侧重于硬件电路的描述,可用的语法和表现形式的局限性也越大。相比之下,C语言与系统级和算法级Verilog描述更相近一些,而与RTL级、Gate级、Switch级描述从描述目标和表现形式上都有较大的差异。【例1-3】举例说明RTL级Verilog描述语法和C语言描述语法的区别。

在C语言的描述中,为了使代码执行效率高,表述简洁,经常用到下面的for循环语句。  for (i=0; i<16; i++)   DoSomething();

在实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环。其原因是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。在RTL硬件描述中,遇到类似算法,推荐的方式是先搞清楚设计的时序要求,做一个reg型计数器。在每个时钟沿累加,并在每个时钟沿判断计数器情况,做相应的处理,能复用的处理模块尽量复用,即使所有操作都不能复用,也采用case语句展开处理。代码如下。  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:   4'b0001:   ... ...   default:   endcase   end

另外,在C语句描述中有if…else和switch条件判断语句,其语法如下。  if (flag) // 表示flag为真  …  else  …

switch语句的基本格式如下。  switch (variable)  {  case value1 : …  break;  case value2 : …  break;   …   default : …  break;  }

两者之间的区别主要在于switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。

对应Verilog也有if…else语句和case语句,if语句的语法与C语言相似,case语句的语法如下。  case (var)   var_value1:   var_value1:   ... ...   default:  endcase

姑且不论casex和casez的作用(这两个语句的应用一定要小心,要注意是否可综合),case语句和if…else嵌套描述结构就有很大的区别。在Verilog语法中,if…else if…else语句是有优先级的,一般来说第一个if的优先级最高,最后一个else的优先级最低。如果描述一个编码器,在有些综合器的参数中就有关于优先级编码器硬件原语的选项Priority Encoder Extraction。而case语句是“平行”的结构,所有的case的条件和执行都没有“优先级”。而建立优先级结构(优先级树)会消耗大量的组合逻辑,所以能够使用case语句的地方尽量用case替换if...else结构。

关于这点简单地引申两点:第一,也可以用if...;if…;的结构描述出不带优先级的“平行”条件判断语;第二,随着现在综合工具的优化能力越来越强,大多数情况下可以将不必要的优先级树优化掉。关于if和case语句的更详细的阐释,见后面关于Coding Style的讨论。1.1.3 系统原则

系统原则包含两个层次的含义:从更高层面上看,是一个硬件系统,一块单板如何进行模块划分与任务分配,什么样的算法和功能适合放在传统FPGA里面实现,什么样的算法和功能适合放在DSP、CPU里面实现,或者在使用内嵌CPU和DSP Block的FPGA中如何划分软硬件功能,以及FPGA的规模估算数据接口设计等;具体到FPGA设计,就要求对设计的全局有个宏观上的合理安排,比如时钟域、模块复用、约束、面积和速度等问题。要知道在系统上复用模块节省的面积远比在代码上“小打小闹”来的实惠多。

一般来说,实时性要求高、频率快的功能模块适合使用FPGA/CPLD实现。而FPGA和CPLD相比,更适合实现规模较大、频率较高、寄存器资源使用较多的设计。使用FPGA/CPLD设计时,应该对芯片内部的各种底层硬件资源和可用的设计资源有一个较深刻的认识。比如FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富一些,这一点直接影响着两者使用的编码风格。

FPGA基本由可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核6部分组成。CPLD的结构相对比较简单,主要由可编程I/O单元、基本逻辑单元、布线池和其他辅助功能模块构成。把握系统原则就要求设计者根据设计类型与资源评估合理地完成器件选型,然后充分发挥所选器件的各个部分的最大性能,对器件整体上有个优化的组合与配置方案。(1)存储器资源的使用。

存储器资源使用的基本原则是根据设计中用到多少RAM或ROM,确定所选器件的嵌入式Block RAM的容量,并合理配置每块RAM的深度和宽度。特别值得一提的是,Altera的基于20nm工艺的Arria10 器件和基于28nm工艺的高端器件StratixV包含MLAB(640bit)和M20K(20kbit)RAM结构,而基于28nm工艺的中低端器件ArriaV和CycloneV包含MLAB(640bit)和M10K(10kbit)RAM结构。其中,MLAB适合做一些灵活的小块Buffer、FIFO、DPRAM、SPRAM、ROM等;M20K/M10K适用于一般的需求和做大块数据的缓冲区,如在通信的SDH/SONET传输领域,有一些900kbit的大数据包,用M20K/M10K实现其缓冲结构非常方便。不同大小的RAM结构灵活配置,不仅方便了用户,并可以达到最佳的Block RAM利用效率。对于Xilinx和Lattice器件的RAM应用,除了需要掌握其Block RAM的结构,还需注意Xilinx和Lattice FPGA中的LUT可以灵活配置成小的RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM(Distributed RAM),分布式RAM在实现多块、小容量存储结构时有一定的优势。(2)硬核的使用。《Intel FPGA/CPLD设计(基础篇)》第1章中提到未来FPGA的一个发展趋势是越来越多的FPGA产品将包含DSP或CPU等处理核,FPGA将由传统的硬件设计手段逐步过渡为系统级设计工具。例如,当前Altera的StratixV、ArriaV、CycloneV、Arria10等器件族内部集成了DSP Core,而且ArriaV SX系列和Arria10还集成了双核ARM CortexA9处理器。这就为系统设计和单板设计提供了新的解决方案,传统的软硬件联合设计方案中软件部分在某些适当的情况下可以使用内嵌DSP和CPU Block的FPGA取代通用DSP和FPGA,从而简化了单板设计难点,节约了单板面积,提高了单板可靠性。

必须强调的是,目前这类内嵌在FPGA之中的DSP或CPU处理模块的硬件主要由一些加、乘、快速进位链、Pipelining、Mux等结构组成,加上用逻辑资源和块RAM实现的软核部分并不具备传统DSP和CPU的各种译码机制、复杂的通信总线、灵活的中断和调度机制等硬件结构,所以还不是真正意义上的DSP或CPU。在对这类DSP或CPU Block应用时应该注意其结构特点,扬长避短,注意选择合适的应用场合。这种DSP或CPU Block比较适合应用于运算密集的FIR滤波器、编码解码、FFT(快速傅立叶变换)等操作。对于某些应用,通过在FPGA内部实现多个DSP或CPU运算单元并行运算,其工作效率可以达到传统DSP和CPU的几百倍。

FPGA内部嵌入CPU或DSP等处理器,使FPGA在一定程度上具备了实现软硬件联合系统的能力,FPGA正逐步成为SOPC(System On Programmable Chip)的高效设计平台。(3)串行收发器的使用。

很多高端FPGA内嵌了SERDES以完成高速串行信号的收发。SERDES是SERializer和DESerializer的英文缩写,即串行收发器,顾名思义,它由两部分构成:发端是串行发送单元SERializer,用高速时钟调制编码数据流;接收端为串行接收单元DESerializer,其主要作用是从数据流中恢复出时钟信号,并解调还原数据,根据其功能,接收单元还有一个名称叫时钟数据恢复器(CDR,Clock and Data Recovery)。

目前三大FPGA生产商Altera、Xilinx、Lattice的高端FPGA产品都包含有高速串行收发器的硬核,提供高达3Gbit/s的传输速率,并提供易于使用的设计软件和IP核,使高速传输电路的设计变得简便、可靠。当前Altera Arria10器件含有丰富的serdes硬核资源,片到片连接可以支持到28.03Gbit/s,而过背板连接可以支持到17.4Gbit/s。

SERDES技术的应用很好地解决了高速系统数据传输的瓶颈,节约了单板面积,提高了系统的稳定性,是高速系统设计的强有力支撑。SERDES在高速系统中的应用请参考后面章节“SERDES与高速系统设计”的论述。(4)其他结构的使用。

其他常用结构的使用大家应该都非常熟悉了,在此仅简单介绍。对于可编程I/O资源,需要根据系统要求合理配置。通常选择I/O的标准有功耗、传输距离、抗干扰性和EMI等。根据设计的速度要求,要合理选择器件的速度等级,并在设计中正确地分频不同速度等级的布线资源与时钟资源。需要提醒读者的是,选择高等级的器件和改善布线资源分配仅仅是提高芯片工作速度的辅助手段,设计速度主要由电路的整体结构、代码的Coding Style等因素决定。善用芯片内部的PLL或DLL资源完成时钟的分频、倍频、移相等操作不仅简化了设计,并且能有效地提高系统的精度和工作稳定性。《Intel FPGA/CPLD设计(基础篇)》第1章介绍了完整的FPGA/CPLD通用设计流程,这里我们强调一下FPGA系统的规划流程,FPGA系统规划的简化流程如图1-6所示。图1-6 系统规划的简化流程

对设计整体意义上的模块复用应该在系统功能定义后就初步考虑,并对模块的划分起指导性作用。模块划分非常重要,除了关系到是否最大程度上发挥项目成员的协同设计能力,而且直接决定着设计的综合、实现效果和相关的操作时间,模块划分的具体方法请参考本章1.3节“Altera推荐的Coding Style”中关于模块划分技巧的论述。

对于系统原则做一点引申,简单谈谈模块化设计方法。模块化设计是系统原则的一个很好的体现,它不仅仅是一种设计工具,它更是一种设计思路、设计方法,它是由顶向下、模块划分、分工协作设计思路的集中体现,是当代大型复杂系统的推荐设计方法。目前很多的EDA厂商都提高了模块化设计工具,如Altera Quartus II内嵌的LogicLock,Xilinx ISE的Modular Design工具等。通过这类工具划分每个模块的设计区域,然后单独设计和优化每个模块,最后将每个模块融合到顶层设计中,从而实现了团队协作、并行设计的模块化设计方法。LogicLock支持模块化设计流程、增量设计流程和团队设计流程等设计方法。合理地使用这些方法,能在最大程度上继承以往设计成果,并行分工协作,有效利用开发资源,缩短开发周期。【例1-4】在系统层次复用模块。

有些文章介绍利用“可编程匹配滤波器”实现WCDMA基站的方案,其核心是在合理规划系统的基础上,合理划分模块并安排操作时序,提高单元模块的复用率,从而大大降低硬件消耗,其设计思想是系统原则的集中体现。可编程匹配滤波器原理框图如图1-7所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载