[转载]对FPGA认识、学习和进阶
0赞
自从接触和认识FPGA以后,自由电子科技坚定的选择了FPGA器件作为我们创新和实现自身价值的承载平台,对此,我想从以下几个方面介绍一下。
1. 对FPGA的认识,为什么要选择FPGA
现在的FPGA器件在电子行业中是一颗明星,这是一种正在不断采用新的半导体制造工艺,逻辑容量不断增加,应用领域不断拓展,器件成本不断下降的器件,FPGA厂商激烈的竞争使开发软件和方法不断的进步,是一个正在盘古开天时期的事物。很多人对此的解释是FPGA拥有很大的灵活性,在半导体制造工艺的NRE不断增加、应用需求不断变更、品种要求多而数量要求少的现实情况下,FPGA是一个最佳选择,这正是现在FPGA厂商们宣传时耳目能详的陈词。我们认为,FPGA在电子产业和信息产业上的地位并不是这么简单。
实际上如果通过我们对计算机发展的历史、软件发展历史的认识,可以推断FPGA器件是一方向性的创新,几千年以前我国的祖先们感悟了蕴涵在简单的阴、阳中的事理有了太极,阴阳可以生万物。一百多年前的布尔代数使我们从数学上有了坚实的基础,从机械计算机到电子计算机的演变中,我们得到了冯.诺依曼型的程序存储类的计算机体系,并在当代发展为及至,极大的推动了人类社会的前进。冯.诺依曼计算机体系是在CPU硬件的基础上加上千变万化的软件,软件的灵活性使计算机渗透到各行各业,在20世纪后半页演绎了气势恢弘的发展过程,造就了象比尔.盖茨那样的天才和巨富。但我们要认识到在这个体系中,由一部分人从事低层硬件,CPU架构体系的设计,大部分应用工程师在相对固定的硬件系统上从事开发,这种模式在现在依然拥有无与伦比的活力和现实作用,在这里我提醒一点,在这个体系中,对大部分工程师来说,一半固定,硬件CPU是不可编程的,另一半灵活是可编程的(软件),很自然我们会想联想到如果两个部分都是可编程的那会是怎么一种情况呢?很好,现在有一种器件来了,这就是FPGA,它代表的就是硬件的编程。这两部分都可编程的一个结合点就是 FPGA上的软核,在Altera提供的开发环境中提供的SOPC环境就是如此,你可以象以往一样在生成硬件架构以后进行软件开发。但令人瞩目的是它可以随心所欲的定制外设,外设不再固定,更进一步它还支持增加自定义指令,从而改变CPU,在软件上可以用C2H把原来属于软件运行的指令变换成RTL逻辑来完成,极大的提高了效率,在这里要提醒的是,这样的事物才刚刚开始,是长江源头佗佗河上那不起眼的涓涓溪流,它正在发展,正在完善,从历史的眼光看,我们要有足够的耐心。
以上的文字就象是传教词一样令人心醉,这些还是从比较现实角度看待FPGA这个事物的,在比较长时期的学习和思考过程中,我还领悟到更深一个层次的含义,在说这个之前,容我介绍一种类型的应用,我们知道RAM型FPGA在不上电的时候,是一个半定制的ASIC,拥有基础的逻辑,而不拥有功能性逻辑,所有功能性逻辑是通过上电配置以后完成的,已经有工程师在设计产品的时候使用了这样的方案:把各种不同的电路功能编译成不同的配置文件,根据需要通过外部单片机把合适的应用bit流写入到FPGA内,从而完成根据功能需要变更硬件,这个需求很好理解吧。在软件领域可重构这个词出现的概率是非常多的,软件的发展也是往这个方向前进,c++,java支持下的接口、模板、对象重载等等,再到组件、COM,无一不用可重构这个概念。在FPGA领域,现在绝大部分器件只支持整体配置,也就是整体重构,如果能支持局部电路重构,那么上面我们叙述的应用就能够很自然的实现,而且切换速度会很快,实际上我们需要的是在接口不变的情况下切换速度要非常快,快的让逻辑自身也不知道底层硬件已经重构,就象没有变化一样。为什么我们这么重视电路可重构呢?一个原因是我们在软件发展的里程上看到的,我们可以在接口的支持下以相同的程序支持很大一类的应用。另一个原因我认为:人类信息科技发展的一个必然趋势。为什么这么说呢?需要从我们人本身身上认识开始,我们人类的大脑是亿万年来自然选择的结果,是宇宙中最精致的事物之一,是物质运动的最高形式(这有些象哲学家的说辞了),我们的大脑能形成条件反射,一个多次重复的思考过程,最后就形成的直接的通路,这种变化能让我们以最快的速度去适应和处理信息,我们对计算机的要求不也是这样嘛,可是,我们现在的计算机对多次重复的处理,能形成直接的通路吗?不能,一个计算,再怎么重复和有规律,现在的计算机只要程序不变,它永远重复,这就是人类能有直觉,而计算机不能的一个原因吧。说到这里,基于LUT查找表的FPGA倒是有些这个思想的雏形,对于一些逻辑计算,我们通过EDA软件的计算和优化,把输入和结果直接下载到LUT的RAM中,省略了电路逻辑处理过程,这也算是一个直接通路吧。我们要使计算机的能力越来越强,现在的一个方法是提高频率,这个方法很直接,可是现在材料和工艺在功率问题上的制肘已经使这个方法走到尽头了(热衷于提高频率的Intel不是也放弃了这个方法了嘛),于是新的方法是并行,用多核,Intel和Amd现在都在这个阵地上拼抢,说到并行,实际上fpga是一个很好并行处理平台,只要逻辑资源允许,它内部也可以构建n处理模块,n个软核cpu。这些方法中前一个方法是靠工艺取胜,后一个方法是靠体系取胜,体系取胜是最终的办法。人类大脑中的蛋白运算并没有如此高的频率,神经传导速度也比不上电路和光纤,但它的处理能力、容量和适应能力是惊人的。选择FPGA的一个直接原因是它的并行和灵活,但我认为更重要的应该是它的可重构上,特别是局部单元电路可重构的FPGA更能够做到象人类大脑中信息处理机制一样,也就是信息处理的过程中根据需要能够改变物理联系通道(即底层硬件电路),局部单元可重构的FPGA能带来体系结构上和实现算法上的革_命性创新。这样的FPGA和相应的算**在体系结构上取胜,能够在不远的将来构建软硬件更加协同的应用方案。这种类型的FPGA器件(或以其他名字命名的器件)必然会出现。数字信号处理应用是目前科技创新的一个前沿阵地,现在FPGA以其并行性和高DSP处理性能进入到信号处理领域。现代数字信号处理中,以往很多时候我们选择的都是带数字信号处理优化指令的CPU,象TI和ADI公司就拥有很多DSP芯片,在这些DSP芯片上实现算法处理,一般用C描述算法(关键处理用汇编),编译以后以机器指令的方式在DSP芯片上运行,在一个芯片上这样DSP处理单元是不多的,需要软件做不断重复的叠代运算从而高效利用这些DSP指令单元,重复的指令执行过程影响了DSP处理能力的提升,实际上一些DSP芯片集成了ARM处理器、DSP硬件运算加速器以后在性能上覆盖了大部分应用,在高端DSP处理领域FPGA的并行优势得到很好的体现,特别是FPGA在逻辑、DSP处理块、片上RAM规模越来越大的情况下,这个优势会更多展现出来。我们知道不管用什么途径实现,在现代计算机中的任务或算法实现最终都要在严格的时序状态机中完成,现代软件开发语言都是接近人类语言的方式描述处理过程,尽管有一定的节拍和步骤,但主要描述的是一个过程,而非严格按时钟节拍的处理过程,语言编译软件生成的指令和CPU硬件(或DSP处理器)已经为我们完成了这个从语言算法描述空间到硬件状态机处理空间的转换。FPGA DSP应用开发方面,尽管拥有性能优势,但如果用HDL语言去开发 DSP显的很局促,因为我们不能同时考虑算法的实现,又同时满足严格的状态机时序,所以用HDL直接写DSP处理模块这种开发模式不容易被广大的工程师接受,这就象CPU开发出来以后,用机器码或汇编去开发应用一样,计算机和软件发展的历史使大家可以相信,这个过程会很短暂,很快会有合适的开发工具来弥补这个空挡,目前math works公司的MatLab开发工具就是一个很好选择,拥有算法仿真到RTL CORE GENERATE,使得FPGA的 DSP应用开发流程得以完整的实现,各个FPGA厂商也提供了各自的MatLab simulink下的工具套件,比如Altea的 DSP Builder,xilinx的core generate和Xilinx AccelDSP,这些软件完成了算法描述到硬件状态逻辑处理机的转换。这种开发方式现在还处于初始阶段,软件工具、开发习惯等都需要我们有一个学习积累过程。
现在越来越多的模块被集成到FPGA芯片上,微处理器、高速收发器、以太网控制器、PCIE端点控制器、DSP处理单元、片内RAM等等,FPGA不再是一个单纯的编程逻辑器件,而是一个弹性很好的系统集成的平台,走出了IC原型验证的范畴。是一个很现实并且有前途的选择。
2. 学习和进阶
FPGA在电子开发工作中已经上升到数字系统核心处理器,尽快掌握FPGA开发技术显得非常迫切。我们来自五湖四海,为着一个共同的目标走到一起来了,我们中间可能有学生,学好一门技术追求好的发展,也可能已经是工程师,要寻求好的解决方案。
FPGA开发对学习者的要求相对是比较高的,我们上一节所说的,FPGA是一个可以实现软硬件协同设计的平台,即需要硬件也需要软件,而且软件开发也比较多,不同FPGA提供商提供各自的开发环境,还有第三方的软件工具。我们可以按下面的几个方面开始 HDL语言的学习VHDL和 Verilog HDL都可以,HDL语言是FPGA开发的基础,先掌握一门,以后根据需要去理解掌握另一门会比较方便,两门都会是最好的,因为提供有关代码资源的可能是你不熟悉的HDL,有时我们还需要把这个语言实现的翻译成另一个语言,以便在开发环境上统一实现。如果你有C语言基础,推荐学 Verilog HDL,因为语法上类似,需要注意的点是
a、Verilog是描述,而不是运行代码。代码综合以后是逻辑网表,而不是指令,所以需要注意我们写的代码是否正确描述了需要实现的逻辑电路。
b、除了逻辑功能,还要把描述中的时序给看出来,一开始的时候,可以根据代码尝试着把波形画出来,尽管仿真软件也能做到这个,还是建议自己画以加强对语言的理解,可以用仿真软件来验证你画的波形
c、注意区分哪些是可综合的,哪些是不可综合的代码,这个对出学Verilog的人会比较困惑,因为C只要语**确,可以编译就能运行,而Verilog一些代码只能在仿真环境中用,不能综合成实际的电路
d、要多关注描述代码综合后的电路,不能象C语言那样写好了就行,Verilog写好代码只能算做了一半工作,还要做仿真,如果时序不满足还可能调整程序代码。
e、多写多试,这个方法对学习任何事物都一样,如果有环境,即使没有老师指导照样可以试出来。
f、多看代码,特别是原厂提供的代码,这些代码应该代表了比较高的FPGA设计水平,从中我们可以学习两个方面的知识:一是相对比较大规模的逻辑设计如何组织模块结构,二是局部应用处理,可以照搬,作为我们开发时的模板。熟读唐诗三百首,不会作诗也会吟,看多了,就会习惯的学会他们的开发模式,我有这样的体会,看多了,很多东西思想上已经把它当作是自己的理所当然的东西了,实际一做,手生的很,遇到很多问题,解决这些问题,这个过程就通过了,学习就需要这么个过程
Modelsim仿真环境的使用?
学习HDL需要有一个编译、验证环境,首推的就是Modelsim,Modelsim在各家FPGA厂商的开发工具中都提供内置或外挂,这种共性的工具自然是越多越好。有很多数据介绍Modelsim的使用,网上有很多介绍资料,在此不在赘述。
选择合适的开发板,熟悉一种器件?
一款合适的开发板是学习进步的捷径。现在原厂和国内很多公司都提供FPGA学习开发板,可以根据需要选购。在使用开发板前可以先看安装使用说明,明确开发选用的芯片型号,以及外围配置,然后根据芯片型号去相关厂商公司下载该芯片的数据手册,详细阅读一遍很有好处,现在FPGA芯片更新换代比较快,一般2~3年就换一代,所以要适应英文资料的阅读,而且大量应用文档也是以英文形式提供的。
FPGA厂商主要开发软件工具的使用?
目前主要的FPGA厂商有Altera、xilinx、lattice都提供的了各自的FPGA开发环境,分别是:Altera的 Quartus II,Xilinx的ISE,Lattice的ispLever。我们可以选择先熟悉一家公司的环境(或者根据开发板的具体芯片选择厂商环境),以后根据器件选择需要,再去熟悉其他的环境,学习周期就可以短了。通用的步骤是:建立项目,设计输入(代码或原理图),功能仿真,引脚锁定和相关时钟约束,综合,功能仿真,影射、布局、布线,时序仿真等等。这个过程需要一段时间去熟悉。
如果你是单片机系统转过来学习软核系统的开发,也需要掌握这些工具,同时掌握厂商提供的系统集成工具和软件开发工具,Altera提供的集成环境是SOPC Builder,软件开发环境是NIOS II IDE。Xilinx提供的集成环境是Xilinx Platform Studio,软件开发环境是:Xilinx Platform Studio SDK。
分析和实现参考设计?
一般开发环境会自带example目录,这些都是典型的开发范例,强烈建议分析这些范例,并在自己的开发板环境中实现,这个过程可能需要我们修改一些设置和环境,比较硬件的不同,但这是一个很好的锻炼机会。另外开发板也会随板提供开发范例,分析这些范例,并常试修改他们也是很好的机会。遇到问题是很正常的,我们的进步就是建立在遇到问题并解决问题基础上的。
? 设计实现自己的应用系统
要明白一点,设计开发一个环境比使用一个环境要求要高很多,就象会使用计算机和会设计制造计算机一样的差别。特别是自己去设计一个系统的时候,建议学习者设计一个自己的系统,不论系统的大小。这样会遇到方方面面的需要考虑的问题,能够把上述学习的知识做一个考核,顺利通过后就会在知识和能力上得到及大的提升,特别是在开发信心上得到强化。建议把遇到或想到的问题都罗列记录在笔记本上,并尝试逐个排查解决,这个过程中我们可能需要阅读很多原厂提供的文档,或者网上搜索到的资料,把每一个疑问逐一解决,做到没有疑问,这样我们设计的系统就会顺利达到目标。
前不久我就实际体会了这个过程,我们以前都是使用Altera的FPGA器件,熟悉他们的工具也熟悉他们的器件,但客户需要我们开发 Virtext 5 PCIE系统,我们从4月份开始着手,到8月份完成样板,用了4个月,熟悉开发环境,并阅读了所有Virtex5的文档,很多测试代码,实际上在设计过程中已经写了并在ISE环境下编译,因为FPGA设计很重要的一点是规划pin和逻辑功能块在FPGA内的分配,所以需要在原理图设计过程中就做FPGA项目并在ISE软件中编译检查和验证,这样在PCB设计时原理图基本是可行的,同时在PCB设计中做好板级仿真,这样能减少了样板的反复修改,我们这样努力的结果是:一次投板成功。良好的开始是成功的一半,特别要在第一块板的设计制作过程中用尽心计,保证成功,确保我们开发工作的信心。
开卷有益,勤于实践,持续提高设计能力?
FPGA芯片技术和开发技术发展很快,学习任务重,另外罗马不是一天建成的,需要我们在工作中不断的积累。FPGA设计有点象围棋:易学难精。需要我们不断拓宽知识面,不厌其繁的去尝试,仔细去看编译综合报告,时序分析报告,并去尝试提升性能,从底层更深入的去理解硬件电路的设计,改进、尝试性能的提高。
很多单位有非常好的高级FPGA培训,这是个很好机会,可以和高手切磋技艺,咨询开发中遇到的问题和解决办法,这个很令人期待。但很多人可能象我所处的环境一样没有提供这样机会,我建议是开卷有益,多看书,现在FPGA方面的新书出来的比较多,一些开发高手,或多或少的在他们的介绍中提供了提高的途径,我都会仔细的阅读。另外网上有很多各个专题的文档也是很好的阅读对象。
带着问题学习是最有效率的,如果一些问题捆绕着我们,我们就会对这些问题的解决很关注,很多时候,不经意之间,我们所需要的信息来了:别人的一句话,资料上的一句提示,或者其他人开发的代码中等等,都会是我们提高的途径。
就象大型数据库性能调整一样,时序性能的调整提高是FPGA开发能力的标志,各个FPGA厂商都会提供很多解决方法,学习者要注意去逐步的学习使用这些方法。
只要不断的努力,一定可以持续提高我们的FPGA设计能力。
3. 目前的开发方法应用介绍
目前,在FPGA上有三种类型开发方法和应用方向:a、逻辑类应用 b、软核类应用 c、DSP类应用。
逻辑类应用我们接触的最早,也是FPGA最初的应用领域,大的应用上,一些数字IC设计可以在FPGA做前期的功能验证,在通信领域,FPGA做信号的编解码等等,小的应用上我们做的最多的实际是CPLD,完成信号的变换控制等等。
软核应用是前几年才兴起,现在热门的开发应用方法,在原本需要FPGA结合CPU的地方有成本和灵活性优势。
FPGA的DSP应用是非常有潜力的,性能优势非常明显。开发方法是用Matlab的simulink中嵌入厂商的开发工具包,算法验证在 Matlab simulink工具下完成,在开发工具包的支持下生成HDL模块或者直接生成FPGA下载配置文件,这个方向是FPGA应用最有挑战能力领域。Mathworks公司不久前也推出了独立于FPGA厂商的Simulink HDL Coder工具,使的Matlab在数字系统设计领域迈出了坚实的一步,把Simulink 模型和Stateflow框图生成位真(Bit-Ture)、周期精确(Cycle-Accurate)、可综合的 Verilog和VHDL代码,为Matlab simulink用户提供了通往FPGA设计实现的直接通道。