FPGA视频GTH 8b/10b编解码转PCIE3.0传输,基于XDMA中断架构,提供工程源码
FPGA视频GTH 8b/10b编解码转PCIE3.0传输,基于XDMA中断架构,提供工程源码和技能支持1、前言
FPGA实现SFP光口视频编解码现状;
目前基于Xilinx系列FPGA的SFP光口视频编解码主要有以下几种,Artix7系列的GTP、Kintex7系列的GTX、更高端FPGA器件的GTH、GTY、GTV、GTM等,线速率越来越高,应用场景也越来越高端;编码方式也是多种多样,有8b/10b编解码、64b/66b编解码、HDMI编解码、SDI编解码等等;本计划接纳7系列的GTH作为高速接口、8b/10b编解码的方式实现SFP光口视频编解码;
FPGA实现PCIE数据传输现状;
目前基于Xilinx系列FPGA的PCIE通信架构主要有以下2种,一种是简单的、傻瓜式的、易于开发的、对新手友好的XDMA架构,该架构对PCIE协议底层做了封装,并加上了DMA引擎,使得使用的难度大大低落,加之Xilinx提供了配套的Windows和Linux体系驱动和上位机参考源代码,使得XDMA一经推出就让工程师们欲罢不能;另一种是更为底层的、需要计划者有肯定PCIE协议知识的、更易于定制化开发的7 Series Integrated Block for PCI Express架构,该IP实现的是PCIe 的物理层、链路层和事务层,提供给用户的是以 AXI4-stream 接口定义的TLP 包,使用该IP 核,需要对PCIe 协议有清楚的明白,特殊是对事务包TLP报文格式;本计划接纳第一种方案,使用XDMA的中断模式实现PCIE通信;本架构既有简单的测速实行,也有视频采集应用;
工程概述
本计划使用Xilinx系列FPGA为平台,实现视频GTH 8b/10b编解码转PCIE3.0传输;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的silicom9011芯片实现HDMI视频解码,输出RGB888视频给FPGA;然后输入视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便吸收方进行有效识别;让后调用Xilinx官方的GTH IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤吸收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;每当缓存一帧视频完毕,就发起一次用户中断给XDMA,XDMA收到用户中断后通知QT上位机发起一次XDMA读数据利用,XDMA再从DDR中读取一帧视频并通过PCIE总线发送给QT上位机,QT上位机吸收并显示当前采集的视频;本博客提供1套工程源码,具体如下:
工程源码1
开发板FPGA型号为Xilinx–690T–xc7vx690tffg1761-3;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的silicom9011芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对silicom9011进行初始化设置,分辨率设置为1920x1080@60Hz,输出RGB888视频给FPGA;然后输入视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便吸收方进行有效识别;让后调用Xilinx官方的GTH IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤吸收视频,然后送入Xilinx官方的GTH IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构将视频写入板载DDR3中做4帧缓存;每当缓存一帧视频完毕,就发起一次用户中断利用,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据利用,该过程同样由中断模块转发,XDMA再从DDR3中读取当前一帧视频并通过PCIE总线发送给QT上位机,QT上位机吸收并显示当前采集的视频;输出视频分辨率为1920x1080@60Hz;板载PCIE为8 Lane的PCIE3.0;单Lane线速率设置为8GT/s;由此形成Sensor+SFP光口+XDMA+PCIE3.0+QT的高端架构;该工程实用于SFP光口到PCIE3.0接口的数据采集卡应用;
本文详细描述了FPGA视频GTH 8b/10b编解码转PCIE3.0传输的计划方案,工程代码可综合编译上板调试,可直接项目移植,实用于在校门生、研究生项目开发,也实用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完备的、跑通的工程源码和技能支持;
工程源码和技能支持的获取方式放在了文章末端,请耐心看到末了;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教诲;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,克制用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请审慎使用。。。
2、相关方案保举
我已有的PCIE方案
我的主页有PCIE通信专栏,该专栏基于XDMA的轮询模式实现与QT上位机的数据交互,既有基于RIFFA实现的PCIE方案,也有基于XDMA实现的PCIE方案;既有简单的数据交互、测速,也有应用级别的图像采集传输,以下是专栏所在:
点击直接前去
别的,我的主页有中断模式的PCIE通信专栏,该专栏基于XDMA的中断模式实现与QT上位机的数据交互,以下是专栏所在:
点击直接前去
别的,尚有基于RIFFA架构的PCIE通信专栏,以下是专栏所在:
点击直接前去
我已有的 GT 高速接口解决方案
我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,此中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏所在:
点击直接前去
3、PCIE根本知识扫描
PCIe 总线架构与以太网的 OSI 模子雷同,是一种分层协议架构,分为事务层(Transaction Layer)、数据链路层(Data Link Layer) 和物理层(Physical Layer)。这些层中的每一层都分为两部分:一部分处理出站(要发送的)信息,另一部分处理入站(吸收的)信息,如下图:
https://i-blog.csdnimg.cn/blog_migrate/ee7bd042be45007250d1043415a5d879.png
事务层
事务层的主要责任是事务层包 TLP(Transaction Layer Packet)的组装和拆卸。事务层吸收来自 PCIe 装备焦点层的数据,并将其封装为 TLP。TLP 用于传达事务,例如读取和写入,以及确定事件的类型。事务层还负责管理 TLP 的基于信用的流控制。每个需要相应数据包的哀求数据包都作为拆分事务实现。每个数据包都有一个唯一标识符,该标识符使相应数据包可以定向到精确的始发者。数据包格式支持不同形式的寻址,具体取决于事务的类型(内存、I/O、设置和消息)。数据包可能还具有诸如 No Snoop、Relaxed Ordering 和基于 ID 的排序(IDO)之类的属性。事务层支持四个所在空间:包括三个 PCI 所在空间(内存、I/O 和设置)并添加消息空间。该规范使用消息空间来支持全部先前 PCI 的边带信号,例如中断、电源管理哀求等,作为带内消息事务。
数据链路层
数据链路层充当事务层和物理层之间的中间阶段。数据链路层的主要职责包括链路管理和数据完备性,包括错误检测和错误改正。数据链路层的发送方接受事务层组装的 TLP,计算并应用数据保护代码和 TLP序列号,以及将它们提交给物理层以在链路上传输。吸收数据链路层负责检查吸收到的 TLP 的完备性,并将它们提交给事务层以进行进一步处理。在检测到 TLP 错误时,此层负责哀求重发 TLP,直到精确吸收信息或确定链路失败为止。数据链路层还生成并使用用于链路管理功能的数据包。为了将这些数据包与事务层(TLP)使用的数据包区分开,当指代在数据链路层生成和使用的数据包时,将使用术语“数据链路层数据包(DLLP)”。
物理层
PCIe 总线的物理层为 PCIe 装备间的数据通信提供传送介质,为数据传送提供可靠的物理情况。物理层包括用于接口利用的全部电路,包括驱动器和输入缓冲器、并行至串行和串行至并行转换、PLL 和阻抗匹配电路。它还包括与接口初始化和维护有关的逻辑功能。物理层以实现特定的格式与数据链路层交换信息。该层负责将从数据链路层吸收的信息转换为适当的序列化格式,并以与连接到链路另一端的装备兼容的频率和通道宽度在 PCI Express 链路上传输该信息。物理层是 PCIe 体系结构最紧张,也是最难以实现的组成部分(该层对用户透明,开发 PCIe 步调时无需关心)。PCIe 总线的物理层定义了 LTSSM (Link Training and Status State Machine)状态机,PCIe 链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。PCIe 总线使用端到端的连接方式,在一条PCIe 链路的两端只能各连接一个装备,这两个装备互为数据发送端和数据吸收端。由于 PCIe 是支持全双工通信的,以是发送端和吸收端中都含有TX (发送逻辑) 和RX (吸收逻辑)。在PCIe 总线的物理链路的一个数据通路(Lane) 中,有两组差分信号,共4 根信号线组成。此中发送端的TX 与吸收端的RX 使用一组差分信号连接,该链路也被称为发送端的发送链路,也是吸收端的吸收链路;而发送端的RX 与吸收端的TX 使用另一组差分信号连接,该链路也被称为发送端的吸收链路,也是吸收端的发送链路。一个PCIe 链路可以由多个Lane 组成。目前PCIe 链路可以支持1、2、4、8、12、16 和32 个Lane,即×1、×2、×4、×8、×12、×16 和×32 宽度的PCIe 链路。每一个Lane 上使用的总线频率与PCIe 总线使用的版本相关。
4、工程详细计划方案
工程计划原理框图
工程计划原理框图如下:
https://i-blog.csdnimg.cn/direct/e870960ef937492397f9cedaeaeca193.png
输入Sensor之–>芯片解码的HDMI
输入Sensor是本工程的输入装备,其二为板载的HDMI输入接口;输入源为板载的HDMI输入接口或动态彩条,分辨率为1920x1080@60Hz,使用笔记本电脑接入HDMI输入接口,以模拟输入Sensor;HDMI解码方案为芯片解码,使用Silcom9011,可将输入的HDMI视频解码为RGB888视频;FPGA纯verilog实现的i2c设置模块完成对Silcom9011芯片的设置,分辨率设置为1920x1080@60Hz;可以通过Sensor模块的顶层参数设置,默认选择Sensor输入;Sensor模块如下:
https://i-blog.csdnimg.cn/direct/5c5129895ffb463fb3f5043339717791.png
SENSOR_TYPE=0;则输出HDMI接口采集的视频;
SENSOR_TYPE=1;则输出动态彩条的视频;
整个模块代码架构如下:
https://i-blog.csdnimg.cn/direct/e2710ab3863c4d83981f5d0d6ca47806.png
视频数据组包
由于视频需要在GTH 中通过aurora 8b/10b协议收发,以是数据必须进行组包,以顺应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:
https://i-blog.csdnimg.cn/direct/d2038ee3154140d6a634f88914de6350.png
首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入GTH发送;在此之前,需要对一帧视频进行编号,也叫作指令,GTH组包时根据固定的指令进行数据发送,GTH解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好明白,以是我在代码里进行了详细的中文解释,需要注意的是,为了防止中文解释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:
https://i-blog.csdnimg.cn/direct/1110f048e6a2479ba2e18fec436b44f4.png
注意!!!指令可以恣意更改,但最低字节必须为bc;
基于GTH高速接口的视频传输架构
本计划使用GTH 高速接口传输视频,使用8b/10b编解码协议,搭建基于GTH高速接口的视频传输架构,包括视频数据组包模块、GTH IP核设置调用、吸收数据对齐模块、视频数据解包模块等部分,总体代码架构如下:
https://i-blog.csdnimg.cn/direct/518fa32affe54a6094aaf15fe521fd0d.png
基于GTH高速接口的视频传输架构顶层接口核参数设置如下:
https://i-blog.csdnimg.cn/direct/a2ddb387c8a14e2bb7fef3e296ba21f7.png
本计划共例化了2路GTH,以是2路GTH的收发回环方式也做了灵活的参数化设置,假如你只需要1路GT,则可删除另一路,假如你想例化更多路GT,则可根据上述计划方法扩展,十分方便;
GTH IP 简介
关于GTH 先容最详细的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我们以此来解读:《ug476_7Series_Transceivers》的PDF文档我已放在了资料包里;我用到的开发板FPGA型号为Xilinx–Virtex7–xc7vx690tffg1761-3;带有36路GTX资源,此中2路连接到了板载2个SFP光口,每通道的收发速率为 500 Mb/s 到 10.3125 Gb/s 之间。GTH 收发器支持不同的串行传输接口或协议,比如8b/10b编解码、PCIE /2.0/3.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;
GTH 基本结构
Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTH 收发器在Virtex7 FPGA 芯片中的表示图:GTH 与GTX为同一个数据手册,以是下图实为K7的GTX,但GTX核GTH内部构造是一样的;《ug476_7Series_Transceivers》第24页;GTH 具体内部逻辑框图如下所示,它由四个收发器通道 GTXE2_CHANNEL原语 和一个GTXE2_COMMON 原语组成。每路GTXE2_CHANNEL包罗发送电路 TX 和吸收电路 RX,GTXE2_CHANNEL的时钟可以来自于CPLL或者QPLL,可在IP设置界面里设置;《ug476_7Series_Transceivers》第25页;每个 GTXE2_CHANNEL 的逻辑电路如下图所示:《ug476_7Series_Transceivers》第26页;
https://i-blog.csdnimg.cn/direct/2ae9a73467884c1b8b57f0d5e6ddb551.png
GTXE2_CHANNEL 的发送端和吸收端功能是独立的,均由 PMA(Physical Media Attachment,物理前言适配层)和 PCS(Physical Coding Sublayer,物理编码子层)两个子层组成。此中 PMA 子层包罗高速串并转换(Serdes)、预/后加重、吸收均衡、时钟发生器及时钟恢复等电路。PCS 子层包罗8B/10B 编解码、缓冲区、通道绑定和时钟修正等电路。
这里说多了意义不大,因为没有做过几个大的项目是不会明白这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,背面我也会重点将到IP核的调用和使用;
GTH 发送和吸收处理流程
首先用户逻辑数据颠末 8B/10B 编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,末了颠末高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,假如在 PCB 计划时不慎将 TXP 和 TXN 差分引脚交错连接,则可以通过极性控制(Polarity)来弥补这个计划错误。吸收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 吸收端的弹性缓冲区,其具有时钟改正和通道绑定功能。这里的每一个功能点都可以写一篇论文乃至是一本书,以是这里只需要知道个概念即可,在具体的项目中回具体用到,照旧那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。
GTH 的参考时钟
GTH 模块有两个差分参考时钟输入管脚(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作为 GTH 模块的参考时钟源,用户可以自行选择。一样平常开发板上都有一路125或者156.25Mhz 的 GTH 参考时钟连接到 MGTREFCLK0上,作为 GTH 的参考时钟。差分参考时钟通过IBUFDS 模块转换成单端时钟信号进入到 GTXE2_COMMOM 的QPLL或CPLL中,产生 TX 和 RX 电路中所需的时钟频率。TX 和 RX 收发器速率雷同的话,TX 电路和 RX 电路可以使用同一个 PLL 产生的时钟,假如 TX 和 RX收发器速率不雷同的话,需要使用不同的 PLL 时钟产生的时钟。参考时钟这里Xilinx给出的GT参考例程已经做得很好了,我们调用时实在不用修改;GTH 的参考时钟结构图如下:《ug476_7Series_Transceivers》第31页;
https://i-blog.csdnimg.cn/direct/a935a9f505a9405bb5dec9524f853227.png
GTH 发送接口
《ug476_7Series_Transceivers》的第107到165页详细先容了发送处理流程,此中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的计划思想,留给用户可利用的接口并不多,基于此思路,我们重点讲讲GTH 例化时留给用户的发送部分需要用到的接口;用户只需要关心发送接口的时钟和数据即可,以例化2路GTH 为例,经本博主优化,用户只需要关心如下GTH 发送接口即可快速使用GTH ;
https://i-blog.csdnimg.cn/direct/b2d9add6cd6941f29b940bb7e7b4173d.png
GTH 吸收接口
《ug476_7Series_Transceivers》的第167到295页详细先容了吸收处理流程,此中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的计划思想,留给用户可利用的接口并不多,基于此思路,我们重点讲讲GTH 例化时留给用户的发送部分需要用到的接口;用户只需要关心吸收接口的时钟和数据即可,以例化2路GTH 为例,经本博主优化,用户只需要关心如下GTH 吸收接口即可快速使用GTH ;
https://i-blog.csdnimg.cn/direct/35da177c7b04455fb46d3bbff2136d96.png
GTH IP核调用和使用
GTH IP核设置调用在工程种位置如下:
https://i-blog.csdnimg.cn/direct/6eee2e07e54b4a64a27f973df2ba166b.png
GTH IP核调用和使用很简单,通过vivado的UI界面即可完成,如下:
https://i-blog.csdnimg.cn/blog_migrate/db832512748f8cd98ff1f94e69ec2270.png
有别于网上其他博主的教程,我个人喜欢用如下图的共享逻辑:
https://i-blog.csdnimg.cn/blog_migrate/70da50b1c5fa169e35e86b1db3b33a44.png
这样选择的长处有两个,一是方便DRP变速,二是便于IP核的修改,修改完IP核后直接编译即可,不再需要打开example工程,再复制下面的一堆文件放到自己的工程什么的,玩儿个GTH需要那么复杂么?
https://i-blog.csdnimg.cn/blog_migrate/4ecc7074fbd21ab62cb473791641d6c3.png
这里对上图的标号做解释:
1:线速率,根据自己的项目需求来,GTH的范围是0.5到13.1G,由于我的项目是视频传输,以是在GTH的速率范围内均可,本例程选择了5G;
2:参考时钟,这个得根据你的原理图来,可以是80M、125M、148.5M、156.25M等等,我的开发板是156.25M;
4:GTH组的绑定,这个很紧张,他的绑定参考依据有两个,已是你的开发板原理图,而是官方的参考资料《ug476_7Series_Transceivers》,官方根据BANK不同将GTH资源分成了多组,由于GT资源是Xilinx系列FPGA的专用资源,占用专用的Bnak,以是引脚也是专用的,那么这些GTH组和引脚是怎么对应的呢?《ug476_7Series_Transceivers》的阐明如下:红框内为的我的开发板原理图对应的FPGA引脚;
https://i-blog.csdnimg.cn/blog_migrate/cca97b7b355ffdf8d483ff16e91edfe8.png
我的板子原理图如下:
https://i-blog.csdnimg.cn/blog_migrate/94f07ef6b90b385f1266b80f1ca440dc.png
https://i-blog.csdnimg.cn/blog_migrate/a291a71af16443ebdf541b9d120bef5d.png
选择外部数据位宽32bit的8b/10b编解码,如下:
https://i-blog.csdnimg.cn/blog_migrate/eb2ad5c051183eb9d6918c31f214d589.png
下面这里讲的是K码检测:
https://i-blog.csdnimg.cn/blog_migrate/00a2ac70f9b85fa1335e676b73d8bc8c.png
这里选择K28.5,也就是所谓的COM码,十六进制为bc,他的作用很多,可以表示空闲乱序符号,也可以表示数据错位标志,这里用来标志数据错位,8b/10b协议对K码的定义如下:
https://i-blog.csdnimg.cn/blog_migrate/b82f1e7344b65b6b016368e35649bc6d.png
下面讲的是时钟改正,也就是对应GTH内部吸收部分的弹性buffer;
https://i-blog.csdnimg.cn/blog_migrate/49377c08ba2c8395c4f8f2f0e24fb06b.png
这里有一个时钟频偏的概念,特殊是收发双方时钟不同源时,这里设置的频偏为100ppm,规定每隔5000个数据包发送方发送一个4字节的序列,吸收方的弹性buffer会根据这4字节的序列,以及数据在buffer中的位置来决定删除或者插入一个4字节的序列中的一个字节,目的是确保数据从发送端到吸收端的稳定性,消除时钟频偏的影响;
数据对齐
由于GT资源的aurora 8b/10b数据收发天然有着数据错位的情况,以是需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:
https://i-blog.csdnimg.cn/direct/25643eecdbc14abe84d1ecff0c16889d.png
我定义的 K 码控制字符格式为:XX_XX_XX_BC,以是用一个rx_ctrl 指示数据是否为 K 码 的 COM 符号;
rx_ctrl = 4’b0000 表示 4 字节的数据没有 COM 码;
rx_ctrl = 4’b0001 表示 4 字节的数据中[ 7: 0] 为 COM 码;
rx_ctrl = 4’b0010 表示 4 字节的数据中 为 COM 码;
rx_ctrl = 4’b0100 表示 4 字节的数据中 为 COM 码;
rx_ctrl = 4’b1000 表示 4 字节的数据中 为 COM 码;
基于此,当吸收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的根本利用,这里不再赘述;数据对齐模块顶层接口如下:
https://i-blog.csdnimg.cn/direct/7ec3fef7f73f4e9d88bd0bc713480561.png
视频数据解包
数据解包是数据组包的逆过程,代码位置如下:
https://i-blog.csdnimg.cn/direct/60995d5baec5458f84d2e30d35839da6.png
GTH 解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为背面图像缓存的紧张信号;由于数据解包是数据组包的逆过程,以是这里不再过多赘述,视频数据解包模块顶层接口如下:
https://i-blog.csdnimg.cn/direct/b6211edda6f6466eae6210d02d3b2e7b.png
FDMA图像缓存
FDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR3中,由于调用了Xilinx官方的MIG作为DDR控制器,以是FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:
https://i-blog.csdnimg.cn/direct/adb009dd04f14fdcaf8b5e60f1c6a055.png
FDMA图像缓存架构由FDMA控制器+FDMA组成;FDMA现实上就是一个AXI4-FULL总线主装备,与MIG对接,MIG设置为AXI4-FULL接口;FDMA控制器现实上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,此中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR3中写入M个像素,写N次即可完成1帧图像的缓存,本计划只用到了FDMA控制器的写功能,FDMA控制器IP设置如下:
https://i-blog.csdnimg.cn/direct/8036ddb9743f4efa9f94c2596e6f1445.png
FDMA图像缓存架构在Block Design中如下:
https://i-blog.csdnimg.cn/direct/8ca135591105440ab7c26dc31075864b.png
XDMA设置及使用
根据Xilinx官方手册,XDMA框图如下:
https://i-blog.csdnimg.cn/blog_migrate/0465250a2666ee159f49740c681e33b6.png
由图可知,XDMA封装了Integrated Block for PCI Express IP,不但完成了事务层的组包解包,还添加了完备的 DMA 引擎;
XDMA 一样平常情况下使用AXI4 接口,AXI4 接口可以加入到体系总线互联,实用于大数据量异步传输,而且通常情况下使用 XDMA 都会使用到 BRAM 或 DDR 内存;AXI4-Stream 接口实用于低延迟数据流传输。XDMA 允许在主机内存和 DMA 子体系之间移动数据。它通过对包罗有关要传输的数据的源、目的和数目的信息的“描述符”进行利用来实现此目的。这些直接内存传输既可以用于主机到卡(Host to Card,H2C)的传输,也可以用与卡到主机(Card to Host,C2H)的传输。可以将 DMA 设置为由全部通道共享一个 AXI4 Master 接口,或者为每个启用的通道提供一个 AXI4-Stream 接口。内存传输是基于每个通道的描述符链接列表指定的,DMA 从主机内存和进程中获取这些链接列表。诸如描述符完成和错误之类的事件通过中断来发出信号。XDMA 还提供多达 16 条用户中断线,这些中断线会向主机生成中断。本计划需要设置为中断模式;如下图:
https://i-blog.csdnimg.cn/blog_migrate/2d1b79eaaf92e7da0fb7c0daefefd82b.png
本计划XDMA线速率设置为8GT/s,这是PCIE3.0标准,如下:
https://i-blog.csdnimg.cn/direct/e14d6fda417f4826aa21a9ec89d21ca7.png
XDMA详情参考《AXI Bridge for PCI Express Gen3 Subsystem Product Guide(PG194)》;XDMA在Block Design中如下:
https://i-blog.csdnimg.cn/direct/26c304e1497e408e9a15a0439bd7b995.png
XDMA中断模块
XDMA中断模块和XDMA IP配合使用,XDMA中断模块主要执行两个使命,一是获取XDMA的状态,输出用户中断使能信号,以指示用户此时可以发起中断,该使命通过AXI_Lite接口与XDMA连接,其从机所在受PC端软件控制;二是转发用户中断给XDMA,当用户侧检测到XDMA处于可接受中断状态时,用户逻辑可以发起中断,XDMA中断模块将此中断转发给XDMA IP;将模块直接拖入Block Design中,显示如下:
https://i-blog.csdnimg.cn/direct/6afe2494db94427c9687b01273215b53.png
用户中断发起逻辑
每当FDMA缓存一帧视频完毕,就通知用户中断发起逻辑发起一次用户中断利用,中断号几位当前缓存视频帧的帧号;用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据利用,该过程同样由中断模块转发,XDMA再从DDR3中读取当前一帧视频并通过PCIE总线发送给QT上位机,QT上位机吸收并显示当前采集的视频;焦点代码如下:
https://i-blog.csdnimg.cn/direct/29b1fbaad69441aa9891f6c7cb878a9a.png
Windows版本XDMA驱动安装
提供Windows和Linux体系驱动,本章节先容Windows下XDMA驱动安装;
https://i-blog.csdnimg.cn/direct/0b8aefa1e7634a05ae8ebc756d760657.png
Windows下驱动安装步骤如下:友情提示,Windows下驱动秩序安装一次即可;
第一步:使体系禁用署名并进入测试模式,方法如下:
https://i-blog.csdnimg.cn/direct/2bb8793341624a7dbcb796c332ddb94b.png
也可百度其他方法实现上述目的,完成后电脑屏幕右下角应有如下显示:
https://i-blog.csdnimg.cn/direct/d531365e467a44aaa2d476d4021ead88.png
第二步:定位到驱动目录下,提供Windows7和Windows10两个版本驱动,由于我的电脑选择Windows10,如下:
https://i-blog.csdnimg.cn/direct/dc723c8446444fa0b727b93e65aacade.png
单击鼠标右键安装即可,如下:
https://i-blog.csdnimg.cn/direct/0b70b910d2a74d8eb16524322c68142d.png
https://i-blog.csdnimg.cn/direct/9e79cc610b2145828a9327c3c3d3ae1b.png
https://i-blog.csdnimg.cn/direct/1db234c537a745d5b900c05be06fc558.png
第三步:下载FPGA工程bit到FPGA开发板,然后重启电脑,打开我的电脑–>管理–>装备管理器,应看到如下装备:
https://i-blog.csdnimg.cn/direct/c049cb609bc24c42b7747383be20adb9.png
Linux版本XDMA驱动安装
提供Windows和Linux体系驱动,本章节先容Linux下XDMA驱动安装;
https://i-blog.csdnimg.cn/direct/0b8aefa1e7634a05ae8ebc756d760657.png
Linux下驱动安装步骤如下:友情提示,Linux下,每次下载FPGA bit后都需要重启电脑才华安装驱动;
进入到Linux驱动目录下,一次执行以下两条指令即可安装,如下:
• 驱动编译终端指令:make -j8
•驱动安装终端指令:sudo insmod xdma.ko
https://i-blog.csdnimg.cn/direct/d1866143d9c44af585022dd795b65f25.png
QT上位机
提供Linux和Win10版本的QT上位机,位置如下:
https://i-blog.csdnimg.cn/direct/d24abe86e31d4b6fa6009fc3ca04cc04.png
以Win10版本为例,源码位置如下:
https://i-blog.csdnimg.cn/direct/8c166570d66f42028b31a94e95a39e1a.png
以Win10版本下,可以点击已经编译好的QT软件直接运行,位置如下:
https://i-blog.csdnimg.cn/direct/649b48fed5284ccc93ff3d4f481443e5.png
Linux下必须先安装QT软件,然后打开QT工程才华运行,如下:
https://i-blog.csdnimg.cn/direct/01d9c8055bfc450aaf0b4cad733b7dc1.png
QT上位机运行效果如下:
https://i-blog.csdnimg.cn/direct/bfb66020f3ee4b67b4da4ba44fa170f1.png
工程源码架构
工程Block Design计划如下:
https://i-blog.csdnimg.cn/direct/e1085822fc1d4dc09f34dd0ce18eed61.png
工程综合后的工程源码架构如下:
https://i-blog.csdnimg.cn/direct/20612cfa4f9540279e76649806cd09bf.png
Vivado工程注意事项
Vivado工程需要配合修改过的Xilinx官方XDMA驱动和QT上位机一起使用,以是Vivado工程必须做到以下几点:
1:XDMA中的AXI4_Lite基所在必须设为0x44A00000,这是XDMA驱动修改的规定,感兴趣的可以去看驱动源码,设置如下;
https://i-blog.csdnimg.cn/direct/7ecf802f6a63420da5eed34b0480da6d.png
2:MIG的DDR基所在必须从0x00000000开始,这是QT上位机代码的规定,感兴趣的可以去看QT源码,设置如下;
https://i-blog.csdnimg.cn/direct/8e0d08661a714abaa42742fdb2861746.png
PCIE上板调试注意事项
1:必须先安装本博提供的XDMA驱动,详情请参考第4章节的《XDMA驱动及其安装》,Windows版本驱动只需安装一次;
2:Windows版本下载FPGA工程bit后需要重启电脑,电脑才华识别到XDMA驱动;步调固化后也需要重启电脑;Linux版本每次载FPGA工程bit后都需要重启电脑,都需要安装XDMA驱动;
3:FPGA板卡插在主机上后一样平常不需要额外供电,假如你的板子元器件较多功耗较大,则需要额外供电,详情咨询开发板厂家,当然,找我买板子的客户可以直接问我;
4:PCIE调试需要电脑主机,但笔记本电脑理论上也可以外接出来PCIE,详情百度自行搜索一下,电脑主机PCIE插槽不方便利用时可以使用延长线接出来,某宝有卖;
5、vivado工程源码1详解–>Virtex7-690T版本
开发板FPGA型号:Xilinx–690T–xc7vx690tffg1761-3;
FPGA开发情况:Vivado2019.1;
QT开发情况:VS2015 + Qt 5.12.10;
输入:HDMI或动态彩条,Silcom9011芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE3.0,分辨率1920x1080@60Hz;
高速接口类型:GTH,线速率5Gbps;
GTH编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
PCIE底层方案:Xilinx XDMA,8GT/s单lane线速率;
PCIE详情:PCIE3.0版本,X8,8GT/s单lane线速率;
实现功能:FPGA视频GTH 8b/10b编解码转PCIE3.0传输;
工程作用:此工程目的是让读者把握FPGA视频GTH 8b/10b编解码转PCIE3.0传输的计划能力,以便能够移植和计划自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
https://i-blog.csdnimg.cn/direct/7b73d0d301524f14a0e26fd103c4a976.png
6、工程移植阐明
vivado版本不同等处理
1:假如你的vivado版本与本工程vivado版本同等,则直接打开工程;
2:假如你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
https://i-blog.csdnimg.cn/blog_migrate/bc48ac9fcff3ccf75afc3b8c93903943.png
3:假如你的vivado版本高于本工程vivado版本,解决如下:
https://i-blog.csdnimg.cn/blog_migrate/5339765854d33895fd1ef5f32b7c7316.png
打开工程后会发现IP都被锁住了,如下:
https://i-blog.csdnimg.cn/blog_migrate/2ac63999d842a4c6fb1d7380d6ca5e97.png
此时需要升级IP,利用如下:
https://i-blog.csdnimg.cn/blog_migrate/89ba314f110850af150597ba2bc53bc5.png
https://i-blog.csdnimg.cn/blog_migrate/927dd0bd87ca3d4e31ff5dfd91915c65.png
FPGA型号不同等处理
假如你的FPGA型号与我的不同等,则需要更改FPGA型号,利用如下:
https://i-blog.csdnimg.cn/blog_migrate/bfd4a4312f7a07d96dbdf352ca7cdf56.png
https://i-blog.csdnimg.cn/blog_migrate/62e7842d8f47097e251eab0531279f6c.png
https://i-blog.csdnimg.cn/blog_migrate/1a056eeffb8fd0c0e59755520973eb2c.png
更改FPGA型号后还需要升级IP,升级IP的方法前面已经陈诉了;
其他注意事项
1:由于每个板子的DDR不肯定完全一样,以是MIG IP需要根据你自己的原理图进行设置,乃至可以直接删掉我这里原工程的MIG并重新添加IP,重新设置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;
7、上板调试验证
准备工作
需要准备的器材如下:
OV5640摄像头或者笔记本电脑,没有则请使用FPGA内部生成的彩条;
FPGA开发板,没有开发板可以找本博提供;
SFP光口和光纤;
带PCIE卡槽的电脑主机;
我的开发板了连接如下:
https://i-blog.csdnimg.cn/direct/30b9db724d594ca19f3497f4ee4f38a1.png
视频GTH 8b/10b编解码转PCIE3.0传输效果演示
视频GTH 8b/10b编解码转PCIE3.0传输效果演示如下:
HDMI-XDMA
8、工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末端名片。
网盘资料如下:
https://i-blog.csdnimg.cn/direct/5b52834308c34bd58bb5d2473a20aad3.png
别的,有很多朋侪给本博主提了很多意见和建议,盼望能丰富服务内容和选项,因为不同朋侪的需求不一样,以是本博主还提供以下服务:
https://i-blog.csdnimg.cn/blog_migrate/3822b51eedd8e3bf90dbed737ac4a2e1.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]