xcrabx

【赛灵思FPGA】【原创】FPGA开发流程的个人体会

0
阅读(5656)

【原创】【Xilinx主题季】FPGA开发流程的个人体会

弹指算来,学习和使用FPGA也有4年多了。最初采用的是Altera的片子,后来因为课题需要,一直到现在用的都是Xilinx的,主要是V5系列。回顾自己学习FPGA的经历,感觉这门工程技术和其他相比,还是复杂很多。下面就我这些年的体会,抛砖引玉,以供参考。个人主要基于Windows平台进行数字信号处理的FPGA实现工作。

首先说下学习的基础,主要是数电知识和英语。数电知识要求不高,掌握了基本概念即可,其他的完全可以需要时恶补下。英语则要求能有流畅阅读完整英文科技文献的能力,这个很重要,因为学习FPGA到达一定程度后,你会发现比较有参考价值的文献都是英文的。个人觉得目前最有价值的还是XILINX的官方文献和应用指南。

市面上FPGA的书籍很多,感谢网络这个载体,得以浏览很多FPGA的中文书籍,我一般比较推荐Xilinx大学计划推荐的那几本,适合做为入门教程。

这个流程图1涵盖了FPGA从设计到调试的整个流程,除了需要进行FPGA配置电路及pcb设计和FPGA嵌入式系统设计之外,这个流程也就是一个FPGA开发人员的基本工作。初学FPGA的同学有人带、有开发环境的话可以尝试下走一遍全部的流程以加深印象,没有条件的也应该记熟这个流程图。下面就图1的每个环节的一些要点做一说明,由于篇幅关系,涉及到的一些知识都可以通过网络搜索和阅读参考文献获得。如果有需要,以后也可以单独开文讨论。

图1 Xilinx FPGA设计流程图

  1. 设计输入和层次结构选择。

第一步是整个设计最重要的一步,可以说是影响了后面的方方面面。在设计输入之前,需要选择设计语言,设计工具等等。

设计语言推荐Verilog,选择其的原因是比较接近C,代码篇幅比较短,缺点是没有VHDL语言严谨。关于Verilog的书市面上比比皆是,语法之类的参考书籍或者直接看IEEE Std 1364-2001标准。掌握语法之外,一定要明白为什么叫硬件描述语言而不是硬件设计语言,分清可综合的和不可综合的语法规则。开始写代码的时候建议逐模块综合,看看自己写的代码对应的电路结构。如果没把握的话,建议看下Xilinx的xst.pdf,用上面的代码结构来完成自己的设计。在写代码过程中,要逐步形成并完善自己的代码风格,规避一些设计风险。代码风格可以看下motorola的设计指南,mentor公司的HDL designer代码检查的帮助文档或者Aldec的alint代码检查工具的文档。在写代码的时候,需要学习FPGA硬件内部结构,提高代码性能,保证代码能运行在较高的频率下。除此之外,需要掌握的小技能很多,如原语、IP核和代码推断的区别,同步设计和异步设计,速度和资源互换,流水线结构,串并转换,时钟设计,复位设计,异步时钟域之间的切换,接口设计等等。

开发模块可以是语言,可以是原理图,也可以是System Generator。一般推荐用语言完成整个设计,原理图及顶层用原理图都不建议。Sysgen一般是懂点算法又懂点FPGA的人验证算法,进行快速原型开发,主要用于数字信号处理上的。做数字信号处理FPGA实现的可以试试,我感觉验证性能比语言简单一点,但是需要固定软件版本,资源也不能做到最优化,某些模块没有ip核功能丰富。希望用的多的同学也介绍下经验。

顶层设计工具有ise、planahead和最新推出vivado这些选择,也有高手喜欢脱离GUI直接命令行。Ise目前用的最多,不过为了适应以后的发展,可以试试planahead和Vivado。由于Vivado只支持7系列,所以我最近在用planahead14.2,据说二者界面比较类似,容易过渡。

顶层设计是系统性工作,需要对算法结构和硬件结构进行综合考虑,进行时域划分,资源估计,接口分配等工作。根据不同项目的需求,反复讨论修改来定稿。

2 功能仿真

