FPGA学习实践之旅——前言及目录

发布时间 2024-01-06 22:10:29作者: 云帆cwc

很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定理解程度的学习过程。

前言
回想我的编程之旅其实挺坎坷的,在我初高中的时候完全没接触过电脑,只有个老人机用于打打电话,看看小说,所以第一次接触程序设计时完全跟天书一样。最最开始写程序应该是Matlab上机作业,这个是靠抄书磕磕绊绊做完的。然后大一下的时候教C++程序设计,在当时看来真的太抽象了,老师上课也没有手把手带着学,现在来看,编程这东西,看的再多不如上手去实践,通过项目进行学习。我记得期中考试是上机,总共五道题,第一次好像就做了一道题,妥妥不及格,然后大家都做的不好所以补考了一次,还是差点挂了,从此我在心里就默认编程太难了,看到程序就怂,我有一次还在微信跟资助我的师兄还抱怨,我选错方向了,工业自动化要编程,我肯定学不好。那个时候的自己肯定打死也想不到,我未来还是在这个行业里,天天打交道的就是Matlab,C还有Verilog,还有一系列需要的语言,需要就去现炒现卖。人生就是这么兜兜转转难以琢磨,这也是精彩之处吧,现在人都想要安稳,可是当下的安稳,当下的信誓旦旦未来真的会如此确定吗,我不敢肯定。命运的推手我不知道会把我推向何处,就先做好当下的事,充实自己,将自己武装好了也就慢慢建立从容了。

说回FPGA,第一次了解这个是在大学数电课程中,当时应该是大二下学习,那个时候我对于编程还是一窍不通的状态,记得在实验课上每次都是大佬们先做完,然后我们也就做完了。教我们的是一个快退休的高级工程师,他经常跟我们说,虽然现在单片机应用最为广泛,但是FPGA的灵活性是单片机不能媲美的,这一行会很有作为,这个说法我现在无法给出自己的答案,确实了解还是不够,很多行业,很多应用还没有去深入体会过,再过上很多年希望有能力来说只言片语。

从上完这门课,FPGA就被我抛下了大概三年之久。大四暑假的时候提前来教研室,当时想的是单片机和FPGA在之后做项目会用得上,需要恶补一下,但是现实告诉我,没有带着具体项目和体悟只是单纯去跟着例程走可以算得上是自欺欺人,所以就那么糊弄了自己两个月。开学之后立马就抛到一边去了。

研究生阶段我的编程能力算是有断断续续的成长,主要是三个阶段吧,一个是研一下,当时选了模式识别的课程,每学完一个分类器都要用Matlab去手撸出来,我记得上课的老师全程板书,对分类器的实现步骤讲解特别细致,所以我基本上就是按照这个步骤一句一句敲下来的,每次敲完运行然后修修改改都得到了想要的结果就很有成就感。虽然只是简单的贝叶斯判别,模糊判别,主成分分析等,但是通过自己手敲是真真切切感受到了程序不过就是算法的实现而已。第二个阶段到了研二上学期,这半年去了某公司进行实习,实习的时候围绕着那颗单片机完成了很多功能,SPI读写FLASH,IIC读数字温度传感器,文件系统和IAP在线升级等等,一步一步走下来,都是现学现用,慢慢就发现好像只要去学就没什么很恐怖的地方,网上都有很多教程,耐心去理解去实现就好了,这半年让我对编程的畏惧心理少了好多,对单片机的应用信心提高了很多。所以毕设就算是只有一个月交稿子的时候也可以不慌不忙在单片机里增加SDRAM读写和FFT功能。第三个阶段就是研二下开始做毕设了,毕设要用在FPGA中实现DDS技术,做一个信号源,那个时候又是一阵雄心勃勃,想着要好好学习一下,我记得还在牛客网刷了好多题,但是很多都是找答案抄的,DDS的话也就是在FPGA中简单实现了一个ROM读取,SPI输出。这些经历断断续续下来,说没有用也不是没用,就是在脑海里加深了印象还有对FPGA的开发打下基础吧,这次算是浅尝吧,真正用FPGA做了实际项目,到毕业这半年才开始算是入门了,让我能有一点信心开始写下这篇博客。

