任何一个硬件工程师对FPGA都不会陌生,就好比C语言对于软件工程师来说是必修课程一样,只要是电子相关专业的学生,都要学习可编程逻辑这门课程。FPGA的英文全称是Field Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。
从表象看,Programmable这个单词确实能够很好的描述FPGA的特点,但这也使得很多初学者走了不少弯路。一说到编程,大家不免联想到coding,因为软件编程的思想对工程师来说已经是根深蒂固了。因此,很多初学者都会问一个相同的问题,两种硬件编程语言VHDL和Verilog,应该学哪个?即使明确了要学习哪种设计语言,也会一头扎进浩瀚的语法中,走向歧途。有些初学者写了大量的代码,在Demo板上跑了n个试验,可还是觉得不懂FPGA,甚至搞不清楚它和单片机的区别。这是为什么?其实,这都归结一个原因,就是被“可编程”这3个字给迷惑了,也就是说,没有弄清楚FPGA的本质是什么。因此,对于FPGA的学习也就不着法门,事倍功半,浪费了不少时间,却仍然达不到效果。
FPGA是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。因此,从底层来看,FPGA还是属于集成电路的范畴。就当前的技术而言,使用FPGA开发项目还是全部基于数字电路设计的,所以,FPGA的“可编程”也就是实现不同的数字电路逻辑。这与所谓的软件编程有着本质的区别!归根结底,FPGA设计就是电路设计,因此,对于每个FPGA工程师来说,在做设计时必须在脑中有电路的模样,这很重要!那么,到底该如何有效地学习FPGA呢?其实,很简单,只要从以下7点着手,循序渐进,日积月累,就完全能够对FPGA设计游刃有余。
1. 首先,必须了解FPGA的结构和性能。不同厂家,不同系列的FPGA芯片都有不同的结构和性能,但是万变不离其中。刚开始,从掌握几款典型的高端芯片开始,例如Altera公司的Stratix III和Xilinx公司的Virtex 5。之后,再去了解其它系列的芯片就很容易了。至于Lattice和Actel公司的芯片,当使用时再了解也不迟,因为学习主流的东西才会更加有效!许多有关FPGA的教科书都会以几款常用的芯片为例,讲述FPGA的基本结构和原理。初学者看了后,总觉得过于抽象,有点不知所云的感觉。因此,为了深刻理解FPGA,必须要有扎实的数字电路基础!在数字电路里,最基本的就是逻辑和时序。工程师必须明白FPGA内部逻辑结构和数字电路基本电路结构的关系。例如,任何4个输入信号的组合逻辑都可以通过FPGA提供的4输入LUT来实现。如果使用Xilinx的芯片,移位寄存器既可以通过多个触发器级联实现,也可以通过LUT来实现。通常,初学者可以设计出正确的逻辑,但却很容易忽略时序。在I/O口的设计中,与时序相关的缺陷对于产品是致命的,会影响产品的可靠性。因此,在掌握了结构后,还必须关注芯片的一些重要时序参数,例如I/O口时钟的建立时间、保持时间和从触发器到输出的延迟时间,以及芯片内部工作时钟的最高频率等等。只有充分掌握了所使用芯片的结构和性能,才能设计出一个合理的系统,才能保证FPGA的设计可靠稳定。FPGA厂商提供的大量文档是一个不错的学习资料。
2. FPGA既然是“可编程”,自然离不开编程语言。其实,早期的工程师大多使用原理图输入方式进行逻辑设计,这是一种更接近于电路设计的设计方式。这种设计方式对设计者要求较高,而且也不利于移植和维护,因此VHDL和Verilog才渐渐流行起来。这两种语言,无所谓孰优孰劣,只不过Verilog发展的比VHDL好,而且和将来可能一统天下的SystemVerilog比较接轨。它们都是硬件描述语言。既然叫硬件描述语言,自然是和软件世界里的编程不一样,所以,初学者不能把它当作软件编程语言来学习,否则就会舍本逐末。如果仅仅只是从事FPGA逻辑设计和做简单的功能仿真,只需学习最简单的语法就够了。那些用于写验证脚本的语法,完全不用学,基本用不上。语言仅仅只是一个工具,尤其在硬件设计里,代码写得漂不漂亮,并不重要,最关键的是设计思想。记住,FPGA工程师是在设计电路,而不是在“编程”! |