打印
[资料干货]

FPGA图像工程师的六脉神剑——“选扫掌仿习练”

[复制链接]
324|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llm健飞|  楼主 | 2021-3-27 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FPGA图像工程师的六脉神剑——“选扫掌仿习练”

导读——不是每个人都能成为一代宗师,因为在一个时代宗师只有少数人,成不了宗师,可以选择成为门派高手,立足武林的六合一之路无外乎秘密武器、江湖规矩、内功心法、武术动作、内功修炼及实战经验。修炼六脉神剑,成为高手,行走江湖,行侠仗义,斩奸除恶,开启江湖人生!

0.引言——高手没有天赋,只有初心、选择、努力和毅力

图1 工业视觉处理(图片来源:自电子元件技术)

图像处理是通过对图像进行增强、复原、重建、分析及特征识别等处理以得到目标结果,在工业、消费电子、安防等领域具有广泛的应用。FPAG支持实时流水线运算(跟工厂流水线作业一样、不同的工序可以同时开展),具有高实时性特点(通过并行作业、可以在极短的时间内完成任务),是图像处理应用的主要平台,在一些高并发性、实时性要求较高的应用领域,只能通过FPGA实现。

FPGA图像工程师的薪资水平普遍较高,但综合能力要求极高,又是算法、又是编程,又是硬件,不是迫不得已或者兴趣,很多人一开始就选择放弃,实际入门真的是这样子吗?跟很多技术一样,难不在技术本身,在学习的初心、态度、流程及方法,下面是本人基于多年的经验整理FPGA图像工程师晋级之路。

1.选武器——倚天QUARTUS、屠龙VIVADO,掌控优先
FPGA开发的工具平台包括综合编译工具、仿真工具、代码编写工具及入门开发板,选好用好工具平台不仅可以降低入门难度,还利于快速提升设计开发能力。工具平台选择以易于入门,便于熟练掌控,利于升级为基本原则,下面是有关工具平台选择、使用方法及相关资料的分享:


(1)选开发工具
①综合编译工具——优选QUARTUS,升级VIVADO

主流的FPGA厂商主要有:国际Intel、Xinlinx、Lattice等,国内的紫光同创、京微齐力、高云半导体等,每家厂商都有自己的开发工具,解决新建工程、仿真综合,配置管脚、下载和在线调试等问题,功能大同小异,差异主要存在于操作习惯、性能及操作方法等方面。主流的开发工具主要有来自Intel的QUARTUS和Xilinx的ISE、VIVADO,其中ISE是XILINX较早开发的版本,适用中低端芯片的开发,VIVADO是XILINX近期推出的开发平台,适用于XILINX的中高端芯片的开发(不支持低端芯片的开发)。

表1 QUARTUS与VIVADO比较
  
序号
            
比较项
            
QUARTUS
            
VIVADO
  
  
1
            
安装包大小
            
3G左右
            
十几G
  
  
2
            
电脑配置要求
            

            

  
  
3
            
运行速度
            
快(分钟计算)
            
慢(小时计算)
  
  
4
            
操作便捷性
            
简单
            
复杂
  
  
5
            
约束严谨性
            

            

  
  
6
            
学习资料
            
多(尤其中文)
            
少(英文为主)
  
  
7
            
功能
            

            
强大
  

相比而言,QUARTUS无论是对资源的要求,还是使用简单性都要优于VIVADO,但功能的齐全性低于VIVADO,综合市面上Intel的FPGA开发板相对比较便宜,建议初学者先选择QUARTUS入门学习,掌握熟悉之后,根据个人情况及开展具体项目的要求,再学习使用VIVADO。
备注——综合编译工具下载地址:

1)   QUARTUS软件安装包,建议安装18.1精简版本的,不需要**。

下载地址: (请点击这里)

2)   VIVADO软件安装包,建议安装2018.2版本的,在XILINX官网可注册LICENSE。

下载地址:(请点击这里)

②仿真工具——业界主流MODELSIM
QUARTUS与VIVADO都自带仿真器,但是不好使用,目前业界基本都是使用MODELSIM作为FPGA仿真工具,基本是标配。

备注——仿真工具下载地址:
下载及安装教程地址:(请点击这里)


