大家好,最近我收到很多同学的提问,希望我聊一下FPGA怎么学习、怎么进阶,以及有哪些推荐的资料或书籍。这期视频,咱们就一起来深入探讨FPGA的学习路线。
其实这个话题不太好讲,因为每个人的学习方法、背景、目的,以及可利用的学习时间和资源都不一样。比如,你可能是在校大学生,学习FPGA是为了做数字电路实验、参加竞赛或者进入实验室;也可能是研究生,想用FPGA来加速算法或者开展相关研究,但却不知从何入手;还有可能是想转专业,把数字芯片设计或FPGA作为职业发展方向。这些都是给我留言的小伙伴们的真实情况。
这几周我一直在努力梳理学习路线,发现不管背景和动机如何,学习路线本身还是比较清晰的,而且很多内容的学习有共同之处。所以在这期视频里,我会重点介绍入门FPGA的学习路线。如果你刚刚开始学习FPGA或者有学习的打算,这期视频肯定对你有帮助;要是你已经学了一段时间,这里介绍的学习路线或许能让你少走弯路。当然,如果你是FPGA高手,也欢迎在评论或弹幕里分享学习经验,说不定能帮助很多想学习的朋友。
总体来说,我把学习路线大致分成四个部分,分别是编程语言、基础知识、开发工具和动手实验。对于每个部分,我都会介绍和总结入门时应学习的知识点和方法,也会推荐相关书籍和学习资料,希望能助力你的学习。我还总结了一个思维导图,涵盖这期视频的所有知识,具体获取方法会在视频最后告诉大家。
一、编程语言
这部分是必须掌握的内容。和软件开发使用的C、C++、Java等语言不同,FPGA开发使用硬件描述语言(HDL)或者寄存器传输级语言(RTL)。对于初学者,先不讨论高层次综合,即使用C或Python来编程FPGA。从各公司FPGA岗位需求来看,RTL语言编程能力是必备的。
主流的硬件描述语言有Verilog、VHDL,还有System Verilog。
VHDL和Verilog各有优缺点。VHDL语法更严谨,而Verilog更灵活,更像C语言。这个视频不是评判哪个语言更好,入门时选择先熟练掌握一个语言就行。我个人推荐先学习Verilog,特别是有一定C语言开发经验的人,学习Verilog应该比较容易上手。等积累一定开发经验后,可以考虑再学习VHDL,因为实际项目中,可能一部分模块用Verilog写,另一部分用VHDL写,所以即使VHDL写得不熟练,也最好能大概看懂用VHDL写的设计。
不管学习哪种语言,主要学习内容有三点:语法、使用该语言进行设计、使用该语言进行验证。
(一)Verilog语法学习
关于Verilog语法的书很多,但内容大同小异。不管选哪本,都建议认真看一遍。Verilog语法不需要死记硬背,但要对每条语法的基本用法和功能心中有数。其语法可分成可综合和不可综合两部分。可综合语句能生成对应的硬件电路,如果时间有限,一开始可以先看可综合的Verilog语法,这部分内容不多,大概十几条左右。掌握后,再看主要用于验证和仿真的不可综合的Verilog语句。
配合Verilog学习,强烈推荐HDLBits这个刷题网站。里面有很多由浅入深的基础性练习,非常适合初学者。建议大家把里面的题目做一遍。如果时间特别有限,可以先做题目,遇到不会的知识点再去查Verilog书,通过实践来学习。
(二)Verilog设计学习
设计主要有组合电路和时序电路两部分,还有非常重要的状态机,这些都要熟练掌握。HDLBits网站里有对应的题目,大家可以去练习。
(三)Verilog验证学习
对于初学者,主要掌握如何写一个简单的测试平台以及如何写一些简单的测试用例就行。验证可以非常复杂,下一期进阶篇再详细说。
学习Verilog最大的难点是要从软件编程思维转变为硬件编程思维。软件编程大多是顺序执行,而硬件编程大多是并行执行。学习Verilog时,要多思考语句对应的硬件电路是什么样的。比如写一个for循环、if – else语句、case语句,它们会综合出什么样的电路。对于给定的逻辑功能,要能想象出电路结构,并用Verilog语言实现,同时能写一些简单的测试用例和测试环境,这样就说明对RTL语言部分学得比较通透了。
(四)System Verilog学习
对于Verilog掌握比较熟练的朋友,推荐转向System Verilog。现在业界很多大公司都把System Verilog作为主要开发语言,它可以说是Verilog的“超级版”。它加入了很多Verilog不支持但非常有用的功能,比如自定义类型、结构体、联合体、接口等,还有一些用于仿真验证的特性,业界常用的随机约束和UVM都是基于System Verilog实现的。而且它简化了很多语法表达,比如不用再纠结一个信号到底是wire还是reg,直接用logic表示。
不过,目前不太推荐初学者一开始就学习System Verilog,主要是没有特别好的教程。有一本书叫《System Verilog硬件设计和建模》,我十年前买的,它是很好的工具书,但不是教材,刚入门直接看会一头雾水。等学完Verilog再看这本书,就容易转向System Verilog。还有一本书《System Verilog验证测试平台编写指南》很有名,主要介绍和验证相关的内容,比如面向对象、功能覆盖率、随机化测试、断言等,想做验证的同学必看,但刚入门的同学可以先不看。
(五)仿真工具学习
学习编程语言时,仿真工具很重要。常用的有Mentor的ModelSim以及Synopsys的VCS,二选一即可,我个人用ModelSim比较多。一般的FPGA开发工具会附带轻量级的FPGA仿真软件,网上也有开源工具,如Icarus Verilog,还有网页工具,如ED Playground,大家可结合实际情况选择使用。
二、基础知识
这部分主要有专业基础课以及和FPGA相关的专业知识。
(一)专业基础课
包括电路、数字电路、计算机体系结构、接口、数字信号处理等。对于想转专业搞数字芯片或FPGA的朋友,推荐优先看数字电路,其他专业课可根据想从事的具体领域有目的地学习。
(二)FPGA相关专业知识
包括FPGA芯片的结构以及基本组成单元的结构,如查找表、逻辑单元、逻辑块、DSP、存储器等。这部分内容推荐看FPGA官方文档,很多FPGA的书里也有相关内容。
(三)了解FPGA开发流程
主要包含设计仿真、综合映射、布局布线、时序收敛、下载和硬件调试等内容,其中还有很多小环节,比如时序收敛、面积约束以及各个环节的仿真等。作为初学者,要知道为什么需要这些步骤,以及每个步骤完成了什么功能。
三、开发工具
目前主流的FPGA开发工具主要有两个,AMD的Vivado和英特尔FPGA的Quartus。大家可以根据实际情况选择,比如使用的是哪家的FPGA芯片或开发板。入门阶段建议专注于一个平台,没必要两个都学,搞通一个,另一个也就容易上手了。
学习FPGA开发工具主要有三个目的:
(一)熟悉FPGA开发流程
比如怎么创建工程、添加源文件、运行编译流程、加入时序约束、分配管脚,以及把生成的FPGA映像文件加载到FPGA里运行。
(二)掌握常用IP的用法
在FPGA项目中会用到很多不同的FPGA IP,如PLL、存储器等,这些IP能提高设计效率,避免重复造轮子。要学会配置和调用这些常用IP。还有一些复杂的IP,如软核处理器Nios,以及通信用的IP,如以太网控制器、PCIe、DDR控制器等,一开始学习可能用不到,进阶时再学习也来得及。
(三)学习硬件调试和时序分析方法
比如对于一个设计,怎么看它的最大频率;时序不收敛时,怎么分析并修改设计;怎么使用硬件调试工具,如Quartus里的SignalTap。
关于FPGA开发工具的学习,建议参考教材或参考书,并且配合开发板学习。
四、动手实验
学习硬件不接触板子就像纸上谈兵,所以最好结合开发板和参考书提供的实验例程,从头到尾走几遍前面说的开发流程。
市面上这类书很多,内容也比较类似。经典实验有数码管显示、流水灯控制、按键检测、红绿灯控制,还有常见总线的通信实验,以及数据处理和信号处理实验等。我当年看的是特权同学的书,比如《深入浅出玩转FPGA》,可能都有十年历史了,还有一本比较新的。当时我用的是学校的板子,没买他的开发板。现在这些开发板在某宝上很多,购买时不用买太贵的,基本功能具备就行。大部分板子我没用过,所以不做推荐。如果你看好某个板子不确定是否合适,可以在下方留言或者私信我。
这期视频为大家梳理了入门FPGA的学习路线和知识点,主要包括硬件语言、开发工具、基础知识和FPGA相关的硬件实验操作。如果你掌握了这些,就为下一阶段的学习打下了坚实基础。我把这些知识点总结成了思维导图,大家可以去我的公众号按照提示操作获取。
当然,这些内容说起来容易,实际学习需要花很多时间和精力去钻研。不管是学习FPGA还是其他东西,都是一份耕耘一份收获。除了学习专业内容,我们还能培养自律能力、学习能力,以及在挫折和困难中前行的韧劲。我相信付出终有回报,明天的你会感激今天努力的自己。