网络知识 娱乐 入行10年后,我总结了这份FPGA学习路线

入行10年后,我总结了这份FPGA学习路线

最近我收到很多同学的提问,让我介绍一下FPGA怎么学习、怎么进阶,有什么推荐的材料或者学习资源。

在给我留言和私信的朋友里,有在校的大学生,需要学FPGA做数电实验、参加竞赛、进实验室,或者只求水过这门课就可以。还有很多研究生或者博士生,想要用FPGA来进行算法加速,或者从事和FPGA相关的研究,但是有点不知道如何下手。此外还有很多想转专业的朋友,他们想把FPGA或者数字芯片设计作为未来的职业发展方向。所以我们可以看到,其实每个人的背景、学习的目的和方法、以及学习的时间和资源都不尽相同。

那么,有没有一个共通的学习路线,能够指引我们尽快入门FPGA学习呢?通过这几周的梳理,我发现不管我们的背景或者动机怎样,这个学习路线还是比较清晰的,而且很多内容的学习也是有很多的共通之处的。

在这篇文章里,我会主要介绍入门FPGA的学习路线。如果你刚刚开始学习FPGA,或者想要学习FPGA,那么这篇文章肯定会对你有所帮助。如果你已经学习一段时间了,那么这里介绍的学习路线应该会让你少走一些弯路。如果你是一个FPGA高手,也欢迎在评论里分享你的学习经验,说不定就能帮助很多希望学习这个内容的朋友们。

FPGA入门阶段的学习,知识点其实是最多也最杂的,很多人就是看到这部分要学这么多有的没的,就直接弃坑了。但是这个阶段其实非常重要,因为它会为你今后进阶打下坚实的基础。那么我们就来看看这个阶段到底有哪些内容。

总体来说,我把这个学习路线大致分成了四个部分,分别是:编程语言、基础知识、开发工具和动手实验。对于每个部分,我都会介绍和总结一些入门的时候应该掌握的知识点和套路,我也会介绍和推荐一些书籍和学习资料,希望能对你的学习有所帮助。

FPGA入门学习第一部分:硬件编程语言

FPGA的编程语言,是我们必须掌握的内容。和软件开发使用的C、C++、Java等“高级”语言不同,FPGA开发使用的语言叫硬件描述语言HDL,或者寄存器传输级语言RTL,下文中我们统称RTL。

对于初学者,这里我们先不讨论高层次综合的内容,也就是用C语言或者python编程FPGA。关于高层次综合的内容,可以看我之前的文章《高层次综合:解锁FPGA广泛应用的最后一块拼图》。但是至少从目前各个公司的FPGA岗位的需求来看,RTL的代码能力还是必须的。

主流的硬件描述语言有VHDL和Verilog,还有一个叫SystemVerilog。VHDL和Verilog各有优缺点,比如VHDL的语法更加严谨,Verilog更加灵活,比较像C语言。对比VHDL和Verilog谁好谁坏不是这篇文章的重点,入门的话建议先熟练掌握一个就可以。

从我个人的角度来看,推荐先学习Verilog,特别是如果你有一定的C语言基础,那么应该会比较好上手。等你积累一定开发经验之后,可以考虑再看一下VHDL。因为有可能在实际项目里,一些模块是Verilog写的,另外一些是VHDL写的。所以即使写的不溜,也最好能大概看懂用VHDL写的设计。

不管你学习什么语言,主要的学习内容都有三大部分,第一是语法,第二是如何用这个语言做电路设计,第三是如何用这个语言做验证

关于Verilog语法的书有无数本,但其实内容都大同小异,所以不用太纠结看哪本书,找一本评价好的就好。比较有名的有《Verilog数字系统设计教程》,或者《Verilog HDL高级数字设计》。但是不管你选哪本书,建议你花时间认真看一遍Verilog语法,不需要死记硬背,但应该对每条语法的基本用法和功能做到心中有数。

Verilog的语法,可以分为可综合(Synthesizable)和不可综合(Non-synthesizable)两部分。可综合就是指这部分语句可以生成对应的硬件电路。如果你的时间有限,一开始我们可以先看可以综合的Verilog语法,这个其实不多,常用的大概只有十来条语句。掌握之后我们再看用来主要用来写仿真和验证的那些不可综合的Verilog语句。