这几个阶段的经历慢慢切实告诉我自己,程序这个东西就两点:一是算法或者框图,二就是动手,一点一点写下去,有问题就Debug,程序就是简单的将逻辑思路实现的过程。与我而言,最难的就是第二点了,我自认一直以来还挺聪明的,学东西很快,自学能力也还行,就是总是不敢动手,主要是怕自己做不好,还会用这还不简单来麻痹自己。就跟写这个博客一样,一直在脑海里想着要做,但是一直拖拖拖,怕自己写的太浅薄,怕自己写不好,但是只有写下来才能慢慢改进,不自己做看别人的文章时还在那指点江山。编程也是如此,总会觉得这个思路就很简单啊,陷入俯视一切的自欺欺人当中,但是机器不是人,他是没办法完全理解人的想法的,只要有一点设计上的不谨慎导致系统无法运行,所以对于初学者即使是简单的hello world也会发现怎么也跑不出来。

前言差不多就这些吧,我没写很多FPGA知识点相关,讲了讲自己的历程吧,一方面后续会穿插需要的FPGA的内容,一方面希望我自己的经历能引起大家的共鸣,学习FPGA或是编程,或是任何新的事物,都是这么从面对未知的发憷到慢慢变得从容的过程,这个我会在后面反反复复经历,而在每一小段经历中成长的最为重要的点就是不要害怕,动手去实践,知行合一,螺旋上升。

我的项目成长历程
前言里主要写的是我编程的成长经历,这篇主要还是针对FPGA的学习分享,所以主要还是讲的我的FPGA学习过程。研究生期间工作就不说了,不成体系,大家估计都知道能跑起来就算成功,而且没有啥技术要点。所以就主要还是这半年还有更多的东西再慢慢补充吧。

刚入职的时候,我们公司的培养计划是让新人独立负责一个项目,在项目中成长。我要负责的是一款高速ADC的测试工作,首先要做的就是项目拆解,其中包含有硬件平台的设计,数据采集程序的设计,上位机的设计,每个部分都可以作为一个课题进行分享,这里我分享的是基于FPGA的高速数据采集程序设计部分,我是如何在设计这部分程序时深入了解FPGA的。

整个工程主要包含这四个模块:ADC驱动模块,数据存储模块,USB传输模块和MicroBlaze控制模块,这半年来我就是从这几个模块慢慢学习慢慢进阶而来,下面我会按照自己的学习过程慢慢讲述自己的心路,设计过程,遇到的问题,如何debug,有什么收获。不过我这确实还学得不够深,所以分享的比较浅薄,希望大家看过之后多多沟通交流,有问题欢迎批评指正,有什么好的设计方法技巧欢迎多多分享。

LVDS接口设计及应用
这部分主要讲述的是有关LVDS电平,接口的原理,时序,程序设计及仿真,仿真中包括TestBench的编写,以及一些调试经验。主要参考的是xilinx官方发布的应用笔记串行LVDS高速ADC接口,站在巨人的肩膀上确实事半功倍。

跨时钟域处理
之所以先说这部分,是因为不同模块之间通信涉及到各种跨时钟处理,这里主要应用的是异步FIFO还有打两拍。

DDR3接口设计及应用
这里主要讲述的是MIG IP核的应用,DDR3控制程序设计及仿真验证。

USB3.0接口设计及应用
这里面写的主要是FPGA与USB3014芯片间的通信,USB3014的数据传输到PC上需要在上位机进行相应的设计。

MicroBlaze设计及应用
这部分内容是在FPGA内部设计了一个嵌入式软核,从而可以便利得如同使用单片机一样控制GPIO,串口,SPI和中断等外设,实际上如果只是单独的串口,SPI等功能,只需要编写简单的verilog代码即可,但是当需要控制功能越多,使用MicroBlaze相比于状态机切换的优势就越显现出来了。

GTX设计及应用
记得在一篇博客中看到过,没有用过FPGA中的串行高速接口就不算用过FPGA,当我用到了这部分时候就体会到了这一点,通过GTX接口可以接收常见的各种高速协议数据,例如PCIE,SATA等。由于我也才刚开始接触,所以主要就是介绍GTX的原理及简单的仿真,以及针对我的项目中比较有挑战的一点:ADC数据接口没有任何编码,这是如何应用GTX接收数据的。

后记
这部分内容等到整个内容写完再来做一个总结,有预感是一个庞大的工程,也挺有压力的,因为很多地方都还不太明白,但还是要先动笔,开了这个头再不停学习不停完善不断优化吧!