各位大侠会发现,FPGA技术江湖一直都在推送各种设关于FPGA的设计实例或者项目研发案例,会把设计方法和设计思想都阐述清楚,甚至有些会分享源码供各位大侠参考学习,很少去搞一些纯粹噱头性的文章,这就是因为现在社会的大环境差点意思,噱头性浮夸或者浮躁的东西太多,搞技术的最忌讳这一点,但是搞营销的可不管这些,只要有噱头有流量,就是赚了,往往这样就会出现很多误导性的信息,很多信息不去调研,技术不去钻研,凭空想象,害人害己。
搞技术的,技术大牛也有很多,但是对于学习,还是得找适合自己的,有些人自己很清楚,但是和别人表达不清楚,甚至这类人的大部分都不擅长和外界沟通,也不屑于沟通,这类人我就接触过不少,这就是为什么技术大牛多,而对于技术学习,尤其是初学引导,系统性学习有深刻理解的技术领路人不多的原因。
近期很多人问我该如何去学FPGA,那么今天,这里就和各位大侠来聊一聊。
有人问:本人零基础,想学fpga,求有经验的人说说,我应该从哪入手,应该看什么教程,应该用什么开发板,用到什么书等等,希望有经验的大佬能够给我一些引导。这里假装有人这么问,其实问的人很多,这里只是汇总了一些大家的问题。
如果想速成,这样主要是面对应用的,一个小时内让你的板子运行起来。早期起来的快,活学活用,就是后期没有系统理论支持,会有些吃力,特别是大项目那完全是个悲剧。
学习FPGA,先理解对应语言的语法,这里仅对于 Verilog HDL 和 VHDL,对于系统级不做讨论。对于硬件描述语言的选择,大家不用纠结,如果没有个人或者特殊需求,本人建议先入手 Verilog HDL,Verilog HDL设计运用比较灵活,有点类似于C语言,但是在学习的时候不能按照C语言的顺序执行去思考,要转变思想。
对于 VHDL,逻辑比较缜密,格式要求比较单一,还是比较容易死记硬背的,verilog比较灵活,先学 Verilog HDL 的好处就是,可以灵活变通,如果先接触 VHDL 的话,怕你再接触 Verilog HDL时陷入死记硬背的节奏里,不太容易接受。
总的来说,学通透了,两者并没有什么影响,两种语言都熟练掌握当然是最好啦,但是你也可以仅掌握你需要用的,这个具体看个人需求了。关于HDL硬件描述语言,下面会有更详细的阐述,这里就大概说一下。
可以理解下面几点
1)看代码,建模型
只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写 Verilog HDL和写C语言整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。在看到一段简单程序的时候应该想到是什么样的功能电路。
2)用数学思维来简化设计逻辑
学习FPGA不仅逻辑思维很重要,好的数学思维也能让你的设计化繁为简,所以啊,那些看见高数就头疼的大侠需要重视一下这门课哦,重新端正自己的态度哦。
举个简单的例子,比如有两个 32 bit 的数据 X[31:0]与 Y[31:0]相乘。当然,无论 Intel 还是 Xilinx 的操作软件内部都有现成的乘法器 IP 核可以调用,这也是最简单的方法,但是两个 32 bit 的乘法器将耗费大量的资源。
那么有没有节省资源,又不太复杂的方式来实现呢?
我们可以稍做修改:将X[31:0]拆成两部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],则X1左移16位后与X2相加可以得到X;同样将Y[31:0]拆成两部分Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],则 Y1 左移16位后与 Y2 相加可以得到Y;则X与 Y 的相乘可以转化为 X1 和 X2 分别与 Y1 和 Y2 相乘,这样一个 32 bit * 32 bit 的乘法运算转换成了四个 16 bit * 16 bit 的乘法运算和三个 32 bit 的加法运算。转换后的占用资源将会减少很多,有兴趣的大侠,不妨综合一下看看,看看两者差多少。
3)时钟与触发器的关系
“时钟是时序电路的控制者”,非常经典的一句话,可以说是FPGA设计的箴言。
FPGA的设计主要是以时序电路为主,因为组合逻辑电路再怎么复杂也变不出太多花样,理解起来也不没太多困难。但是时序电路就不同了,它的所有动作都是在时钟一拍一拍的节奏下转变触发,可以说时钟就是整个电路的控制者,控制不好,电路功能就会混乱。
打个比方,时钟就相当于人体的心脏,它每一次的跳动就是触发一个 Clk,向身体的各个器官供血,维持着机体的正常运作,每一个器官体统正常工作少不了组织细胞的构成,那么触发器就可以比作基本单元组织细胞。时序逻辑电路的时钟是控制时序逻辑电路状态转换的“发动机”,没有它时序逻辑电路就不能正常工作,因为时序逻辑电路主要是利用触发器存储电路的状态,而触发器状态变换需要时钟的上升或下降沿。由此可见时钟在时序电路中的核心作用。
对于以上几点,总结起来就多实践、多思考、多不耻下问。实践出真知,看100遍别人的方案不如自己去实践一下。
实践的动力一方面来自兴趣,一方面来自现实的压力。
个人觉得后者更重要,毕竟现在真正感兴趣的人并不多了,真正有兴趣的人会全身心投入,学习这些也是小事一桩。而对于后者,不管你的压力来自于何处,有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。
在实践的过程中要多思考,多想想问题出现的原因,问题解决后要多问几个为什么,这也是经验积累的过程,如果有写项目总结的习惯更好,把问题及原因、解决的办法都写进去。最后还要多问,遇到问题思索后还得不到解决就要问了,毕竟个人的力量是有限的,问同学、同事,利用好当前丰富的网络资源,问各位大佬都可以,有经验的人点拨可能会让你原本事倍功半变成事半功倍。
多实践,从实践中深刻理解理论,结合理论,而不是纯粹实践,抛弃理论;
多思考,举一反三,掌握核心的设计思想,设计方法,不局限固有的器件;
多问,不管是谁,只要懂你之不懂,要不耻下问,学习有效的方法。
为什么不推荐0基础学习ZYNQ或SOC?
<1>、容易让人有傍同心理。傍同心理是指一个人通过渲染与自己有亲近关系的人的杰出,来掩盖和弥补自己在这方面的不足,从而获得心理上的平衡。自己在学习很厉害的东西,然后也感觉自己很厉害,但这只是错觉而已。
<2>、入门应该学习尽量简单的东西,什么阶段就要做什么阶段的事情,一口吃个胖子不太现实,要么专心学习FPGA,要么专心学习MCU或者RAM。这样更容易有成就感,增强信心。
<3>、ZYNQ和SOC的应用领域最近这几年发展还是挺不错,需求也在日益增加,但是对于目前整个市场的需求还只是一小部分,最主要还是综合能力要求比较高,并不是短时间内就可以迅速达到某种程度或者某种高度,零基础去学,不太现实,因为你要学会了爬,才能更好的去走,乃至跑起来。
为什么已经存在那么多IP核,仍然需要写HDL?
<1>、首先,就不应该有这种问题,封装好的 IP 确实多,但是不可能所有东西都是用 IP 核,IP 核并非万能,不能满足所有需求。而且做这行搞技术的和其他文职类编辑设计可不一样,并不是给你弄好了你粘贴复制一下或者调用一下就可以了,具体的硬件实现调试都是需要你去懂得原理以及方式方法的,其次,做产品做项目的时候,工程上的问题也是非常多的,这个问题可以作为学生答疑用,解答困惑,没有必要纠结于此;
<2>、尽量少用闭源IP核,一旦出问题,这种黑匣子很可能让产品难产,对于整个开发团队以及产品衍生方都是巨大的困扰;
<3>、深入理解低层次,可以更好地使用高层次。这个学习的思想可以适用于所有编程语言。
为什么不推荐深入学习NIOS II 和 MicroBlaze等软核?
<1>、性价比不高,一般的软核性能跟Cortex M3或M4差不多,用FPGA那么贵的东西去做一个性能一般的CPU,在工程上是非常不划算的。不如另外加一块M3。
<2>、加上软核,可能会影响到其它的逻辑的功能。这是在资源并不十分充足的情况下,再加上软核,导致布局布线变得相当困难;
<3>、软核不开源,出现Bug的时候,不容易调试;
<4>、工程上很少使用,极有可能派不上用场。
所以不推荐深入学习,如果非要用,在别人指导下或者自己会用就行了。
关于FPGA在人工智能、5G应用的一些见解
有句话说的好,“外行看热闹,内行看门道”,2016年底到现在,人工智能这个词再次风靡全球,上次还是二十世纪七八十年代。人工智能给太多行业带去了突破瓶颈的希望,同时附带的是更大的压力,还有更多的泡沫噱头经济。
对FPGA而言,在人工智能的应用还是主要在硬件加速方面,本人之前也搭过加速器,对这方面也有所了解,这方面的理解和不推荐零基础学习 Zynq 一样,这些都是综合能力性,而且还是有门槛的,并不是所有人都能达到的高度。尽管你再努力,你也不得不承认能力是有上线,所以不用去考虑太多,当你后续能接触到了,有能力了在考虑。
但是由于现在很多培训机构打着人工智能的幌子,信口开河的忽悠人,个人选择时要有判断力,人工智能下的FPGA,可不是单纯的学习FPGA,也不是单纯的学个python就行了,至于人工智能的具体应用及实现,后续再出专题研究,这里就不过多讨论。总之,一句话,自我判断力要有,绝大多数没有实际作用,不可信。
关于企业里FPGA工程师的开直播卖板卡引导学习的见解
首先,要明白以下几个问题:
一是,你是纯正的FPGA工程师么?这里说的纯正是指,你是定岗定制专门做FPGA开发的,而不是什么都干,接触过几天FPGA就叫FPGA工程师;
二是,你自己有没有在自己的专业方向进行过系统性的学习?FPGA工程师现在对口的专业就是弱电类专业,包括电子信息工程、电子科学与技术、通信工程、集成电路、微电子、半导体、物电光电等等相关专业,具体的专业方向,能不能接触到FPGA,还需要看各个学校的具体发展方向。系统性学习就是不是片面的知识组合,而是有规划有效的学习,包括对整个市场的理解,对技术需求,对学习者的自身情况的理解,各种综合,而不是学了几天某个器件,感觉个人懂了很多,就行了;
三是,既然是引导他人学习或者推荐学习,你是否明白原理,是否很清楚如何沟通,表达清楚你懂的并且有效传达?这一点也是最重要的,在前面也说过,你懂得不代表你可以正确地去传输给别人,让别人也懂,正确地价值观,正确地引导方式都是很重要的,可以说是相互学习,共同进步,而不是单方面的输出。
这里点到为止,不过多阐述,以免给杠精机会,哈哈哈。
大家好,我是【FPGA功夫熊猫】精益求精,不断推荐好文章。