③代码编写工具——优选GVIM,可选NOTEPAD++
QUARTUS、VIVADO、MODELSIM都自带有代码编写器,但交互性不好,强烈建议选用GVIM、NOTEPAD++等代码编写工具。
在Windows系统环境下,可以采用NOTEPAD++,特别是从软件转行过来,已经习惯NOTEPAD++使用的开发者。但如果想在IC设计、IC验证或者FPGA上走得更远,强烈建议选择GVIM,一方面IC行业基本都在使用GVIM,另一方面来自于工具本身功能足够强大,不仅支持常规的编辑、复制、删除、查找、替换等功能,而且支持“命令行”输入。

备注——Windows版本GVIM工具下载地址:
下载及安装教程地址:(请点击这里)

(2)开发工具使用
①VIVADO和QUARTUS使用方法

VIVADO和QUARTUS的功能,最常用的功能包括:新建工程、选好芯片型号、配置好管脚、综合编译和上板调试等功能。各个工具都是大同小异,但要注意学习FPGA不是学工具,而是学习如何设计、学习如何定位问题和解决问题。
备注——VIVADO和QUARTUS使用资料推荐:

VIVADO使用教程链接:(请点击这里)

QUARTUS使用教程链接:(请点击这里)提取码:yknc

②Modelsim使用方法
掌握Modelsim工具的基本使用,主要包括:新建工程,添加文件,编译,VSIM仿真及查看仿真波形等。

(3)选开发平台
学习FPGA编程,开发板是标配平台,市面上FPGA的开发板非常多:100~200元的入门级产品,500~1000元的进阶产品,数千上万元的高级产品。对于初学者可以选择点拨FPGA之入门开发板、MP801、新起点FPGA开发板、AC620 FPGA开发板等。

2.扫规矩——Verilog江湖明规矩讲武德,走马观花留印象
选好工具、开发板,接下来就是学习FPGA的编程语言——Verilog和VHDL,其中VHDL在教学科研中较为常见,实际的应用中基本都是以Verilog为主,风格与C语言类似,强烈建议学习Verilog。传统的学习模式都是选一两本教材反复研读理解每一个语法的细节,翻了一遍没感觉,再翻一遍,也没记住多少,一两个月下来还是不知道如何编写。其实对于大多数初学者而言,这样的学习模式是无效率的,因为短期内无法理清语法规则,如何使用。因此,强烈建议找一两本经典教材,花两三天时间走马观花过一遍,不需要追求掌握细节,有印象大概明白即可,使用的时候再回过头来查,使用多了自然就会明白,这跟小孩走路一样,一开始总是别扭,找到感觉了自然就灵活了。重点理解:
表2 重点理解Verilog知识点
  
序号
            
内容点
            
内容说明
  
  
1
            
always
            
①了解时序逻辑和组合逻辑的always:
  
②了解它们的区别,了解D触发器的原理、波形、建立时间和保持时间这些概念;
  
  
2
            
if  else和case语句
            
理解选择条件,理解case用法
  
  
3
            
看波形
            
理解时钟、复位及使能的作用,重点培养根据代码理解波形,这点非常重要
  
  
4
            
算术运算符、逻辑运行符和比较符等
            
Verilog里的加减乘除等用法、与或非门的用法、大于等于小于等的用法,这些实现功能的基本元素
  
  
5
            
写时钟、复位和使用initial产生激励
            
掌握基本的仿真文件编写技巧,掌握时钟、复位等信号产生,例化设计对象,产生激励源
  
推荐的书:

1)   夏老师的《verilog HDL数字系统设计教程》,这是一本经典的verilog书籍,已出版十几年,一直很受欢迎;
2)   《FPGA至简原理与应用》,该书还没有出版,只有电子版,配套视频讲解帮助学习。

3.掌心法——FPGA软硬心法核心在至简,避免走火入魔
FPGA的设计
(1)FPGA软硬件设计思维风格
FPGA需要编程实现,但实际是硬件设计,这与软件设计有本质的区别:

①   软件设计思维风格

图2 软件思维设计风格
软件设计思维即指熟悉的C、C++、Java等软件编程的思维,可以边写代码,边看处理看结果,风格如图2所示。图3是基于软件设计思维实现Y=a+b*c+d/e计算的过程。

图3 a+b*c+d/e的软件设计思维实现过程

