【实用篇】FPGA工程师所需掌握的基本能力

作者:张杨波 来源:MYMINIEYE微信公众号

FPGA的起源和发展

1985年Xilinx发布了全球首款FPGA芯片——XC2064。在当时那个年代,PC机才刚走出硅谷的实验室进入商业市场,因特网还只是科学家和政府机构通信的神秘链路,无线电话还像砖头一样笨重。FPGA芯片在当时似乎并没有什么用武之地。

早期的FPGA芯片只是用于胶合逻辑,用来连接一些功能复杂的大逻辑块。不过,从胶合逻辑到算法逻辑再到数字信号处理、高速串行收发器和嵌入式处理器,FPGA已经从配角变成了主角。

FPGA在通信领域上有着极广泛的应用,就拿现在很火热的5G网络来说,几乎在5G基站里面的每一块电路板都需要用到FPGA;还有在机器人学习中,FPGA在感知计算的场景下,因为FPGA的硬件并行,所以能同时处理的指令数远远大于CPU,根据加州大学洛杉矶分校的实验结果,FPGA在感知计算场景下处理效率是CPU的30倍。以上两个都是现在十分热门的行业,都是十分需要FPGA的支持的。可以看出FPGA这个行业在现在还是很热门的。并且这个行业的人才缺口也很大,欢迎各位加入FPGA这个大家庭!

FPGA的结构

想成为一名FPGA工程师,对FPGA的结构是必须要掌握的。FPGA芯片主要是:可编程I/O单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块这六部分组成。

基本可编辑逻辑单元

基本可编辑逻辑单元是FPGA可编程逻辑的主体FPGA一般是基于SRAM工艺。其基本可编程逻辑单元几乎都是由查找表(LUT)和寄存器组成。FPGA内部的LUT一般为4输入、主要完成纯组合逻辑的功能。而内部寄存器结构相当灵活,可以配置为带同步、异步复位或置位、时钟使能的触发器,也可以配置为锁存器。FPGA一般依赖寄存器完成同步时序的逻辑设计。

比较经典的基本可编程逻辑单元的配置是一个寄存器和一个查找表。但不同厂商的寄存器和查找表的内部结构有一定差异,而且寄存器和查找表的组合模式也不同。主要的三个厂商的可编程逻辑结构为:

(1)Alerta的可编程逻辑单元通常被称为LE(Logic Element,逻辑单元),由一个Register和一个LUT组成。而Altera的大多数FPGA又将10个LE有机组合起来,构成更大的逻辑功能单元——逻辑阵列模块(LAB,Logic Array Block),LAB中除了LE还包含LE间的进位链、LAB控制信号、局部互连线资源、LUT级联链、寄存器级联链等连线和控制资源。

(2)Xilinx的可编程逻辑单元被称为Slice,由上下两部分组成。每部分都由一个Register和一个LUT组成,被称为LC(Logic Cell,逻辑单元),两个LC间有一些共用逻辑。可以完成LC之间的配合与级联。

(3)Lattice的可编程逻辑单元叫PFU(Programmable Function Unit,可编程功能单元),由8个LUT和8—9个Register组成。

可编程I\O单元

可编程I\O单元通过软件可以适配不同的电气标准和物理特性。

内嵌RAM块

FPGA的内嵌RAM块可以灵活配置为单端口RAM(SPRAM,Single PortRAM),双端口RAM(DPRAM,Double PortRAM),伪双端口RAM(Pseudo DPRAM),CAM(Content Addressable Memory),FIFO(First Input First Output)等常用存储器结构。

FPGA中没有专用的ROM硬件资源,实现ROM的思路是对RAM赋予初值,并保持该初值。

CAM,即内容地址存储器。CAM这种存储器在其每个存储单元都包含了一个内嵌的比较逻辑,写入CAM的数据会和其内部存储的每一个数据进行比较,并返回与端口相同的所有内部数据的地址。

总之,RAM是一种根据地址读、写数据的存储单元,而CAM返回的是与端口数据相匹配的内部地址。

