OV5640摄像头+动态彩条\n\n输入Sensor是本工程的输入设备,其一为OV5640摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:\n\n

\n\nSENSOR_TYPE=0;则输出OV5640摄像头采集的视频;\n\nSENSOR_TYPE=1;则输出动态彩条的视频;\n\nOV5640摄像头需要i2c初始化配置,本设计配置为1280x720@30Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV5640摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV5640摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:\n\n

\n\n### 输入视频之-->ADV7611芯片解码HDMI+动态彩条\n\n输入视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用板载的HDMI视频输入接口;如果你的手里没有HDMI输入口,则可使用FPGA内部逻辑生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的parameter参数配置,默认使用HDMI视频输入接口视频源;HDMI解码方案为ADV7611芯片,使用纯verilog实现的i2c模块对ADV7611芯片做初始化配置,输出分辨率配置为1920x1080@60Hz;模块顶层接口如下:\n\n

\n\nparameter SENSOR_TYPE = 0;输出ADV7611解码的HDMI视频\n\nparameter SENSOR_TYPE = 1;输出动态彩条的视频 \n\nADV7611芯片配置采集代码如下:\n\n

\n\n### 视频数据组包\n\n由于视频需要在GTY 中通过aurora 8b/10b协议收发,所以数据必须进行组包,以适应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:\n\n

\n\n首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入GTY发送;在此之前,需要对一帧视频进行编号,也叫作指令,GTY组包时根据固定的指令进行数据发送,GTY解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好理解,所以我在代码里进行了详细的中文注释,需要注意的是,为了防止中文注释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:\n\n

\n\n注意!!!指令可以任意更改,但最低字节必须为bc;\n\n### 基于GTY高速接口的视频传输架构\n\n本设计使用GTY高速接口传输视频,使用8b/10b编解码协议,搭建基于GTY高速接口的视频传输架构,包括视频数据组包模块、GTY IP核配置调用、接收数据对齐模块、视频数据解包模块等部分,总体代码架构如下:\n\n

\n\n基于GTY高速接口的数据回环传输架构顶层接口核参数配置如下:\n\n

\n\n本设计共例化了2路GTY,所以2路GTY的收发回环方式也做了灵活的参数化配置,如果你只需要1路GT,则可删除另一路,如果你想例化更多路GT,则可根据上述设计方法扩展,十分方便;\n\n### GTY IP 简介\n\n关于GTY介绍最详细的肯定是Xilinx官方的《ug578-ultrascale-gty-transceivers》,我们以此来解读:《ug578-ultrascale-gty-transceivers》的PDF文档我已放在了资料包里;我用到的开发板FPGA型号为Kirtex7-UltraScale+-xcku5p-ffvb676-1-i;带有16路GTY资源,其中2路连接到了板载2个SFP光口,每通道的收发速度为 500 Mb/s 到 32.75 Gb/s 之间。GTY收发器支持不同的串行传输接口或协议,比如8b/10b编解码、PCIE /2.0/3.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;\n\n### GTY 基本结构\n\nGTY 基本结构如下:\n\n

