作为一个没有任何FPGA和verilog开发经验的小白团队,在做这个期间,就是纯纯受折磨,不过,在饱经折磨的期间,还是学到了不少东西的。接下来我就为大家分享一下我们学这些的经验。
我们选择的海云捷讯杯,杯赛的题目是“基于FPGA的工业缺陷检测”。讲道理,当时看杯赛的要求就是有点懵逼的,当时属于“我是谁?我在哪?完全不懂啊?这也是我配碰的?”博主有大半年的嵌入式开发经验,但是因为是大部分自学,外加学业繁重,虽然在后期学习SOC上的arm核时学的轻松一点,但还是无法影响大局。不多说,给大家看看要求先:
说句良心话,一开始真没看懂这些玩意是啥,什么pl端啊,什么CNN啊,这都啥啊?不过我们组里有个大佬,是做过深度学习的,所以他就领走了神经CNN算法这一部分,剩下我和另外一个队友先学一下硬件部分,毕竟我们确实都不懂(打到后来才发现我们的分工有着巨大的失误,但是因为我们本身是材料出身,也没啥指导,就摸着头瞎找,确实走了不少的弯路)。
好,那么接下来就是学习部分了,一开始肯定要学习基础知识啊。FPGA开发的第一步就是要学会verilog语言,硬件描述语言(HDL)你总得会吧,要不然你怎么写代码。HDL包括verilog和VHDL等,VHDL编辑代码时描述较长,两者的语法等都各不相同,各有优劣。具体的区别大家可以去网上百度一下,大部分人都选择verilog开发(我感觉都是这样的)。那怎么学verilog呢,首先verilog和C语言是大大滴不同,C语言类似于串行结构,按照上下逻辑顺序依次编译,而verilog则是并行运算的,并行运算就会带来一个很大的优势,那就是计算速度超级快。拿C语言举例,计算加法1+1=2时,得依次调用1,1和+号,而verilog可以直接同时输入两个1,并且由于加法电路是实时生成的,省去了寻址等工作量,速度就要快上很多。这里推荐一个verilog的学习网站
HDLBITS:HDLBits
这是学习verilog语言,和联系习题的最快途径了,至少简单的语法等能快速入门,至于答案,知乎上都能找得到。
学习完verilog语言后,那肯定要知道我们学他干啥对吧,好,FPGA就是基于verilog开发的,也就是说,我们开始认定,我们比赛应该用verilog开发,那么问题来了FPGA是什么,我以前用过的STM32,51,ardunio和他们有啥区别,还有SOC又是啥,arm是什么东西?首先呢,FPGA全名是(Field Programmable Gate Array)即现场可编程门阵列,那就是说,他可以通过我编写的代码,生成我想要的电路咯。51大家都熟悉咯,经典点亮小灯实验都历历在目吧,ardunio类似于一个平台,用了各种的ardunio的板子和对应的IDE软件,在IDE编译好代码后,上传到对应的硬件后即可执行功能。STM32对比C51和ardunio有什么区别呢?STM32属于中高端芯片,而C51属于低端芯片,两者首先性能差距就十分大。STM32属于cortex内核,而51属于intel8051内核。51用寄存器做外设,而32调用库函数来调用外设。两者指令集也有所差异,32上可以执行操作系统,而51的资源相对差了很多。ardunio对硬件要求不高,大部分函数等都已经封装好了,只需要会编程就可以了。STM32等系列单片机可以理解为一个微型的CPU,里面集成了各种各样的已经固化好了的电路,芯片等,但是FPGA类似于半固化的集成电路,是可以实时生成新的电路的,但是STM32只能利用已经固化好的功能与资源。同时,最大的区别就是,单片机是类似C语言的,一行一行执行逻辑,但是FPGA是并行的。FPGA适用于高速运算,单片机适用于逻辑控制。SOC又称片上系统,常常与arm核与其他芯片共同构成系统,而本次比赛官方提供的云平台即是继承了arm核和FPGA的SOC。
学习完基础的verilog语法后,接下来就应该学习怎么编译出具体的电路,我们学习的视频是野火的FPGA教学,野火的FPGA教学十分的全面,从一开始的环境配置,(环境配置就是配置quartus ii核modesim,还有notepad++,quartus ii主要用于基于intel 内核的FPGA的编译,那么,与之对应的就是vivado,vivado主要用于xilinx的板子的开发。modesim主要是仿真软件,可以看到编译的verilog的时序图,notepad++想必大家都很熟了吧,经常写代码的肯定很熟悉,我觉得这就相当于高级记事本)到加法器,到计数器,再到IP核的调用,都讲的十分清楚,下面就是野火的视频链接:
【野火】FPGA系列教学视频,真正的手把手教学,“波形图”教学法,现场画波形图写代码,硬件基于野火FPGA EP4CE10征途系列开发板,已完结_哔哩哔哩_bilibili不得不说,野火还得是野火,STM32的板子是野火那买的,FPGA的板子也是野火那里买的,STM32是看着江科大自化协学的,当时也是纯靠着他入门的(讲的是真的好)。野火的FPGA教程十分长,有整整236节课,如果能坚持看完,还是有很大的收获的,讲的很全面,很细,基础也很扎实。(反正我当时是没看完的)。学习完这些视频后,会对verilog产生一个基础的认知。对具体的电路也会产生一个大致的认知。那么看完后,就应该要对比赛题目进行好好的分析吧。
题目要求使用PL端的摄像头数据,完成图像预处理。PL端指的就是FPGA端,那么对应的PS端指的就是ARM端。前面有说到,一块硬核soc上集成了FPGA与arm的硬核,FPGA多用来做高速运算,而arm多用来做推理加速。PL端的摄像头数据,指的就是利用PL端接收来自摄像头的数据,
首先采用虚拟摄像头,通过摄像头拍摄好图像数据后,导入DVP接口,DVP接口即基于DVP协议的接口,DVP(Digital video port)是并行传输,数据位宽有8bit,10bit ,12bit等。属于非差分信号,最高速率要比串行输入的MIPI(一种标准化的通信协议,目前最成熟的是DSI(显示接口)和CSI(摄像接口)低,高像素的话使用起来会比较吃力。
注:CSI和DSI目前物理层标准是D-PHY,D-PHY采用1对源同步的差分时钟和1~4对差分数据线来进行数据传输。数据传输采用DDR方式传播。D-PHY的物理层支持HS(High Speed)和LP(Low Power)两种工作模式。HS模式下采用低压差分信号,功耗较大,但是可以传输很高的数据速率(数据速率为80M~1Gbps); LP模式下采用单端信号,数据速率很低(<10Mbps),但是相应的功耗也很低。两种模式的结合保证了MIPI总线在需要传输大量数据(如图像)时可以高速传输,而在不需要大数据量传输时又能够减少功耗。
源同步时钟:
通过控制DLL延时器件的delay时间,让时钟信号与数据信号同时到达,从而达到同步的作用。
源同步差分时钟:
源同步差分时钟,顾名思义,源同步的基础上加上差分,我们知道DDR是双倍率速度,在时钟的上升沿和下降沿都会读取,达到双倍率的目的,故此,温度电阻等对时钟的波形产生的延迟,变形的影响就会很显著,而这个CK#就是差分信号,与CK完全相反,受到影响时,由图可知,CK上升慢时CK#下降的就快,以此形成差分,从而达到平衡的目的。
差分数据线:就是用两个平行的,等长的,相位差180度的同一数据线,两者一减,就可以得到两倍强度的信号,不仅可以增强信号,同时两边受到干扰相同,也可以直接减去这部分的干扰。
CSI:CSI-2对摄像头的数据处理过程由应用层,协议层,物理层组成,其中协议层包括像素字节转化层,低协议层,Lane管理层
应用层:如图中1区域所示,应用层同时处理来自摄像头的数据并把最后转化得到的数据转化为SOC所需要的数据并输出。
协议层:CSI协议可让SOC一个端口接受多条数据流。协议层规定了如何具体的识别对应的数据流。
像素字节转化层:
在如图2-1的位置,像素字节转化层分别将摄像头传输的像素数据转化为字节数据,并在输出时,转化回像素数据。
低协议层:
SOT(起始符Start of Transmission)与EOT(停止符 End of Transmission)的数据包传输协议。发送数据之前,发送方通常会加上SOT标识数据包的开始,以便接收方准确获取信息的起始点。当接收方接收到一个数据包时,会查找数据包中的EOT标识,以判断数据包何时结束
Lane管理层:
为了适应不同环境的带宽要求,Lane的作用就是将数据按lane线数平均分流传输,再在接收方合并
物理层:
物理层即PHY层,同时支持High Speed 和Lower Power两种模式。HS模式下,低压差分信号,速率快,LP模式下,单数据流传输,功耗低,两者协调可以有效利用MIPI总线
DSI:
显示器串行接口规范(Display Serial Interface Specification,DSI)。基于D-PHY物理层规范。基于SLVS(串行/并行转化器接口,用于高速数据传输)的物理层支持高达1Gbps的数据速率,同时产生极小的噪声。
功能:低功率模式、双向通信、16、18和24位像素的本国语言支持,并具备单一接口驱动4块显示屏的能力,以及对缓冲和非缓冲面板的支持。
串行接口一般采用差分结构,利用几百mV的差分信号,在收发端之间传送数据。串行比并行相比:更节省PCB板的布线面积,增强空间利用率;差分信号增强了自身的EMI(电磁干扰)抗干扰能力,同时减少了对其他信号的干扰;低的电压摆幅可以做到更高的速度,更小的功耗.
MIPI介绍(CSI DSI接口)_mipi接口_学无止境_Charles的博客-CSDN博客
回到DVP接口,DVP接进来的数据通过FPGA的ip核导入ps端,在通过ps端的ddr3控制器将数据存入DDR3中,这就完成了数据的读取与存放。题目中提到了图像预处理,那么图像预处理指的是什么呢?
DRAM:动态随机存储器,一种半导体存储器,利用电容内存储电荷的多少来代表一个二进制比特(bit)是1还是0。由于在现实中晶体管会有漏电电流的现象,导致电容上所存储的电荷数量并不足以正确的判别数据,而导致数据毁损。因此对于DRAM来说,周期性地充电是一个无可避免的要件。由于这种需要定时刷新的特性,因此被称为“动态”存储器。如,wirte线上写入高电平,M1导通,M1与M3的节点上充电,CS充点,此时状态为1,若写入0,M1关闭,CS缓慢放电,达到为0的目的。
SDRAM:具有同步接口的动态随机存储器,DRAM有一个异步端口,而SDRAM有一个同步接口,在接到系统输入后,会等待一个时钟周期后,来达到与系统总线同步的目的。
DDR3:DDR(Double Data Rate SDRAM)指的是双倍率同步动态随机存储器,可以理解为,一般的存储器在时钟上升沿工作,但是DDR同时利用了时钟的上升沿和下降沿,因此就达到了双倍率的目的,而DDR2在DDR的基础上又提速了两倍,频率上没有提升,但是传输数据的位宽由2位变成了4位,便等于速率上提升了两倍。DDR3则是从4位变成了8位,因此速率也等同于提升了DDR2的两倍。