欢迎大侠来到FPGA技术江湖新栏目今日说“法”,当然,在这里我们肯定不是去研究讨论法律法规知识,那我们讨论什么呢,在这里我们讨论的是产品研发以及技术学习时一些小细节小方法等,欢迎大家一起学习交流,有好的灵感以及文章随笔,欢迎投稿,投稿请标明笔名以及相关文章,投稿接收邮箱:1033788863@qq.com。今天带来的是“FPGA“可编程”的“魅惑””,话不多说,上货。
任何一名优秀的电子硬件工程师对 FPGA 都不会陌生,就好比 C语言对于软件工程师来说是必修课程一样,只要是电子相关专业的学生,都要学习数字电路及模拟电路基础相关课程,后续会接触可编程逻辑之类的课程,区别就是接触的深度不一样。当今社会,随着集成电路行业市场越来越大,人才缺口也在越来越大。此时,电子类相关专业的学生及爱好者如何成长为一名优秀的工程师也显得愈发重要,如何在专业学习及行业职业发展的道路上走的扎实,离不开牢固的根基,那么接下来,咱们就着 FPGA 的可编程性聊聊这类话题。也欢迎各位专业大佬及爱好者一起交流,共同进步。欢迎加入FPGA专业技术交流群、知识星球!(交流群QQ、微信双向选择)
FPGA的英文全称是Field Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。从表象看,Programmable这个单词确实能够很好的描述 FPGA 的特点,但这也使得很多初学者走了不少弯路。
一说到编程,大家不免联想到 coding,因为软件编程的思想对工程师来说已经是根深蒂固了。因此,很多初学者都会问一个相同的问题,两种硬件编程语言VHDL和Verilog HDL,应该学哪个?即使明确了要学习哪种设计语言,也会一头扎进浩瀚的语法中,走向歧途。有些初学者写了大量的代码,在Demo板上跑了n个试验,可还是觉得不懂 FPGA,甚至搞不清楚它和单片机的区别。
这是为什么?
其实,这都归结一个原因,就是被“可编程”这三个字给迷惑了,也就是说,没有弄清楚FPGA的本质是什么。因此,对于FPGA的学习也找不到门道,事倍功半,浪费了不少时间,却仍然达不到效果。
FPGA是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。因此,从底层来看,FPGA还是属于集成电路的范畴。就当前的技术而言,使用FPGA开发项目绝大多数甚至可以说是全部还是基于数字电路设计的,所以,FPGA 的“可编程”也就是实现不同的数字电路逻辑。这就是与软件编程有着本质的区别。
归根结底,FPGA 设计就是电路设计。因此,对于每个FPGA工程师来说,在做设计时必须在脑中有电路的模样,这很重要。有句话也可以形象理解“FPGA虐你千百遍,你还是要待ta如初恋”,那么,到底该如何有效地学习FPGA呢?其实,很简单,只要从以下六点着手,循序渐进,日积月累,就完全能够对FPGA设计游刃有余。
一、了解FPGA的结构和性能
首先,必须了解FPGA的结构和性能。不同厂家,不同系列的FPGA芯片都有不同的结构和性能,但是万变不离其中。刚开始,可以先上手低端芯片,例如Altera的Cyclone VI,然后可以掌握几款典型的高端芯片,例如Altera的Stratix III和Xilinx的Virtex 5。之后,再去了解其它系列的芯片就很容易了。至于Lattice和Actel公司的芯片,当使用时再了解也不迟,因为学习主流的东西才会更加有效。
很多FPGA的相关的教材都会以几款常用的芯片为例,讲述FPGA的基本结构和原理。初学者看了后,总觉得过于抽象,有点不知所云的感觉。因此,为了深刻理解 FPGA,必须要有扎实的数字电路基础。
在数字电路里,最基本的就是逻辑和时序。工程师必须明白 FPGA 内部逻辑结构和数字电路基本电路结构的关系。例如,任何4个输入信号的组合逻辑都可以通过FPGA 提供的4输入LUT来实现。如果使用Xilinx的芯片,移位寄存器既可以通过多个触发器级联实现,也可以通过LUT来实现。
通常,初学者可以设计出正确的逻辑,但却很容易忽略时序。在I/O口的设计中,与时序相关的缺陷对于产品是致命的,会影响产品的可靠性。因此,在掌握了结构后,还必须关注芯片的一些重要时序参数,例如I/O口时钟的建立时间、保持时间和从触发器到输出的延迟时间,以及芯片内部工作时钟的最高频率等等。
只有充分掌握了所使用芯片的结构和性能,才能设计出一个合理的系统,才能保证FPGA的设计可靠稳定。FPGA厂商提供的大量文档也是一个很不错的学习资料。毕竟后续参与项目开发是需要去了解及灵活使用产品手册的,提前熟悉也是很不错的。
二、“可编程”,硬件描述语言
FPGA既然是“可编程”,自然离不开编程语言。其实,早期的工程师大多使用原理图输入方式进行逻辑设计,这是一种更接近于电路设计的设计方式。这种设计方式对设计者要求较高,而且也不利于移植和维护,因此VHDL和Verilog HDL才渐渐流行起来。
就这两种语言,无所谓孰优孰劣,只不过就目前的企业研发而言,Verilog HDL的商业性发展的比 VHDL 好一些,而且和将来可能一统天下的 System Verilog 比较接轨。当然两者都掌握肯定是极好的,而且难度也不是很大。它们都是硬件描述语言,既然叫硬件描述语言,自然是和软件的编程不一样。所以,初学者不能把它当作软件编程语言来学习,否则就会舍本逐末。
如果仅仅只是从事FPGA逻辑设计和做简单的功能仿真,只需学习最简单的语法就够了。那些用于写验证脚本的语法,完全不用学,基本用不上。语言仅仅只是一个工具,尤其在硬件设计里,就语言来说,代码写得漂不漂亮,并不重要,最关键的是设计思想。记住,FPGA工程师是在设计电路,而不是“编程”。
对于硬件电路设计以及软件编程有什么区别,下面也简单的提几点。
硬件电路设计(硬件描述语言):
- 不是编程,设计的时候先有电路,然后用语言描述出来。
- 时序要求更严,需要考虑建立时间和保持时间,及随之而来的亚稳态。
- Coding style 会明显的影响电路性能。逻辑都一样,但是 DFF(D触发器) 的位置不一样,就可能导致时序不满足。
- 并行化。执行顺序不再是 CPU 的顺序执行,而是多个并行的流水线。比如快速傅立叶 FFT。比如路由器的 CAM,单次动作完成整表查表。
通用应用层软件编程:
- 软件汇编语言(Assembly Language),面向机器的程序设计语言。
- 主要关心逻辑和抽象,关心代码量大了之后复杂度可控。硬件资源较多,硬件性能差别较大,不需要针对特定资源设计。
- 逻辑分层较多,来源于抽象的性能损耗可以接受。甚至于现在很多主流语言构建在虚拟机和解释器上。
- 非实时。
- 不需要了解底层硬件原理。
三、算法重要性,理论可行性
很多工程师会谈到算法的重要性,认为必须懂得很多算法。
没错,好的算法对于设计来说犹如利器一般。可是,研究算法和如何实现算法是两个不同的概念,研究算法是在做数学题,实现算法才是工程师的职责。
这里并不是说FPGA工程师不用去研究算法,而是强调职责所在。在企业中做研发,你会发现稍微有些规模的公司,都会有定岗定责这么一说,所以上述问题可能就会有专门的算法工程师去搞定。小公司或者创业公司就不好说了,基本上都是打杂为主,干着自己的主业,还得带着其他岗位的副业,这很现实也很真实,哈哈哈。
不同的算法,我们对其原理的研究和理解的要求也是不同的。例如8B/10B编码,只要你懂得在哪里需要使用它就够了,现成的IP Core可以直接调用。但是,诸如FEC编解码这样的算法,则只有了解了基本原理后才可能懂得如何实现。
对于算法,FPGA工程师的重点就是在于“如何实现”。另外,算法之外,逻辑设计里常用的设计方法必须懂得,例如,乒乓操作、流水线设计和分时复用等等。还有常用的逻辑模块,如异步FIFO、状态机,这些其实都是数字电路里最基础的东西,但是对于初学者来说,在做FPGA设计时未必会正确的使用。
四、设计流程
FPGA设计必须有一个好的设计流程来支撑。代码写完后,花大量时间做完善的功能仿真和验证是很有必要的。可是一些工程师并不重视仿真和验证,而是迫不及待的上板调试。
碰到BUG后就在代码上修修补补,运气好的话,BUG表面上是解决了,可真正深层次的原因却未必发现,给产品留下了隐患。
一个好的设计流程要求大多数BUG在前期工作中必须解决掉,功能仿真和验证则是一个很有效也很重要的步骤。
除了仿真验证,综合和布线也必须重视,这要求我们必须仔细浏览编译报告和时序报告。因为,许多时序问题都能通过报告反映出来。有时候,一些工程师碰到时序问题,仅仅做时钟反相来调整数据和时钟的相位关系,或者修改综合和布线的参数,仍无法解决问题。
尤其是在用了高速时钟的设计里,大多数情况,我们只有修改代码里的逻辑才能满足设计的时序要求。这些也只有仔细分析了报告后,才能对症下葯。另外,对于大多数同步逻辑设计来说,时序仿真是没有必要的,这一步完全可以省略。
五、深度学习及广度学习
现阶段,FPGA发展的方向也可以理解企业中应用广泛的方向,大概以下几点,包括SOC,高速接口(高速I/O),数字信号处理(DSP),人工智能方向等。在有限的时间里,选择一个领域方向进行主攻是有必要的,只有明确了目标,才会更加投入。一句话总结就是,在专研深度的同时,也要拓展专业的广度。
SOC设计要求设计者对软件编程、CPU原理甚至是操作系统比较了解才行,因为SOC就是一个软硬件结合的系统。高速I/O设计则要求设计者掌握许多模拟电路的基本知识及一些常用的通信协议,例如:SDH、GbE、PCI-E等等。FPGA在DSP领域的使用是近几年兴起的一个发展方向。FPGA由于其内在的并行特性,能以很高的效率实现DSP算法中计算量较大的模块,非常适合视频和图像处理等对DSP性能要求越来越高的新兴应用,设计者需要掌握数字信号处理常用算法。
至于近几年很火热的人工智能方向,其实怎么说呢,个人接触的所谓的“人工智能”,还是噱头性太强,没有太大的实际意义的应用,尤其是实用性的应用感不是很强烈,倒是出现不少借着噱头赚钱的空壳企业。对于人工智能,硬件还是主要在于加速方向,这个还是可以很明显看出来的。毕竟硬件的加速方面,软件是没法比拟的,以上纯属个人观点,如有异议,当我没说,哈哈哈,不想辩论了。
这几个方向完全不同,切勿囫囵吞枣,一切通吃,“术业有专功”,资深的高级工程师也很难在多个方向都取得成就。当然,若能在一个领域有较深的研究,同时,对另外其他专业领域也有一定的了解,那就更好了。
当然,一个优秀的FPGA工程师,必须力争做到“一专多能”。所谓的“一专”当然是指在FPGA设计领域的专业深度,而“多能”则是要求工程师对其它专业领域也要有所了解和掌握。例如,对于设计一个SOC系统来说,C语言就必须学习,否则对于片上系统的架构就可能不合理。另外,对于设计高速I/O口的工程师来说,电路板原理设计和PCB设计则需要有所了解。只有掌握了预加重、均衡以及阻抗匹配等这些与模拟电路相关的概念,才可能在设计和调试中得心应手。
六、设计思想,设计方法
其实这一点应该紧接着第五点开始或者放在第五点之前,但是个人感觉这一点很重要,于是乎压个轴,纯属个人理解,仅供参考。
第六点,也会最后一点,也是最难的一点,这也是迈向高级工程师的关键,就是FPGA的设计需要一个好的系统架构方案和合理的模块化分。这有助于FPGA的调试和维护,也便于多人共同开发,尤其是在使用大规模FPGA时,这也就是常说的Top-Down设计方式。
把一个庞大的、复杂的设计化分成若干个小模块,而且层次要分明,不能扁平化,这需要设计者对设计必须有全面深刻的理解。一个杂乱无序的设计对于后期的维护是灾难性的,尤其是对于接手者来说,若要修改某个逻辑,可以说是苦不堪言。举个最简单的例子,如果你接触过很多的电子硬件工程师或者FPGA工程师,你会发现绝大多数工程师都很反感去看别人的代码,尽管有些代码很简单,如果有条理有标准,也许还是可以去减缓上述的感觉的。
从这一点看,初学者的问题都可以在这里找到答案。FPGA学什么?就是学习系统级的电路设计。所以,FPGA工程师的发展方向就是系统工程师,就可以说是综合能力的发展,职业发展。
以上六点若能有深刻理解,则就能看清FPGA的本质了。市场的瞬息变化,要求电子产品必须对市场具有高敏感性,产品从方案设计到市场投放的时间越来越短,FPGA在各个领域都功不可没。另外,在面对当今人工智能火热的时代,FPGA也起着不可或缺的作用。在当今时代,FPGA已经在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域,相信FPGA工程师也必将会有一个更加广阔的施展空间。
至于更多的相关了解,各位也可参考之前写的文章,下面也链接了几篇,可以作为参考,也欢迎各位一起交流,这里就不详细去说了,时间很宝贵,哈哈哈。
为什么你会觉得FPGA难学?
对比ARM、DSP,深入了解FPGA
FPGA几大厂商介绍,你知道的有哪些呢?
简谈FPGA研发设计相关规范(企业中初入职场很实用)