②   硬件设计思维风格
硬件设计思维与软件设计思维有较大的区别,软件设计思维只需要考虑逻辑,基本不用考虑时序的问题,但是硬件设计思维处理模块功能,还需要考虑模块之间的耦合时序问题,具体设计风格如图4所示。图5是基于硬件设计思维实现Y=a+b*c+d/e计算的过程。
图4 硬件设计思维风格

图5 a+b*c+d/e的硬件设计思维实现过程

相比成熟的软件设计思维风格,硬件设计的思维风格被提及得不多,很多初学者尤其是有一定软件基础的码农朋友,一时半会无法转过弯,因此感觉到很难,那难在哪里?特别是在定位查找问题的时候
图7 软硬件设计思维查找问题的区别
就像图7所示一样,软件是按顺序执行,哪里有错很容易找出出错的地方;而FPGA只有在结果不对的时候,再回去找出问题的点,但那么多模块,到底是哪个出错了,是比较难定位的,这就是FPGA的难点之一。

(2)设计思维风格选择——4大建议2个推荐
软件设计思维和硬件设计的思维风格区别明显,在选择之前先通过表3了解两种风格的优缺点。

表3 软硬件设计思维风格优缺点
  
序号
            
内容点
            
硬件思维风格
            
软件思维风格
  
  
1
            
基本特点
            
清楚信号变化的需求、原因及时间,即什么信号变,什么时候变,为什么变
            
仅需清楚信号变化需求,忽略信号变化的时间及原因,即什么时候变
  
  
2
            
学习难度
            
入门难度大
            
入门容易
  
  
3
            
问题定位
            
1、刚学习容易碰壁,甚至放弃;
  
2、上手之后,面对复杂问题也能迎刃而解
            
1、小项目,简单容易;
  
2、随着项目工程变大,信号越多,时序越来越复杂,无从下手
  


如何选择合适的设计思维风格?建议两种风格都学习,结合起来用,在学的过程中先易后难,对于硬件设计思维,碰到困难问题,先放下,重效果实现暂时忽略细节,等知识经验积累丰富了,很多问题就会迎刃而解。具体6个建议如下:

1)   软件入门,硬件进阶:采用软件设计思维入门,同时注意硬件设计思维的存在,当设计水平遇到瓶颈时,学习硬件设计思维;
2)   软件硬件同步学习:两种设计思维相互补充,互相促进;
3)   小项目软件思维入门,大项目硬件升级:入门以后,随着大项目工作或者学习的开展,强烈建议采用硬件设计思维,这是一个优秀FPGA工程师必须具备的基本素质,很多企业也会有类似的要求,比如华为要求“一个always只能设计一个信号”,其根本上就是要求工程师要用硬件的思维来设计。
4)   硬件设计思维避免牛角尖:学习硬件设计思维,一定要避免钻牛角尖,切记不要以为是一定要想明白才去写代码、才去仿真验证,想不明白或者不能通过查资料,讨论等途径解决,就无法开展工作。FPGA设计思维尤其是硬件设计思维只是一个过程,正常的学习动作是写一点代码仿真一下,在设计过程中理解,在理解中改动设计,这才是正途。


推荐学习资源:

1)   专业的、标准的硬件设计思维学习资源科选择——《FPGA高手修炼》,该学习资源可以很好训练FPGA代码设计;
2)   FPGA的模块设计技巧,可参考《FPGA架构设计》。

(3)编译出错定位
使用开发工具过程经常会碰到很多问题,出来根据提示信息查找定位问题之外,也可以通过网络寻找同类问题解决方案。
备注——QUARTUS问题【汇总贴】推荐
常见QUARTUS问题汇总网址:(请点击这里)

(4)学会习仿真调试
仿真测试是FPGA工程师必须掌握的技能,FPGA工程师的基本工作状态是一个循环胎,即设计——仿真——调试——设计,因此,需要掌握相关的仿真调试方法,边设计边仿真调试,不断修正错误,直至完成设计目标。具体的要掌握的技能如下:
①测试文件的写法
1)   熟悉测试文件的格式:明确一个测试文件的基本组成要素,如模块名、信号定义、例化和产生测试激励等。
2)   掌握时钟和复位信号的产生方法:了解时钟、复位等信号的产生;
3)   掌握信号激励的产生方法:激励怎么产生,就是用那个initial语句,延时xx时间,给就一个1,再延时xx时钟,就给一个0。掌握这种基本的语法逻辑,在实际中基本够用了,具体参考如图8所示。