\n\nXilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为GTY收发器在Kintex7 UltraScale+ FPGA 芯片中的示意图:《ug578-ultrascale-gty-transceivers》第17页;\n\n在 Ultrascale+架构系列的 FPGA 中,GTY 高速收发器通常使用 Quad 来划分,一个 Quad 由四个GTHE4_CHANNEL 原语和一个 GTHE4_COMMON 原语组成。每个GTHE4_COMMON 中包含两个 LC-tank pll(QPLL0 和 QPLL1)。只有在应用程序中使用 QPLL 时,才需要实例化 GTHE4_COMMON。每个 GTHE4_CHANNEL 由一个 channel PLL(CPLL)、一个 transmitter,和一个 receiver 组成。一个参考时钟可以直接连接到一个 GTHE4_CHANNEL 原语,而不需要实例化 GTHE4_COMMON;\n\nGTY 收发器的发送端和接收端功能是相互独立,都是由 Physical Media Attachment(物理媒介适配层 PMA)和Physical Coding Sublayer(物理编码子层 PCS)组成。PMA 内部集成了串并转换(PISO)、预加重、接收均衡、时钟发生器和时钟恢复等;PCS 内部集成了 8b/10b 编解码、弹性缓冲区、通道绑定和时钟修正等,每个 GTHE4_CHANNEL源语的逻辑电路见《ug578-ultrascale-gty-transceivers》第17页;\n\n### GTY 发送和接收处理流程\n\n首先用户逻辑数据经过 8B/10B 编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 设计时不慎将 TXP 和 TXN 差分引脚交叉连接,则可以通过极性控制(Polarity)来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。这里的每一个功能点都可以写一篇论文甚至是一本书,所以这里只需要知道个概念即可,在具体的项目中回具体用到,还是那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。\n\n### GTY 的参考时钟\n\nUltraScale+ 器件中的 GTY 收发器提供了不同的参考时钟输入选项。参考时钟选择架构支持 QPLL0、QLPLL1 和CPLL。从架构上讲,每个 Quad 包含四个 GTHE4_CHANNEL 原语,一个 GTHE4_COMMON 原语,两个专用的外部参考时钟引脚对,以及专用的参考时钟路由。如果使用到了高性能 QPLL,则必须实例化 GTHE4_COMMON,如下面 GTHE4_COMMON 时钟多路复用器结构的详细视图所示,(《ug578-ultrascale-gty-transceivers》第31页)在一个 Quad 中有 6 个参考时钟引脚对,两个本地参考时钟引脚对:GTREFCLK0或GTREFCLK1,两个参考时钟引脚对来自上面的两个Quads:GTSOUTHREFCLK0或 GTSOUTHREFCLK1,两个参考时钟引脚对来自下面的两个 Quads: GTNORTHREFCLK0 或GTNORTHREFCLK1。\n\n

\n\n### GTY 发送接口\n\n《ug578-ultrascale-gty-transceivers》的第`101到182页`详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTY 例化时留给用户的发送部分需要用到的接口;用户只需要关心发送接口的时钟和数据即可,以例化2路GTY为例,经本博主优化,用户只需要关心如下GTY发送接口即可快速使用GTY;\n\n

\n\n### GTY 接收接口\n\n《ug578-ultrascale-gty-transceivers》的第`183到321页`详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTY例化时留给用户的发送部分需要用到的接口;用户只需要关心接收接口的时钟和数据即可,以例化2路GTY为例,经本博主优化,用户只需要关心如下GTY接收接口即可快速使用GTY;\n\n

\n\n### GTY IP核调用和使用\n\nGTY IP核配置调用在工程种位置如下:\n\n

\n\nGTY IP核调用和使用很简单,通过vivado的UI界面即可完成,如下:\n\n

\n\nGTY基本配置如下:板载差分晶振125M,线速率配置为5G,协议类型被指为aurora 8b/10b;如下:\n\n

\n\n相较于Xilinx 7系列FPGA的GT高速接口,UltraScale系列FPGA在物理约束页也有较大改进,已不需要用户再去查看官方数据手册找到原理图所在的FPGA内部位置,而是直接给出了详细PIN脚,只要在这里选对了位置,GT高速接口的时钟和数据引脚在XDC中已不再需要约束,如下:\n\n

\n\n此外,有别于Xilinx 7系列FPGA的GT高速接口;UltraScale+系列FPGA的GT高速接口在控制引脚方面更加细节,用户可以选择具体哪些控制引脚被使用,当然,这需要开发人员对SERDES技术有较高的认知,在此基础上,可使我们的设计更加便捷,对于8B/10编解码协议而言,开发者可能只需关注并使用极性反转控制,如果需要动态变速,可能还需要使用DRP接口,其余功能性接口其实不必太过关注;如下:\n\n

\n\n### 接收数据对齐模块\n\n由于GT资源的aurora 8b/10b数据收发天然有着数据错位的情况,所以需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:\n\n

