?图像工程师的六脉神剑——“选扫掌仿习练” ——不是每个人都能成为一代宗师,因为在一个时代宗师只有少数人,成不了宗师,可以选择成为门派高手,立足武林的六合一之路无外乎秘密武器、江湖规矩、内功心法、武术动作、内功修炼及实战经验。修炼六脉神剑,成为高手,行走江湖,行侠仗义,斩奸除恶,开启江湖人生! 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 安装包大小 电脑配置要求 快(分钟计算) 慢(小时计算) 操作便捷性 约束严谨性 多(尤其中文) 少(英文为主) 相比而言,QUARTUS无论是对资源的要求,还是使用简单性都要优于VIVADO,但功能的齐全性低于VIVADO,综合市面上Intel的FPGA开发板相对比较便宜, 建议初学者先选择QUARTUS入门学习,掌握熟悉之后,根据个人情况及开展具体项目的要求,再学习使用VIVADO 备注——综合编译工具下载地址: 1) QUARTUS软件安装包,建议安装18.1精简版本的,不需要破解。 下载地址: http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=429&extra=page%3D1 2) VIVADO软件安装包,建议安装2018.2版本的,在XILINX官网可注册LICENSE。 下载地址: http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=435&highlight=vivado ②仿真工具——业界主流MODELSIM QUARTUS与VIVADO都自带仿真器,但是不好使用,目前业界基本都是使用MODELSIM作为FPGA仿真工具,基本是标配。 备注——仿真工具下载地址: 下载及安装教程地址: http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=430&extra=page%3D1 ③代码编写工具——优选GVIM,可选NOTEPAD++ QUARTUS、VIVADO、MODELSIM都自带有代码编写器,但交互性不好,强烈建议选用GVIM、NOTEPAD++等代码编写工具。 在Windows系统环境下,可以采用NOTEPAD++,特别是从软件转行过来,已经习惯NOTEPAD++使用的开发者。但 如果想在IC设计、IC验证或者FPGA上走得更远,强烈建议选择GVIM ,一方面IC行业基本都在使用GVIM,另一方面来自于工具本身功能足够强大,不仅支持常规的编辑、复制、删除、查找、替换等功能,而且支持“命令行”输入。 备注——Windows版本GVIM工具下载地址: 下载及安装教程地址 http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=431&extra=page%3D1 (2)开发工具使用 ①VIVADO和QUARTUS使用方法 VIVADO和QUARTUS的功能,最常用的功能包括: 新建工程、选好芯片型号、配置好管脚、综合编译和上板调试等功能 。各个工具都是大同小异,但要注意学习FPGA不是学工具,而是学习如何设计、学习如何定位问题和解决问题。 ——VIVADO和QUARTUS使用资料推荐 VIVADO使用教程链接 http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=1023&extra=page%3D1 QUARTUS使用教程链接 https:// pan.baidu.com/s/1Zf-bjX F4v72tXx2NnEfCsw :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知识点 always ①了解时序逻辑和组合逻辑的always: ②了解它们的区别,了解D触发器的原理、波形、建立时间和保持时间这些概念; if else和case语句 理解选择条件,理解case用法 理解时钟、复位及使能的作用,重点培养根据代码理解波形,这点非常重要 算术运算符、逻辑运行符和比较符等 Verilog里的加减乘除等用法、与或非门的用法、大于等于小于等的用法,这些实现功能的基本元素 写时钟、复位和使用initial产生激励 掌握基本的仿真文件编写技巧,掌握时钟、复位等信号产生,例化设计对象,产生激励源 推荐的书: 夏老师的《verilog HDL数字系统设计教程》 ,这是一本经典的verilog书籍,已出版十几年,一直很受欢迎; 《FPGA至简原理与应用》 ,该书还没有出版,只有电子版, 配套视频讲解帮助学习 3.掌心法——FPGA软硬心法核心在至简,避免走火入魔 FPGA的设计 (1)FPGA软硬件设计思维风格 FPGA需要编程实现,但实际是硬件设计,这与软件设计有本质的区别: ① 软件设计思维风格
图2 软件思维设计风格 软件设计思维即指熟悉的C、C++、Java等软件编程的思维,可以边写代码,边看处理看结果,风格如图2所示。图3是基于软件设计思维实现Y=a+b*c+d/e计算的过程。
a+b*c+d/e的软件设思维计实现过程(GIF) ② 硬件设计思维风格 硬件设计思维与软件设计思维有较大的区别,软件设计思维只需要考虑逻辑,基本不用考虑时序的问题,但是硬件设计思维处理模块功能,还需要考虑模块之间的耦合时序问题,具体设计风格如图4所示。图5是基于硬件设计思维实现Y=a+b*c+d/e计算的过程。
图4 硬件设计思维风格
a+b*c+d/e的硬件设计思维实现过程 相比成熟的软件设计思维风格,硬件设计的思维风格被提及得不多,很多初学者尤其是有一定软件基础的码农朋友,一时半会无法转过弯,因此感觉到很难,那难在哪里?特别是在定位查找问题的时候
图7 软硬件设计思维查找问题的区别 就像图7所示一样,软件是按顺序执行,哪里有错很容易找出出错的地方;而FPGA只有在结果不对的时候,再回去找出问题的点,但那么多模块,到底是哪个出错了,是比较难定位的,这就是FPGA的难点之一。 (2)设计思维风格选择——4大建议2个推荐 软件设计思维和硬件设计的思维风格区别明显,在选择之前先通过表3了解两种风格的优缺点。 表3 软硬件设计思维风格优缺点 硬件思维风格 软件思维风格 清楚信号变化的需求、原因及时间,即什么信号变,什么时候变,为什么变 仅需清楚信号变化需求,忽略信号变化的时间及原因,即什么时候变 入门难度大 1、刚学习容易碰壁,甚至放弃; 2、上手之后,面对复杂问题也能迎刃而解 1、小项目,简单容易; 2、随着项目工程变大,信号越多,时序越来越复杂,无从下手 如何选择合适的设计思维风格?建议两种风格都学习,结合起来用,在学的过程中先易后难,对于硬件设计思维,碰到困难问题,先放下,重效果实现暂时忽略细节,等知识经验积累丰富了,很多问题就会迎刃而解。具体6个建议如下: 软件入门,硬件进阶 :采用软件设计思维入门,同时注意硬件设计思维的存在,当设计水平遇到瓶颈时,学习硬件设计思维; 软件硬件同步学习 :两种设计思维相互补充,互相促进; 小项目软件思维入门,大项目硬件升级 :入门以后,随着大项目工作或者学习的开展,强烈建议采用硬件设计思维,这是一个优秀FPGA工程师必须具备的基本素质,很多企业也会有类似的要求,比如华为要求“一个always只能设计一个信号”,其根本上就是要求工程师要用硬件的思维来设计。 硬件设计思维避免牛角尖 :学习硬件设计思维,一定要避免钻牛角尖,切记不要以为是一定要想明白才去写代码、才去仿真验证,想不明白或者不能通过查资料,讨论等途径解决,就无法开展工作。FPGA设计思维尤其是硬件设计思维只是一个过程,正常的学习动作是写一点代码仿真一下,在设计过程中理解,在理解中改动设计,这才是正途。 推荐学习资源: 专业的、标准的硬件设计思维学习资源科选择——《FPGA高手修炼》 ,该学习资源可以很好训练FPGA代码设计; FPGA的模块设计技巧,可参考《FPGA架构设计》 (3)编译出错定位 使用开发工具过程经常会碰到很多问题,出来根据提示信息查找定位问题之外,也可以通过网络寻找同类问题解决方案。 备注——QUARTUS问题【汇总贴】推荐 常见QUARTUS问题汇总网址 http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=901 (4)学会习仿真调试 仿真测试是FPGA工程师必须掌握的技能,FPGA工程师的基本工作状态是一个循环胎,即设计——仿真——调试——设计,因此, 需要掌握相关的仿真调试方法,边设计边仿真调试,不断修正错误,直至完成设计目标 。具体的要掌握的技能如下: ①测试文件的写法 熟悉测试文件的格式 :明确一个测试文件的基本组成要素,如模块名、信号定义、例化和产生测试激励等。 掌握时钟和复位信号的产生方法 :了解时钟、复位等信号的产生; 掌握信号激励的产生方法 :激励怎么产生,就是用那个initial语句,延时xx时间,给就一个1,再延时xx时钟,就给一个0。掌握这种基本的语法逻辑,在实际中基本够用了,具体参考如图8所示。
图8 信号激励产生示例 掌握以上测试文件的编写方法,在实际中基本已经够用了,相比而言更重要的是看仿真波形。 ②MODELSIM编译错误的处理方法 在MODELSIM编译过程中,如果代码有错误时,软件会提示报错,并且会提示哪一行出错,例如图3所示。
图3 编译报错示意图 图3提示:在pkt_check_tb.v这个文件,第34行,信号“din”有错误,可以去34行查看问题,关于问题查看与定位梳理以下6点建议: 务必查看错误提示 ,不管愿不愿意看英文,这是必须要掌握的基本技能; 强烈建议少用翻译软件理解错误提示 ,依赖翻译信息容易失去重点,在查找问题时,很多时候不需要全部理解,抓住关键词即可。如图3所示,文件名叫 pkt_check_tb.v 信号din 有错,这些信息已经足够了,然后根据提示打开pkt_check_tb.v文件,去34行,找到din信号,去看这代码跟标准的代码比,有哪些不同,就可以把问题查找出来; 错误位置上下文也要看 ,在处理编译错误时,不要只看提示错误的行,上下的行业好看。有时候上行的错,会在下行中提示; 不要害怕出现错误 ,在FPGA开发过程中,遇到错误时正常现象,而且很多时候,错误并没有那么多,常见的错误基本都是:信号定义错误,例如reg信号定义成wire,wire信号定义成reg;信号位宽有错,信号没定义等等; 可以借助网络寻找解决问题的办法 :在学习、开发过程,经常会遇到很多问题,可以通过网络寻找同类问题的解决办法,比如MODELSIM/仿真问题帖子: ④错误问题的定位方法 与软件开发一样,调试是FPGA开发最为耗时的一个环节,需要根据代码和波形,找出逻辑的错误。但与时序软件设计项目,FPGA的调试难度较大,不像软件那样支持但步调试,FPGA是一个并行硬件,所有模块是一起工作。 在实际的工作中,更考验心态及心细程度,一般采用二分法树藤摸瓜解决问题 ,比如一个工程分为ABCDE5部分,现在E的结果有问题,具体定位过程如下: 1) 先看C是否正确,如果正确,说明错误由DE导致,如果错误,说明错误由AB引起; 2) C正确:检查D的结果,如果D正确,则错误由E产生,反之由D产生; 3) 如果C错误:检查A的输出,如果A正确,则错误由B产生,反之由A产生; 4) 就这样一级一级排查,最终总会定位到问题所在点。 更多的FPGA问题定位技巧可参考: http://www. fpgabbs.cn/forum.php? mod=viewthread&tid=268 (5)在线调试 经过综合编译,下一步就是上板测试看效果。仿真通过不代表就是正确的,仿真只是模拟的仿真,仅说明“逻辑”正确,实际中还会有很多因素影响结果,比如管脚配置错误、硬件故障、信号干扰等问题。不同的开发工具都对应不同的在线调试工具,QUARTUS自带的SIGNALTAP、ISE自带的CHIPSCOPE,VIVADO本身的调试工具。在线调试工具与仿真工具类似,区别在于仿真通过电脑模拟,在线调试工具是抓取实际信号呈现结果。 在线工具具有局限性,只能看一小部分的信号以及有限的数据量,这意味着在线调试工具只能定位未知的小BUG,逻辑设计还是要靠仿真来保证。 备注2——SIGNALTAP的使用方法资源推荐: Signaltap使用教程链接 https:// pan.baidu.com/s/1o6ti4Z r31mRw2qKYrMQQQg :pj5s 4.仿动作——依葫芦画瓢入门案例,学基本动作要领 仿写现成案例是最快速也是最简单的学习方法,建议仿写案例从简单开始逐步过渡到,在仿写的过程中逐步掌握Verilog语法、计数器、位宽扩展等复杂应用并熟悉工具使用。推荐的仿写案例如下: LED灯系列 :1位闪烁灯、4位闪烁灯、PWM呼吸灯等; 数码管系列 :数码管动态扫描、秒表、数字时钟等; 这些案例都可以通过互联网搜索到,或者通过购买开发板获得,具体的学习建议如下: 抄写练习混脸熟 :抄写一遍,以熟悉工具流程和熟悉语法为目的,并在抄写过程中理解常用的编程语法; 盲写练习涨经验 :盲写一遍,上板调试看结果,如有问题对比源码定位问题,盲写效果比抄写效果要好,印象更加深刻; 谨慎扩展练习有耐心 :在语法、工具还不熟悉,设计思维还没形成的情况下,不建议扩展功能,因为容易出错,浪费时间还打击信心。建议先仿写、盲写基本案例一个周期,通过对比学习中不断提升基础能力; 谨慎开展设计有信心 :很多初学者学一两个星期就开始设计,以为已经具备FPGA设计能力,这是误区。一般情况,FPGA和芯片设计工程师开始一两年都是开展验证的工作。优先的工程师都是建立在阅读理解、仿写及修改大量代码的基础上,才能逐步掌握设计能力。因此,开始设计不出来是正常的现象,没必要灰心。 结合工具积累技巧 :在学习过程中,结合QUARTUS、VIVADO、MODELSIM等工具和开发平台,不断积累并掌握掌握仿真、定位问题等技巧。 5.习基础——万丈高楼平地起,基础决触达定高度 以上是FPGA知识,要进阶成为FPGA图像工程师,除了FPGA基础知识之外,还需要掌握图像的概念及图像处理的方法,与FPGA学习一样,一开始并不需要去深度研读图像处理的相关原理书籍,可以通过仿写 VGA显示颜色、VGA显示矩阵、VGA显示圆、VGA显示动画和VGA显示图片等 图像基本实验掌握图像处理的基本概念: 理解图像时序 :理解图像传输的信号时序,例如行、场同步信号等; 理解图像格式 :理解图像的RGB888、RGB565、RAW12等数据格式; 理解图像显示方法 :理解一幅图像是如何将像素数据传到VGA、LED等显示设备进行显示的,是如何对齐的。理解这些,有助于实现画中画、图像拼接、裁减等高级功能的实现; 理解图片动画实现方法 :动画本质上是多幅图像的滚动显示,本质上也是图像显示。通过动画的实现方法,可以实现更种游戏的实现; 理解图像存储的处理法: 6.练实战——闭门造车、战场上只能被KO 通过图像基础案例之后,可以开展一个具有代表性、完整性的FPGA图像处理项目——FPGA图像边缘检测,具体完成的内容包括: 图像采集——OV7670 :具体的内容包括OV7670传感器的配置、图像采集;(选择OV7670是因为该传感器资料众多,具有代表性,在掌握图像采集之后,可通过举一反三掌握AD、DA的配置方法,甚至可以延伸联系LVDS、MIMP及HDMI等图像视频接口); 图像处理: 包括灰度转换、图像格式转换、高斯滤波、SOBEL边缘检测算法(也可尝试中值滤波、腐蚀等图像处理算法); :与嵌入式计算机不同,FPGA的存储是一个难点,需要在硬件逻辑下考虑不同帧图像的处理关系,需要注意时序及存储容量的控制。 通过项目实践,掌握图像采集、图像处理、图像存储及图像显示等常见图像处理的功能,同时对图像数据带宽等概念有了深入的理解和认识,比如1080P、4K和8K等。 备注——FPGA图像边缘检测实践资料 http://www. fpgabbs.cn/thread-879-1 -1.html 总结与后续——高手过招,每一个伤疤都是大牛的垫脚石 至此,一步一个脚印走完六步法,完成图像边沿检测的项目,基本走完从小白到FPGA图像工程师入门之路,无论是知识还是信心都有了质的飞跃。如果能在学习过程中学会举一反三、触类旁通,找个心仪的工作问题不会太大。
能力和经验的提升是一个长期的过程,强烈建议基于上述知识基础及问题解决的技巧,开展更多的项目实践、比如图像的放大缩小、车牌识别、手势识别等,LVDS、MIPI、HDMI接口等高速接口,也可以开展4K、8K图像处理掌握更高速、更复杂的FPGA图像处理项目。在成功喜悦和失败煎熬的锤炼下,你或许也会跟我一样感慨,成为大牛并没有想象中那么难!
如果你也有相关问题的可以讨论V:xingxingge699
|