图8 信号激励产生示例
  掌握以上测试文件的编写方法,在实际中基本已经够用了,相比而言更重要的是看仿真波形。

②MODELSIM编译错误的处理方法
在MODELSIM编译过程中,如果代码有错误时,软件会提示报错,并且会提示哪一行出错,例如图3所示。

图3 编译报错示意图

图3提示:在pkt_check_tb.v这个文件,第34行,信号“din”有错误,可以去34行查看问题,关于问题查看与定位梳理以下6点建议:

1)   务必查看错误提示,不管愿不愿意看英文,这是必须要掌握的基本技能;

2)   强烈建议少用翻译软件理解错误提示,依赖翻译信息容易失去重点,在查找问题时,很多时候不需要全部理解,抓住关键词即可。如图3所示,文件名叫pkt_check_tb.v,是第34行,是信号din有错,这些信息已经足够了,然后根据提示打开pkt_check_tb.v文件,去34行,找到din信号,去看这代码跟标准的代码比,有哪些不同,就可以把问题查找出来;

3)   错误位置上下文也要看,在处理编译错误时,不要只看提示错误的行,上下的行业好看。有时候上行的错,会在下行中提示;
4)   不要害怕出现错误,在FPGA开发过程中,遇到错误时正常现象,而且很多时候,错误并没有那么多,常见的错误基本都是:信号定义错误,例如reg信号定义成wire,wire信号定义成reg;信号位宽有错,信号没定义等等;

5)   可以借助网络寻找解决问题的办法:在学习、开发过程,经常会遇到很多问题,可以通过网络寻找同类问题的解决办法,比如MODELSIM/仿真问题帖子:www.fpgabbs.cn/forum.php?mod=viewthread&tid=951;

④错误问题的定位方法

与软件开发一样,调试是FPGA开发最为耗时的一个环节,需要根据代码和波形,找出逻辑的错误。但与时序软件设计项目,FPGA的调试难度较大,不像软件那样支持但步调试,FPGA是一个并行硬件,所有模块是一起工作。在实际的工作中,更考验心态及心细程度,一般采用二分法树藤摸瓜解决问题,比如一个工程分为ABCDE5部分,现在E的结果有问题,具体定位过程如下:

1)   先看C是否正确,如果正确,说明错误由DE导致,如果错误,说明错误由AB引起;
2)   C正确:检查D的结果,如果D正确,则错误由E产生,反之由D产生;
3)   如果C错误:检查A的输出,如果A正确,则错误由B产生,反之由A产生;
4)   就这样一级一级排查,最终总会定位到问题所在点。

更多的FPGA问题定位技巧可参考:(请点击这里)


(5)在线调试
经过综合编译,下一步就是上板测试看效果。仿真通过不代表就是正确的,仿真只是模拟的仿真,仅说明“逻辑”正确,实际中还会有很多因素影响结果,比如管脚配置错误、硬件故障、信号干扰等问题。不同的开发工具都对应不同的在线调试工具,QUARTUS自带的SIGNALTAP、ISE自带的CHIPSCOPE,VIVADO本身的调试工具。在线调试工具与仿真工具类似,区别在于仿真通过电脑模拟,在线调试工具是抓取实际信号呈现结果。

备注1:在线工具具有局限性,只能看一小部分的信号以及有限的数据量,这意味着在线调试工具只能定位未知的小BUG,逻辑设计还是要靠仿真来保证。
备注2——SIGNALTAP的使用方法资源推荐:
Signaltap使用教程链接:(请点击这里)提取码:pj5s

4.仿动作——依葫芦画瓢入门案例,学基本动作要领
仿写现成案例是最快速也是最简单的学习方法,建议仿写案例从简单开始逐步过渡到,在仿写的过程中逐步掌握Verilog语法、计数器、位宽扩展等复杂应用并熟悉工具使用。推荐的仿写案例如下:

1)   LED灯系列:1位闪烁灯、4位闪烁灯、PWM呼吸灯等;
2)   数码管系列:数码管动态扫描、秒表、数字时钟等;