\n\n我定义的 K 码控制字符格式为:XX_XX_XX_BC,所以用一个rx_ctrl 指示数据是否为 K 码 的 COM 符号;\n\nrx_ctrl = 4\'b0000 表示 4 字节的数据没有 COM 码;\n\nrx_ctrl = 4\'b0001 表示 4 字节的数据中[ 7: 0] 为 COM 码;\n\nrx_ctrl = 4\'b0010 表示 4 字节的数据中[15: 8] 为 COM 码;\n\nrx_ctrl = 4\'b0100 表示 4 字节的数据中[23:16] 为 COM 码;\n\nrx_ctrl = 4\'b1000 表示 4 字节的数据中[31:24] 为 COM 码;\n\n基于此,当接收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的基础操作,这里不再赘述;数据对齐模块顶层接口如下:\n\n

\n\n### 视频数据解包\n\n数据解包是数据组包的逆过程,代码位置如下:\n\n

\n\nGTY解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;由于数据解包是数据组包的逆过程,所以这里不再过多赘述,视频数据解包模块顶层接口如下:\n\n

\n\n### FDMA图像缓存\n\nFDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了Xilinx官方的MIG作为DDR控制器,所以FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:\n\n

\n\nFDMA图像缓存架构由FDMA控制器+FDMA组成;FDMA实际上就是一个AXI4-FULL总线主设备,与MIG对接,MIG配置为AXI4-FULL接口;FDMA控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR中写入M个像素,写N次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以AXI4内部代码,以简单地像使用FIFO那样操作AXI总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为3帧缓存;图像缓存模块代码架构如下:\n\n

\n\n基于FDMA的图像缓存架构在Block Design设计中如下:\n\n

\n\n### FT601功能和硬件电路\n\nFT600/601Q 的技术参数如下:\n\nFT600&601Q 芯片是 FT 最新推出的 USB3.0 to FIFO interface IC,实现 USB3.0 与 16/32bit 并行 IO 接口之间的数据传输;整个 USB 通信协议全部由芯片驱动自行完成,开发者无须考虑 USB 底层固件的编程。\n\n-->兼容支持 USB3.0(5Gbps),向下兼容 USB2.0(480Mbps and 12Mbps)传输;\n\n-->高达 8 个可配置 Endpoint. >>支持 2 种 FIFO 传输协议,最大传输可达 400MB/s;\n\n-->芯片内部有 16K 字节的缓冲区,可以进行数据的大吞吐量操作;\n\n-->支持远程唤醒功能;\n\n-->芯片支持多种 IO 电压:1.8V,2.5V.3.3V;\n\n-->通过 16bit D[O:15]或 32bit D[0:31]并行数据线和读写状态/控制线 RXF、TXE、RD、WR,加上时钟 CLK,使能 OE 信号线就可实现与 CPU/FPGA 的数据交换;\n\n-->该芯片内部集成 1.0V LDO,可提供给芯片核心部分使用;\n\n-->工业级芯片,工作温度范围-40 to 85℃;\n\nFT601芯片框架如下:\n\n

\n\nFT601外围电路设计参考如下:\n\n

\n\nFT601支持的多种传输模式,其中 245 Synchronous FIFO 模式和 Multi-Channel FIFO 模式是最常用的模式,本工程配置为 245 Synchronous FIFO 模式;传输模式通过GPIO引脚高低电平配置,配置真值表如下:\n\n

\n\n### FT601读时序解读\n\nFT601的245 Synchronous FIFO 模式读时序如下:\n\n

\n\nRXF_N为读数据状态信号,RXF_N为低电平期间FPGA可以读取FT601数据;\n\n检测到RXF_N低电平后,拉低OE_N和RD_N,然后开始读数据;\n\n检测到RXF_N高电平后,拉高OE_N和RD_N,然后退出读数据状态;\n\n### FT601写时序解读\n\nFT601的245 Synchronous FIFO 模式写时序如下:\n\n

\n\nTXF_N为读数据状态信号,RXF_N为低电平期间FPGA向FT601写入数据;\n\n检测到TXF_N低电平后,拉低WR_N,然后开始向FT601写入数据;\n\n检测到TXF_N高电平后,拉高WR_N,然后退出写数据状态;\n\n### FPGA的FT601驱动\n\n基于以上对FT601的解读,就可以用verilog实现对FT601的读写操作了,工程中FT601驱动代码如下:\n\n

\n\n### USB3.0视频接收显示QT上位机\n\n仅提供Win10版本的QT上位机,位置如下:\n\n