配合Verilog的学习,我强烈推荐一个刷题的网站,叫HDLBits。这里面有很多由浅入深的基础性的练习,非常适合初学者学习,强烈建议大家把这里面的题目做一遍。从做题的角度来看,其实学习Verilog和学习Python、C++或者Java等高级语言没什么区别,都需要代码量的积累,以提升熟练度。所以如果你学习的时间特别有限,可以先做这里的题目,遇到知识点之后,再去反查你的Verilog书,这样通过实践来学习。

使用RTL进行逻辑设计,主要有组合电路和时序电路两部分。组合电路里包括各种门电路、多路选择器、算术运算电路比如加法乘法、有符号数无符号数等等。时序电路里包括寄存器、时钟和复位的同步异步、计数器、移位等等,特别是状态机,都应该熟练掌握。这些在HDLbits那个网站里都有很多对应的题目。

RTL的验证,初学者主要掌握怎么搭建测试平台以及编写简单的测试用例就可以。验证这个东西可以很复杂,比如业界广泛使用的UVM、或者之前介绍过的形式化方法等等。我在验证这个领域花了将近三年的时间学习,仍然有很多欠缺的地方。所以对于初学者来说,这些内容在我们入门的时候不需要掌握。在下一篇文章里,我们再详细说说这些进阶的验证方法学。

初学者学习RTL最大的难点,也是最普遍的问题,就是喜欢用软件编程的思维来考虑硬件。其实,软件编程大都是顺序执行的,但是硬件编程大都是并行执行的,这是一个很大的思维方式的转变。这就需要我们在学习的Verilog的时候一定要多想想对应的电路,比如在Verilog里写一个for循环,它综合出来是什么样的电路结构;或者if else与case语句,生成的电路有什么区别等等,都是值得我们思考和总结的知识点。

学习一段时间之后,如果能做到对于一个给定的逻辑功能,我们能想象出来它的电路结构,然后能够用Verilog实现,并且能写一些简单的仿真环境和测试用例,那么就说明RTL语言这部分学的很通透了。

对于Verilog掌握比较熟练的朋友,我比较推荐大家转向SystemVerilog。事实上,很多业界的大公司其实都在使用的SystemVerilog作为主要的开发语言。

SystemVerilog可以看成是Verilog的超集,它向下兼容Verilog,但是加入了很多Verilog不支持、但非常有用的特性,比如自定义类型、结构体联合体,还有接口等等。此外还有一些用于仿真验证的特性,比如业界常用的用来做验证的随机约束和UVM,都是基于SystemVerilog实现的。同时,它也简化了很多Verilog里的一些语法表达,比如你不用纠结一个信号究竟是wire还是reg,在SystemVerilog里可以直接用logic表示,诸如此类的还有很多,我就不一一列举了。

我目前不太推荐初学者0基础自学SystemVerilog,主要原因是我没找到很好的中文入门资料。但是如果你学校或者培训班在教SystemVerilog,那样最好,可以一步到位。我一直在看的一本书叫《SystemVerilog硬件设计及建模》,我是10年前买的,它是非常好的一本工具书。但是请注意,它不是SystemVerilog的教材,所以如果你刚入门,看这本书肯定会懵逼。等你学完Verilog,再看这本书,就很容易转到SystemVerilog了。

还有另外一本书,叫《SystemVerilog验证 – 测试平台编写指南》,这个绿皮书也非常有名,它主要介绍的是电路验证的相关内容,比如面向对象、功能覆盖率、随机化、断言等等,想做验证的同学必看,购买链接我放在文末,但是刚开始入门的同学可以先不用看。

学习编程语言的时候,还有一个很重要的内容就是仿真工具。这里比较常用的是Mentor的Modelsim,还有Synopsis的VCS,又是一个二选一,其实哪个都可以。我用的比较多的是Modelsim。业界使用的其实是Modelsim的高级版Questasim,这个和初学者也关系不大。

此外呢,一般FPGA开发工具会自带一个轻量级的仿真工具,网上也有一些开源的验证工具,比如iverilog,还有一些网页工具,比如EDAplayground。这些大家可以根据自己的实际情况,如果没有Modelsim或者VCS的license,可以考虑使用这些开源工具看看。

FPGA入门学习第二部分:基础知识

说完了编程语言,我们再来看看入门FPGA的第二部分内容:基础知识。这里主要有专业基础课和FPGA相关的专业知识两部分。