这些案例都可以通过互联网搜索到,或者通过购买开发板获得,具体的学习建议如下:

1)   抄写练习混脸熟:抄写一遍,以熟悉工具流程和熟悉语法为目的,并在抄写过程中理解常用的编程语法;
2)   盲写练习涨经验:盲写一遍,上板调试看结果,如有问题对比源码定位问题,盲写效果比抄写效果要好,印象更加深刻;
3)   谨慎扩展练习有耐心:在语法、工具还不熟悉,设计思维还没形成的情况下,不建议扩展功能,因为容易出错,浪费时间还打击信心。建议先仿写、盲写基本案例一个周期,通过对比学习中不断提升基础能力;
4)   谨慎开展设计有信心:很多初学者学一两个星期就开始设计,以为已经具备FPGA设计能力,这是误区。一般情况,FPGA和芯片设计工程师开始一两年都是开展验证的工作。优先的工程师都是建立在阅读理解、仿写及修改大量代码的基础上,才能逐步掌握设计能力。因此,开始设计不出来是正常的现象,没必要灰心。
5)   结合工具积累技巧:在学习过程中,结合QUARTUS、VIVADO、MODELSIM等工具和开发平台,不断积累并掌握掌握仿真、定位问题等技巧。

5.习基础——万丈高楼平地起,基础决触达定高度
以上是FPGA知识,要进阶成为FPGA图像工程师,除了FPGA基础知识之外,还需要掌握图像的概念及图像处理的方法,与FPGA学习一样,一开始并不需要去深度研读图像处理的相关原理书籍,可以通过仿写VGA显示颜色、VGA显示矩阵、VGA显示圆、VGA显示动画和VGA显示图片等图像基本实验掌握图像处理的基本概念:

1)   理解图像时序:理解图像传输的信号时序,例如行、场同步信号等;
2)   理解图像格式:理解图像的RGB888、RGB565、RAW12等数据格式;
3)   理解图像显示方法:理解一幅图像是如何将像素数据传到VGA、LED等显示设备进行显示的,是如何对齐的。理解这些,有助于实现画中画、图像拼接、裁减等高级功能的实现;
4)   理解图片动画实现方法:动画本质上是多幅图像的滚动显示,本质上也是图像显示。通过动画的实现方法,可以实现更种游戏的实现;
5)   理解图像存储的处理法:

6.练实战——闭门造车、战场上只能被KO
通过图像基础案例之后,可以开展一个具有代表性、完整性的FPGA图像处理项目——FPGA图像边缘检测,具体完成的内容包括:

1)   图像采集——OV7670:具体的内容包括OV7670传感器的配置、图像采集;(选择OV7670是因为该传感器资料众多,具有代表性,在掌握图像采集之后,可通过举一反三掌握AD、DA的配置方法,甚至可以延伸联系LVDS、MIMP及HDMI等图像视频接口);
2)   图像处理:包括灰度转换、图像格式转换、高斯滤波、SOBEL边缘检测算法(也可尝试中值滤波、腐蚀等图像处理算法);
3)   图像存储:与嵌入式计算机不同,FPGA的存储是一个难点,需要在硬件逻辑下考虑不同帧图像的处理关系,需要注意时序及存储容量的控制。
通过项目实践,掌握图像采集、图像处理、图像存储及图像显示等常见图像处理的功能,同时对图像数据带宽等概念有了深入的理解和认识,比如1080P、4K和8K等。
备注——FPGA图像边缘检测实践资料(请点击这里)

总结与后续——高手过招,每一个伤疤都是大牛的垫脚石
至此,一步一个脚印走完六步法,完成图像边沿检测的项目,基本走完从小白到FPGA图像工程师入门之路,无论是知识还是信心都有了质的飞跃。如果能在学习过程中学会举一反三、触类旁通,找个心仪的工作问题不会太大。
能力和经验的提升是一个长期的过程,强烈建议基于上述知识基础及问题解决的技巧,开展更多的项目实践、比如图像的放大缩小、车牌识别、手势识别等,LVDS、MIPI、HDMI接口等高速接口,也可以开展4K、8K图像处理掌握更高速、更复杂的FPGA图像处理项目。在成功喜悦和失败煎熬的锤炼下,你或许也会跟我一样感慨,成为大牛并没有想象中那么难!

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