\n\n以Win10版本为例,源码位置如下:\n\n

\n\n以Win10版本下,可以点击已经编译好的QT软件直接运行,位置如下:\n\n

\n\nQT上位机运行效果如下:\n\n

\n\n### 工程源码架构\n\n提供3套工程源码,以工程源码1为例,工程Block Design设计如下:\n\n

\n\n提供3套工程源码,以工程源码1为例,综合后的工程源码架构如下:\n\n

\n\n## 4、vivado工程源码1详解-->KU5P,OV5640输入版本\n\n开发板FPGA型号:Xilinx--Kintex UltraScale+--xcku5p-ffvb676-1-i;\n\nFPGA开发环境:Vivado2019.1;\n\n输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;\n\n输出:USB3.0,分辨率1280x720@60Hz;\n\nUSB3.0物理层方案:FT601芯片方案;\n\n回环光口类型:SFP光口;\n\n高速接口类型:GTY,线速率5Gbps;\n\n高速接口编解码协议:8b/10b编解码;\n\n图像缓存方案:FDMA图像缓存+DDR4颗粒+3帧缓存;\n\n实现功能:FPGA实现GTY光口视频转USB3.0传输;\n\n工程作用:此工程目的是让读者掌握FPGA实现GTY光口视频转USB3.0传输的设计能力,以便能够移植和设计自己的项目;\n\n工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;\n\n工程的资源消耗和功耗如下:\n\n

\n\n## 5、vivado工程源码1详解-->KU5P,HDMI输入版本\n\n开发板FPGA型号:Xilinx--Kintex UltraScale+--xcku5p-ffvb676-1-i;\n\nFPGA开发环境:Vivado2019.1;\n\n输入:HDMI或者FPGA内部动态彩条,ADV7611解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;\n\n输出:USB3.0,分辨率1920x1080@60Hz;\n\nUSB3.0物理层方案:FT601芯片方案;\n\n回环光口类型:SFP光口;\n\n高速接口类型:GTY,线速率5Gbps;\n\n高速接口编解码协议:8b/10b编解码;\n\n图像缓存方案:FDMA图像缓存+DDR4颗粒+3帧缓存;\n\n实现功能:FPGA实现GTY光口视频转USB3.0传输;\n\n工程作用:此工程目的是让读者掌握FPGA实现GTY光口视频转USB3.0传输的设计能力,以便能够移植和设计自己的项目;\n\n工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;\n\n工程的资源消耗和功耗如下:\n\n

\n\n## 6、工程移植说明\n\n### vivado版本不一致处理\n\n1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;\n\n2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件-->另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;\n\n

\n\n3:如果你的vivado版本高于本工程vivado版本,解决如下:\n\n

\n\n打开工程后会发现IP都被锁住了,如下:\n\n

\n\n此时需要升级IP,操作如下:\n\n

\n\n

\n\n### FPGA型号不一致处理\n\n如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:\n\n

\n\n

\n\n

\n\n更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;\n\n### 其他注意事项\n\n1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;\n\n2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;\n\n3:纯FPGA移植到Zynq需要在工程中添加zynq软核;\n\n## 7、上板调试验证\n\n### 准备工作\n\n需要准备的器材如下:\n\nOV5640摄像头或者笔记本电脑,没有则请使用FPGA内部生成的彩条;\n\nFT601转接板(FPGA开发板板载FT601除外);\n\nUSB3.0数据线;\n\nFPGA开发板,没有开发板可以找本博提供;\n\nSFP光模块和光纤;\n\n我的开发板了连接如下:\n\n

\n\n### UltraScale GTH光口视频转USB3.0传输效果演示\n\nUltraScale GTH光口视频转USB3.0传输效果演示如下:\n\n\n\n00:30\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## 8、福利:工程代码的获取\n\n代码太大,无法邮箱发送,以某度网盘链接方式发送,\n\n资料获取方式:私\n\n网盘资料如下:\n\n

\n\n此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:\n\n

\n\n\n\n
\n\n[https://zhuanlan.zhihu.com/p/25969542297](https://zhuanlan.zhihu.com/p/25969542297)
\n -->