FPGA内部实现RAM、ROM、CAM、FIFO等存储结构是基于内嵌RAM块的,并根据需求自动生成相应的粘合逻辑(GlueLogic)以完成地址和片选等控制逻辑。

Xilinx常见的RAM块大小是4Kbit和18Kbit两种结构,LatTIce常用的RAM块大小是9Kbit,Altera的RAM块最为灵活,一些高端器件内部同时含有两种RAM块结构,分别是M9KRAM(9Kbit),M-144K(144Kbit)。

除了RAM外,Altera、Xilinx和LatTIce的FPGA还可以灵活的将LUT配置成RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM。

丰富的布线资源

布线资源连通FPGA内部所有单元,连线的长度和工艺决定了信号在连线上的驱动能力和传输速度。有以下3种布线资源可以利用。

(1)全局性的专用布线资源:用来完成器件内部的全局时钟和全局复位\置位的布线。

(2)长线资源:完成器件Bank间的一些高速信号和一些第二全局时钟信号的布线。

(3)短线资源:完成基本逻辑单元之间的逻辑互联和布线。

在基本逻辑单元内部还存在各式各样的布线资源和专用时钟、复位等控制信号线。

底层嵌入功能单元

通用程度较高的嵌入功能模块,如PLL(Phase Locked Loop),DLL(Delay Locked Loop),DSP和CPU等。

Altera芯片集成是PLL,Xilinx芯片主要集成的是DLL,LatTlce的新型FPGA同时集成了PLL和DLL以适应不同需求。

Altera芯片的PLL模块分为增强型PLL和快速PLL。

Xilinx芯片的DLL的模块名称为CLKDLL,在高端FPGA中CLKDLL的增强型模块为DCM(Digital Clock Manager),数字时钟管理模块)。

内嵌专用硬核

内嵌专用硬核的通用性相对较弱,不是所有的FPGA器件都有硬核。

FPGA设计流程

讲完了FPGA的结构,接下来说说FPGA的设计流程。FPGA是可编程芯片,所以FPGA的设计方法包括硬件设计和软件设计两部分。

硬件包括FPGA的芯片电路、存储器、输入输出接口电路及其他设备,软件即是相应的HDL程序等。FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。

典型FPGA的开发流程一般包括包括功能定义/器件选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。

功能定义/器件选型

在FPGA设计项目开始之前,必须有系统功能的定义和模块的划分,另外就是要根据任务要求,如系统的功能和复杂度,对工作速度和器件本身的资源、成本、以及连线的可布性等方面进行权衡,选择合适的设计方案和合适的器件类型。

一般使用自顶向下的办法,把系统分成若干个基本单元,再把每个基本单元分为下一层次的基本单元,一直这样做下去,直到能直接用EDA元件库为止。

设计输入

设计输入是将所设计的系统或电路以开发软件要求的某种形式标示出来并且输给EDA工具的过程。

最常用的方法有硬件描述语言(HDL)和原理图输入方法等。原理图输入方式是一种最直接的描述方式,在可编程芯片发展的早期应用比较广泛,它将所需的器件从元件库中调出来,画出原理图。这种方法虽然直观并易于仿真,但效率很低,且不易维护,不利于模块构造和重用。更主要的缺点是可移植性差,当芯片升级后,所有的原理图都需要作一定的改动。

目前,在实际开发中应用最广的就是HDL语言输入法,利用文本描述设计,可以分为普通HDL和行为HDL。普通HDL有ABEL、CUR等,支持逻辑方程、真值表和状态机等表达方式,主要用于简单的小型设计。

而在中大型工程中,主要使用行为HDL,其主流语言是Verilog HDL和VHDL。这两种语言都是美国电气与电子工程师协会(IEEE)的标准,其共同的突出特点有:语言与芯片工艺无关,利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。

除了这IEEE标准语言外,还有厂商自己的语言。也可以用HDL为主,原理图为辅的混合设计方式,以发挥两者的各自特色。

功能定义/器件选型

功能仿真也称为前仿真。是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。

仿真前,要先利用波形编辑器和HDL等建立波形文件和测试向量(即将所关心的输入信号组合成序列),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。

