2013年6月6日,今天开始聊聊FPGA。
关于FPGA的缩写和得名之类的问题请直接百度,在这个知识爆炸的年代,有个万能的度娘真是我等小民之福啊。
先想聊下开始学习的准备,通过深刻的回忆,我追忆起了第一次接触FPGA的年代,大约是大学四年级昏暗的实验室,那一年,Altera的软件还是MAX+PLUSII,学习的教材还是原理图和ABEL,用的芯片不比GAL大多少,可能很多人都不知道(百度中…),但当时神奇的功能和替代无数74XX的神奇力量使得大家非常投入。大概一共学了3-4节课吧,老师也是摸着石头过河那种,和我们共同学习。
图 GAL器件和内部结构:简约而不简单
(第一要素)熟练掌握FPGA的第一要素是你要对数字电路有足够深刻的认识,对寄存器尤其是触发器以及各种“与或非”的组合逻辑关系清清楚楚,对状态图、真值表有所耳闻,因为FPGA的前辈们诞生之初就是用可编程的方式代替了2种门级电路:时序电路如573,逻辑电路如7404,7400等。
▲小贴士一:早期的CPLD和FPGA内部结构完全不一样。没有PLL,没有RAM资源,没有乘法器,最关键的是没有LUT查找表(具体请继续百度….),现在的Altera的MAXII,MAXV也好,XILINX的Spartan3AN以及Lattice的MXO系列都只是在FPGA的SRAM工艺基础上增加内置的FLASH,来模拟CPLD,降低成本,他们本质上还是FPGA,mini型FPGA。真正的CPLD现在还有Lattice的MACH4000系列(当年CPLD界的霸主)以及Xilinx的CoolRunner系列,其他的我也不熟。
图 正牌CPLD
FPGA里面有很多资源,因此建议想学的同学们不要用CPLD入门学习FPGA,因为很多FPGA特有的资源才是其魅力所在,乘法器、RAM、PLL、MAC,看着直流口水有木有……而且FPGA的价格也越来越亲民,这些东西在FPGA的内部达到了惊人的频率,一般都是300M以上的速度等级,工艺不同有所区别。
(第二要素)
熟练掌握FPGA的第二要素是你要掌握一门HDL语言,强烈建议要有C语言的基础,因为大学C是最容易学到的,那样Verilog你基本会用了,曾经的ABEL就像汇编一样偏向底层,渐渐被淘汰了,取而代之的是VHDL、Verilog。语法上VHDL较为严谨,Verilog偏向松散(人云亦云….),这句话的含义是写下一段VHDL你和综合器一般都清楚知道你们的共同目的,而Verilog的一段话则可能使你和综合器的意见发生分歧。顺便提一句,学什么都可以看你的兴趣,使用者国内Verilog稍多。而现在的软件都支持2种语言混编、混调、还有互转,所以不要纠结于学哪种语言了。下图不是描述的同一个东西仅仅是语言风格对比。
图 VHDL(左)和Verilog(右)语言风格对比
▲小贴士二:千万别学了2年FPGA还不知道综合,这会使你很没面子,请及早百度之。假定你熟悉C,可以用编译器来类比综合器,编译器是将高级语言C翻译成各种平台的汇编语言,而综合器就是把半高级语言Verilog或VHDL翻译成RTL门级网表,请注意这也是需要熟悉数字电路的原因之一,RTL才是你最终的期望值。如果你发现代码执行结果不对有时需要从RTL来查找问题,找出你和综合器之间的小分歧,这时数电知识就起了关键作用。
图 综合器吃下HDL之后吐出这货
(第三要素—仿真)仿真是指对FPGA实现的一种预先检验,不同于C语言软件仿真的是FPGA的仿真分为:行为级仿真、门级仿真和布局布线后仿真,或者叫做前仿真、后仿真(包含门级仿真和布局布线后仿真),以上是些教科书式的名词,初学者可以视而不见。
前仿真实际是检验HDL语言描述的功能是否是你的预期,这点很重要,很多初学者都倒在HDL描述不准确上,根本就不是所谓的“时序”问题。
后仿真才是将门级延迟和布线延迟加入仿真的解决所谓“时序”问题。有时FPGA的延迟超过你的想象太多太多,只不过你从未注意到。
常用的仿真软件有Mentor公司的ModelSim系列,Aldec公司的Active系列以及Xilinx、Altera等公司提供的一些集成在开发软件中的工具。其中Modelsim是当仁不让的市场第一的工具,近期貌似改名为Questa Modelsim,以一统Mentor公司的命名风格,打造统一品牌形象……广告就不多说了,众多的用户,极高的仿真速度以及稳定的内核是其重要特点。界面偏向Unix/Linux风格,支持命令行应用。
HDL语言中分为可综合和不可综合2种,在仿真中则都可以使用,和C不同的是HDL语言本身就为仿真做了很好的设计,因此仿真的重要性不言而喻,学习本开发板很重要的一点,请先安装ModelSim 6.5b版本。
图 ModelSim的界面风格
▲小贴士3:FPGA的“速度问题” 。一个标称450MHz的FPGA仅仅指内部的寄存器或者乘法器、RAM等单个资源的时钟频率能够达到。实际上即使一个很有经验的工程师用这样的器件搭建一个运行在200-300MHz之间的设计已经非常理想。因为级联门延时、线延时都是非常大的,除了优化算法结构外,为了达到更高的速率插入同步寄存器,增加流水级数必不可少,这样才能用资源换来速度的提升。对同功能的设计,速度和资源永远成反比。
(第四要素—时序)时序已经是FPGA的最后关卡了,虽然有时工程中你也会提前遇上他们。首先基本的时序信息分为时序约束和时序报告。时序约束是你告诉软件希望全部设计或者局部设计能跑到多快,时序报告是软件反馈你,现在的时钟频率能达到多快,以及影响时序关键路径(Critical Path)等等。当一个设计不设置时序约束时,软件会有一个默认的时钟约束例如1MHz。简单的说:建立就是CLK到来前DATA稳定时间,保持就是时钟到来后数据的保持时间,因为在现实中0时刻变化的陡峭时钟沿是没有的,对建立保持时间的讨论在FPGA时序发生紊乱时有一定作用,当然从时序报告中你已经可以清晰的看到时序问题所在,这里不对建立(Setup)、保持(Hold)时间再做详细讨论,因为具体的问题将在开发板的例程中展开具体讨论。很多人开始就把时序作为学习的要务这是错误的,因为,一个好的约束首先是学习然后是经验累积出来的,纯理论学习只会让你越来越糊涂。不知道该怎么去约束。
图 建立时间的简单示意
▲小贴士4:时序问题并不是啥深不可测的问题,并且如果不是因为机器速度问题的话使用后仿真完全能够发现在延时问题上的一些潜在问题,但前提是你的激励足够全面和准确;时序报告也会告诉你很多,但前提是约束加到点子上。不难看出,实际上时序问题的前提需要经验的积累,不需要直接学习奔跑,先学走再奔跑水到渠成。
下面会开始Espier FPGA开发板的教程更新,先聊到这儿。
[
本帖最后由 kdy 于 2013-6-28 23:18 编辑 ]