(转载) 如何学习 FPGA

Posted on 2014-04-07 16:16 in IC

学习 FPGA 差不多一年多,长期混迹于各大论坛,让我学习到了很多知识,转载一篇文章。

当年在对于 FPGA 什么都不懂的情况下,觉得这篇文章相当高大上,现在看来,的确如此~和别的入门级别的文章书籍相比,这篇文章没有涉及 FPGA 设计的细节,而是很精炼地讲了 FPGA 设计中最基本的 “ 世界观 ” 。也就是说这篇没有一头扎进 “ 术 ” 的内容中让读者无从读起,而是从整体上给出 FPGA 设计的 “ 道 ” 。对于初学者 —— 尤其是我这样从软件思维过渡过来的人,的确是不错的入门指导 。

转载地址:如何学习 FPGA?FPGA 学习必备的基础知识



FPGA 已成为现今的技术热点之一,无论学生还是工程师都希望跨进 FPGA 的大门。网络上各种开发板、培训班更是多如牛毛,仿佛在告诉你不懂 FPGA 你就 OUT 啦。那么我们要玩转 FPGA 必须具备哪些基础知识呢 ? 下面我们慢慢道来。

要了解什么是 FPGA


既然要玩转 FPGA,那我们首先最重要的当然是要了解什么 FPGA 。FPGA(Field-Programmable Gate Array),即现场可编程门阵列 。看到编程两个字码农就笑了,不就是编程嘛,那可是我们的强项 。且慢,此编程非彼编程 。一定要把 FPGA 的编程和软件编程区分开来 。软件的编程,处理器会逐条的把语言翻译成各种控制信号,去控制内部电路完成一个个运算或操作 。那么 FPGA 的编程是怎么实现的呢?无论 Altera 家还是 Xlinix 家的 FPGA,叫法有什么差异,基本单元都相似,都是由真值表和 D 触发器构成 。改变真值表的值就改变了逻辑功能,再通过和 D 触发器组合来实现任何时序逻辑 。所以我们对 FPGA 的编程,实际上就是去修改这些真值表和连接关系,使他们组成一张专门的真值表,去实现特定的功能 。这和软件编程一步步运行程序有本质的区别 。要想玩转 FPGA,就必须理解 FPGA 内部的工作原理,学习如何利用这些单元实现复杂的逻辑设计 。


正确理解 HDL 语言


HDL(Hardware Description Language),硬件描述语言 。通过名称我们能看出来,HDL 语言是一种 “ 描述 ” 语言,这一点和 C 语言是有本质区别的 。正确理解描述的含义,对学好 HDL 语言很有帮助 。HDL 语言只是用文本的方式把硬件电路描述出来 。我们在阅读 HDL 程序的时候,在脑子里应该能反映出一个完整的硬件电路结构 。从另一方面说,我们在编写 HDL 语言之前,就已经对要实现的电路有清晰的概念 。所以 HDL 语言只是一个描述我们头脑中具体电路的工具,玩转 FPGA 的根本不是语言而是逻辑电路设计。不要再纠结于我应该学习 VHDL 还是 Verilog,哪种语言更好学这些问题 。如果把学习 FPGA 的重点放在学习语言上,死记硬背一些语法,那自然是抓错了重点 。语言在日常使用中会越用越熟练,不需要花很长的专门时间去学习 。当然一本好的参考资料可以随时方便查询会是很有帮助的 。


数字电路基础


说到底,FPGA 就是一堆数字逻辑组合在一起实现特定功能而已 。所以数字电路基础知识是根本 。如果你连触发器,组合电路,时序电路,竞争,毛刺等等基本概念还莫能两可不清不楚的话,那玩转 FPGA 只能是痴人说梦的幻想了 。我们必须要好好的学好数字电路基础这门课,基本的数字电路烂熟于心 。把这些基础打牢固,再往更深的方向发展 。什么时候能够从抽象的算法中提炼算法的结构,再分解成具体的模块并通过硬件电路实现出来,这时候就算从菜鸟级别步入老鸟级别了 。


硬件设计思想


这一点应该说是重中之重 。学习 FPGA,一定要有硬件设计思想 。在软件编程的时候,比如 1 秒钟能实现 5 次乘法运算,那系统要求 1 秒钟实现 50 次乘法运算怎么办,我们会尽可能的优化代码,让代码更简洁更高效,或者提高系统主频,让系统跑的更快 。但是在 FPGA 里面我们不是这种思维方式。在 FPGA 里实现一个乘法器不够用,那我就实现两个实现三个去满足系统要求;我可以进行流水线设计;串行运行方式不够快了,我可以先串并转换,再并行的做处理 — — 只要 FPGA 的资源够用,我可以充分利用资源去满足系统要求 。因为在我手里的就是一堆硬件资源,我要做的是把他们组合成一个好用的电路 。评价硬件描述语言写的好坏的标准和其他软件编程语言的标准是完全不同的 。因此一定要摒弃软件编程的一些固有思路,学会用硬件的方式去解决问题 。时刻提醒自己正在设计的是一个电路,而不是一行行空洞的代码 。这是很多做软件编程的人很难跨过的坎 。FPGA 学了很久还在纠结到底是用 if-else 语句好呢还是用 case 语句好?而不能透过这些语句表面看到他们所具体代表的电路 。只有建立了硬件设计思想,才有更深入学习 FPGA 的可能 。


FPGA 入门简单精通难 。要想入门,买一块开发板跟着例程走一遍,很多人都能在很短的时间内熟悉开发软件的操作方法并且点亮开发板上的 LED 或者再实现个跑马灯什么的,但是再往后进步往往就进展很慢 。上面提到的这四条是玩转 FPGA 的基础,只有打好了坚实的基础后面才能一马平川 。希望每个学习 FPGA 的人最后都能成为大牛,设计出自己的完美电路 。