如果发现错误,则返回设计修改逻辑设计。常用的工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS和Cadence公司的NC-Verilog以及NC-VHDL等软件。

功能定义/器件选型

所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。

就目前的层次来看,综合优化(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的门级电路。真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。为了能转换成标准的门级结构网表,HDL程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL级的HDL程序的综合是很成熟的技术,所有的综合器都可以支持到这一级别的综合。

常用的综合工具有Synplicity公司的Synplify / Synplify Pro软件以及各个FPGA厂家自己推出的综合开发工具。

综合后仿真

综合后仿真检查综合结果是否和原设计一致。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可以估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还是有一定的差距,并不十分准确。

目前的综合工具较为成熟,对于一般的设计可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合仿真后来确认问题所在。在功能仿真中介绍的软件工具一般都支持综合后仿真。

实现与布局布线

布局布线可以理解为利用实现工具把逻辑映射到目标器件结构的资源中,决定逻辑最佳的布局,选择逻辑与输入输出功能链接的布线通道进行连线,并产生相应文件;实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,布局布线是其中最重要的过程。

布局将逻辑网表中的硬件原语和底层单元合理的配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间做出选择。

布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。目前,FPGA结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件会自动生成标高提供有关设计中各部分资源的使用情况。

由于只有FPGA芯片生产厂商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。

功能定义/器件选型

时序仿真也称后仿真,是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。

时序仿真包含的延迟信息最全,也最精确,能较好的反映芯片的实际工作情况。由于芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。

因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。

板级仿真与验证

板级仿真主要应用于高速电路设计中,对高速系统的信号完整、电磁干扰等特征进行分析,一般都以第三方工具进行仿真和验证。

芯片编程与调试

设计的最后一步就是芯片编程与调试。芯片编程是指产生使用的数据文件(位数据流文件,Bitstream Generation),然后将编程数据下载到FPGA芯片中。其中,芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等方面。

逻辑分析仪(Logic Analyzer,LA)是FPGA设计的主要调试工具,但需要引出大量的测试管脚,而且LA价格昂贵。

目前,主流的FPGA芯片生产商都提供了内嵌的在线逻辑分析仪(如Xilinx ISE中的ChipScope、Altera Quartusll中的SignalTapll以及SignalProb)来解决上述矛盾,他们只需要占用芯片少量的逻辑资源,有很高的实用价值。

FPGA设计语言及平台

在了解了大概的FPGA设计流程之后,设计语言及平台也是FPGA工程师们必须掌握的东西。

FPGA用的是HDL语言,HDL的全称是:Hardware Description Language,注意其中D代表的是Description而不是Design。这说明了HDL语言不是用来设计硬件的,仅仅只是用来描述硬件的。

描述这个词精确的反映了HDL语言的本质,HDL语言是只不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来。

在学习HDL时首先要了解的是HDL的可综合性问题。硬件设计时分几个层次,每个层次都需要设计。最高层是算法级、向下依次是体系结构级、寄存器传输级、门级、物理版图级。

使用HDL的好处就是我们已经设计好了一个寄存器传输级的电路,那么用HDL描述以后转化为文本形式,剩下的向更低层转换的时候就可以交给EDA去做了,这就大大降低了工作量,这就是可综合的概念。也就是在这一层上对硬件单元进行描述可以被EDA工具理解并转化为更低层的电路。

在编写或阅读HDL语言,尤其是可综合的HDL,应该看到的是语言背后所对应的硬件电路结构。语法方面,HDL语法掌握贵在精,不在多。30%的基本HDL语句可以完成95%以上的电路设计,很多生僻语句不能被所有的综合软件支持,在程序移植或者更换平台时,容易产生兼容性问题,也不利于他人阅读和修改。建议多用心钻研常用语句,理解那些语句的含义。

HDL主要有VHDL和Verilog两种,目前最流行的是Verilog。

VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

Verilog就是在用用最广泛的C语言的基础上发展起来的一种件描述语言Verilog的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把Verilog内容安排在与ASIC设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路的经验。与之相比,VHDL的学习要困难一些。但Verilog HDL较自由的语法,也容易造成初学者犯一些错误,这一点要注意。

最新文章