功能仿真也叫前仿,如何写仿真激励文件可以看看xilinx文档sim.pdf和xapp199,以及《Writing Testbench -Functional Verification of HDL Models》一书。建议采用多任务并行,每个任务产生一组关联信号用于激励。仿真工具modelsim为主流,Isim也可以,看个人习惯。一般对信号处理而言,需要完全仿真验证通过后,才能进行后续工作。在做顶层仿真或者模块联仿时可能速度较慢,可以采用vcd文件的方式进行加速。

3 添加设计约束

以前我有个错误的概念,一直以为约束就是综合后的时序约束、管脚约束和区域约束。最近发现综合约束也十分重要,会影响后续的结果。综合约束可以参考xst.pdf,cgd.pdf,在写代码时可以写入部分综合约束以指导综合工具,也可以加入综合时序要求来提高综合的性能。而管脚约束一般是根据硬件定义,时序约束和区域约束参考cgd.pdf和ug612-Timing Closure User Guide,特别是ug612,对时序的一些基本概念说的很清楚。

4. 综合和优化设计

综合工具一般用xilinx自带xst就够用了,Synplify据说优化的更好但玩玩落后与最新的xilinx软件版本。对于综合出来的结果网表,需要清楚影响因素不仅仅是代码,代码中的综合约束和综合选项的设置都会导致不同的结果。同样的代码可以通过不同的综合选项来满足不同的时序要求。Xst工具主要参考xst.pdf手册。建议每个模块写完都进行综合,并浏览下综合报告。

5.评估设计资源大小和性能

按照一般的流程,评估资源和性能应该在整个开发前完成,以免硬件不能完成指定的功能和性能。开发前评估一般可以确定系统的工作频率,需要的乘法器资源和RAM资源,逻辑资源则很难估计准确。综合后评估可以比较准确的获得各种资源的消耗,来确定是否进行优化调整还是进入布局布线阶段。

6.布局布线

影响布局布线结果是输入的网表,约束文件(ucf)和布局布线选项设置。一般建议用缺省选项运行一遍来看看工程的基本性能,查找时序关键路径。再通过设置时序优先或者面积优先来优化。可以通过Partition来保持部分模块的综合,布局布线结果。可以参考ug748-Hierarchical Design Methodology Guide。对于大的芯片,布局布线是一个花费数小时的过程,建议用主频高,内存大的计算机,并对map开启2线程,P&R开启4线程以加快工作。

7. 时序仿真和静态时序分析

这2个框放在一起的原因是我基本不做时序仿真。通过功能仿真和静态时序分析就开始调试了。静态时序分析的结果和第一步的代码风格关系很大,后面综合,布局布线的选项也有很大关系。对于占用资源较多、设计频率较高的设计,在优化代码无明显效果时,利用SmartXplorer来改变布局布线选项,特别是map cost初值,可能会得到较优的结果。根据实际经验,对于占芯片百分比比较高的设计,时序全部ok的不一定就一定功能正确,时序没完全过的功能没问题也有,建议多跑些版本,挑一些时序比较好的上板测试。

7. 产生比特流文件

这个好像没什么好说的,xilinx提供的比特流加密功能在生成选项中可选,要配合器件。

8 下载和调试

FPGA调试主要用自带的chipscope工具,是一件极其麻烦的事情。因为FPGA调试不像软件调试,可以随时观察任意信号的当前结果。FPGA调试只能保存指定信号的在一定条件下较短时间的值用于调试,所以,在调试前,就要做好规划,如何对模块进行分段结果验证对比,来迅速定位故障模块。由于布局布线时间较长,建议在非工作时间编译多个调试版本备用。一旦找到故障原因,建议在仿真中重现这一问题,重新修改并仿真来解决这个问题。建议参考chipscope使用手册,core inserter手册以及icon、ila和vio这些IP核手册。

以上是个人对xilinx FPGA的开发流程的一些体会,写的比较简略,其实很多小点都可以单独写文。经过这些年的学习和应用,个人觉得自己在时序约束方面还需要加强,特别是一些特殊路径的约束,也希望以后有机会用下嵌入式系统的开发,如micro blaze和zynq系列。借此安富利开展此次博文活动的机会,希望能和更多的高手结识,提高开发应用水平。

Baidu
map