专业基础课不多说了,都是大学电子类专业的必修课:电路、数电、计算机体系结构、接口、数字信号处理等等。对于那些想转专业搞数字芯片或者FPGA的朋友,优先看数电,其他的内容应该根据你想从事的专业领域有目的的看。

和FPGA相关的专业知识,包括FPGA芯片的基础结构,以及它的一些基本单元的结构,比如查找表、逻辑单元、逻辑块、DSP、存储器等等。这部分内容,推荐看FPGA官方的文档,当然很多教FPGA的书里也都会有这方面的内容,接下来我们会说。

还有很重要的一部分,就是了解FPGA的开发流程,主要包含了设计、仿真、综合、映射、布局布线,时序收敛,映像下载和硬件调试等步骤。这里面还有很多小的环节,比如时序和面积的约束、各个阶段的仿真等等。我们至少应该知道,为什么需要这些步骤,每个步骤都完成了什么功能。

FPGA入门学习第三部分:开发工具

FPGA开发工具的使用也是入门FPGA必须要掌握的内容。目前,最主流的FPGA开发软件有两个,就是赛灵思/AMD的Vivado,还有英特尔的Quartus。这里又来一个二选一,大家要根据自身情况去选择,比如你们学校教的是谁家的FPGA,或者你用谁家的开发板,或者你手头有谁家的license之类的。在入门阶段,我建议专注于一个平台,没必要两个都学。一个搞通了另外一个其实换汤不换药。

学习FPGA开发工具的目的主要有3点。第一,熟悉前面说的FPGA开发流程。比如:怎么创建工程,怎么添加文件,怎么跑一系列编译的流程,怎么加入时序约束,怎么分配管脚,然后怎么把生成的FPGA映像加载到开发板上运行。

第二,就是熟悉一些常用的IP的用法。在FPGA项目中,我们会用到很多不同的IP核,比如PLL、FIFO、存储器等等,这能帮助我们提升设计的效率和性能,避免重复造轮子。所以我们应该学会怎么配置和调用这些常用的IP。此外还有复杂一些的包括软核处理器NIOS,还有一些通信用的IP比如以太网控制器、PCIe、DDR控制器等等。一开始学习的时候一般不需要看,进阶的时候再看也来得及。

第三,就是学习一些常见的硬件调试和时序分析的方法,比如怎么看最大频率,当时序不收敛的时候怎么进行分析和修改设计,怎么用signaltap做一些简单的硬件测试等等。

这部分的学习,建议大家对照教材或者参考书进行,此外,我强烈建议大家配合着开发板进行学习,这就是下面要说的FPGA入门路线的第四点:动手实验。

FPGA入门学习第四部分:动手实验

学习硬件不摸板子,就像纸上谈兵。所以最好结合开发板和参考书的实验例程,从头到尾走几遍前面说的流程。现在市面上这类书也有很多,其实内容也比较类似,比较经典的实验有流水灯、按键、数码管、红绿灯、一些常见总线的通信、一些数据和信号处理的实验等等。

我当年看的是特权同学的书,相信很多同学也看过。我当时没买他的开发板,我用的是学校的板子。现在这些开发板在某宝上有很多,如果你要买的话,我认为不用买太贵的,基本功能有就可以了。绝大部分板子我都没用过,我就不做具体推荐了。如果你看好了哪个板子但是不确定合不合适,可以在下面留言或者私信我。

FPGA入门学习:知识点小结

这篇文章给大家梳理了一下入门FPGA的学习路线和知识点,主要有四点,就是编程语言、开发工具,基础知识和实际的硬件实验操作。如果你掌握了这些,其实就已经为更高阶段的学习打下一个比较坚实的基础了。

当然这些内容说起来容易,实际还是需要大家花时间下功夫去学习和钻研。事实上不管是学习FPGA,还是学习其他任何东西,从来都是一份耕耘一分收获。除了学习这些专业的内容以外,我们更是在努力变的自律,也在培养和锻炼自己不断学习的能力、面对挑战的勇气,以及在挫折和困难中不断前行的韧劲。我相信付出肯定会有收获,明天的你也肯定会感激自己今天的努力。我祝愿大家能够享受这个学习的过程,我也希望能和大家一起,不断通过努力变成更好的自己。