目录
- 1、前言
- 2、相关方案推荐
- 3、设计思路框架
-
- 工程设计原理框图
- 输入Sensor之-->OV7725摄像头
- 输入Sensor之-->OV5640摄像头
- 输入Sensor之-->芯片解码的HDMI
- 图像缩放模块详解
- 图像缩放模块使用(重点阅读)
- 图像缩放模块仿真
- 视频数据组包
- 基于HSSTHP高速接口的视频传输架构
-
- [HSSTHP IP 简介](#HSSTHP IP 简介)
- HSSTHP基本结构
- HSSTHP发送和接收处理流程
- HSSTHP的参考时钟
- HSSTHP发送接口
- HSSTHP接收接口
- [HSSTHP IP核调用和使用](#HSSTHP IP核调用和使用)
- 数据对齐
- 视频数据解包
- 图像缓存架构
- HDMI输出架构
- 工程源码架构
- 4、PDS工程源码1详解:OV7725输入版本
- 5、PDS工程源码2详解:OV5640输入版本
- 6、PDS工程源码3详解:HDMI输入版本
- 7、上板调试验证并演示
- 8、福利:工程源码获取
紫光同创FPGA实现HSSTHP光口视频传输+图像缩放,基于Aurora 8b/10b编解码架构,提供3套PDS工程源码和技术支持
1、前言
国产FPGA现状:
"苟利国家生死以,岂因祸福避趋之!"大洋彼岸的我优秀地下档员,敏锐地洞察到祖国的短板在于先进制程半导体的制造领域,于是本着为中华民族伟大复兴的中国梦贡献绵薄之力的初心,懂先生站在高略高度和长远角度谋划,宁愿背当代一世之骂名也要为祖国千秋万世谋,2018年7月,懂先生正式打响毛衣战,随后又使出恰勃纸战术,旨在为祖国先进制程半导体领域做出自主可控的战略推动;2019年初我刚出道时,还是Xilinx遥遥领先的时代(现在貌似也是),那时的国产FPGA还处于黑铁段位;然而才短短7年,如今的国产FPGA属于百家争鸣、百花齐放、八仙过海、神仙打架、方兴未艾、得陇望蜀、友商都是XX的喜极而泣之局面,此情此景,不得不吟唱老人家的诗句:魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间。。。
目前对于国产FPGA优势有以下几点:
1:性价比高,与同级别国外大厂芯片相比,价格相差几倍甚至十几倍;
2:自主可控,国产FPGA拥有完整自主知识产权的产业链,从芯片到相关EDA工具;
3:响应迅速,FAE技术支持比较到位,及时解决开发过程中遇到的问题,毕竟中文数据手册;
4:采购方便,产业链自主可控,采购便捷;
FPGA实现SFP光口视频编解码现状;
目前FPGA实现SFP光口传输方案很丰富,主流还是Xilinx的GT系列,此外国产FPGA厂商也纷纷抄袭Xilinx推出了自己的高速接口方案;基于Xilinx系列FPGA的SFP光口视频编解码主要有以下几种,Artix7系列的GTP、Kintex7系列的GTX、更高端FPGA器件的GTH、GTY、GTV、GTM等,线速率越来越高,应用场景也越来越高端;编码方式也是多种多样,有8b/10b编解码、64b/66b编解码、HDMI编解码、SDI编解码等等;国产的紫光同创也推出了HSSTLP、HSSTHP等方案,官方宣称其性能可对标Xilinx的GTP、GTX,但本博实际测试发现,HSSTLP/HP无论是功能还是性能都无法与Xilinx的GTP/GTX相媲美,但将个烂就也行,毕竟聊胜于无嘛;本设计采用紫光同创系列FPGA的HSSTHP作为高速接口、8b/10b编解码的方式实现SFP光口视频编解码;
FPGA实现图像缩放现状:
FPGA实现图像缩放大体分两种方案,第一种是使用纯verilog代码实现,其优势是可移植性强,可广泛应用于各种型号FPGA,维护性强,通用性强,缺点是开发难度大,对开发者技术要求很高,功能和性能不够灵活;第二种是使用纯HLS代码实现,比如Xilinx的Video Processing Subsystem,其优势是开发难度小,对开发者技术要求很低,可快速实现部署,特别适用于Xilinx的Zynq系列FPGA,功能和性能很灵活,缺点是可移植性很差,目前仅限于Xilinx系列FPGA,维护性差,通用性差;本设计采用纯verilog代码方案实现双线性插值的图像缩放;
工程概述
本文使用紫光同创的Titan2系列FPGA做基础的图像视频采集系统;视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统摄像头,包括OV7725、OV5640和AR0135;如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后对输入视频做图像缩放操作,图像缩放模块可实现任意比例缩放,支持临域插值和双线性插值2种算法,通过模块顶层参数选择,默认使用双线性插值;然后采集的输入视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用紫光同创官方的HSSTHP IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入紫光同创官方的HSSTHP IP核实现视频8b/10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入图像缓存架构实现视频3帧缓存功能,本设计使用DDR4作为缓存介质;然后Native视频时序控制图像缓存架构从DDR4中读取视频,并做Native视频时序同步,输出RGB888视频;然后视频送入Silicom9134芯片实现RGB转HDMI功能;最后视频通过板载HDMI输出接口送显示器显示即可;针对市场主流需求,本设计提供3套PDS工程源码,具体如下:
现对上述3套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为PG2T390H-6FFBG900;输入视频为OV7725摄像头或者动态彩条,默认使用OV7725;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后对输入视频做图像缩放操作,将原视频从640x480缩放到1920x1080,您可修改缩放参数轻松缩放到其他分辨率,工程只是举例,修改方法博客有说明;然后缩放后的视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用紫光同创官方的HSSTHP IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入紫光同创官方的HSSTHP IP核实现视频8b/10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入图像缓存架构实现视频3帧缓存功能,本设计使用DDR4作为缓存介质;然后Native视频时序控制图像缓存架构从DDR4中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为1920x1080@60Hz,然后视频送入Silicom9134芯片实现RGB转HDMI功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用于紫光同创FPGA实现SFP光口的视频采集卡(光端机)应用;
工程源码2
开发板FPGA型号为PG2T390H-6FFBG900;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后对输入视频做图像缩放操作,将原视频从1280x720缩放到1920x1080,您可修改缩放参数轻松缩放到其他分辨率,工程只是举例,修改方法博客有说明;然后缩放后的视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用紫光同创官方的HSSTHP IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入紫光同创官方的HSSTHP IP核实现视频8b/10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入图像缓存架构实现视频3帧缓存功能,本设计使用DDR4作为缓存介质;然后Native视频时序控制图像缓存架构从DDR4中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为1920x1080@60Hz,然后视频送入Silicom9134芯片实现RGB转HDMI功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用于紫光同创FPGA实现SFP光口的视频采集卡(光端机)应用;
工程源码3
开发板FPGA型号为PG2T390H-6FFBG900;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的IT6802芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对IT6802进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后对输入视频做图像缩放操作,将原视频从1920x1080缩放到1280x720,您可修改缩放参数轻松缩放到其他分辨率,工程只是举例,修改方法博客有说明;然后缩放后的视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用紫光同创官方的HSSTHP IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入紫光同创官方的HSSTHP IP核实现视频8b/10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入图像缓存架构实现视频3帧缓存功能,本设计使用DDR4作为缓存介质;然后Native视频时序控制图像缓存架构从DDR4中读取视频,并做Native视频时序同步,输出RGB888视频,输出分辨率为1280x720@60Hz,然后视频送入Silicom9134芯片实现RGB转HDMI功能;最后视频通过板载HDMI输出接口送显示器显示即可;该工程适用于紫光同创FPGA实现SFP光口的视频采集卡(光端机)应用;
本博客描述了紫光同创FPGA实现HSSTHP光口视频传输+图像缩放的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往
紫光同创FPGA相关方案推荐
鉴于国产FPGA的优异表现和市场需求,我专门开设了一个人紫光同创FPGA专栏,里面收录了基于紫光同创FPGA的图像处理、UDP网络通信、GT高速接口、PCIE等博客,感兴趣的可以去看看,博客地址:点击直接前往
我这里已有的 GT 高速接口解决方案
我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往
Xilinx系列FPGA实现GTP光口视频传输方案推荐
Xilinx 7系列FPGA基于GTP实现光口视频传输,其性能优于紫光同创FPGA的HSSTLP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
Xilinx系列FPGA实现GTX光口视频传输方案推荐
Xilinx 7系列FPGA基于GTX实现光口视频传输,其性能优于紫光同创FPGA的HSSTLP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
Xilinx系列FPGA实现GTH光口视频传输方案推荐
Xilinx 7系列FPGA基于GTH实现光口视频传输,其性能优于紫光同创FPGA的HSSTLP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
Xilinx系列FPGA实现UltraScale-GTH光口视频传输方案推荐
Xilinx UltraScale系列FPGA基于UltraScale-GTH实现光口视频传输,其性能优于紫光同创FPGA的HSSTLP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
Xilinx系列FPGA实现UltraScale-GTY光口视频传输方案推荐
Xilinx UltraScale+系列FPGA基于UltraScale-GTY实现光口视频传输,其性能优于紫光同创FPGA的HSSTLP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
紫光同创PGL100G系列FPGA实现HSSTLP光口视频传输方案推荐
紫光同创PGL100G系列FPGA基于HSSTLP实现光口视频传输,其性能不及紫光同创FPGA的HSSTHP,有这方面需求的用户可以参考本博之前的博客,博客链接如下:
点击直接前往
3、设计思路框架
工程设计原理框图
工程设计原理框图如下:
输入Sensor之-->OV7725摄像头
输入Sensor是本工程的输入设备,其一为OV7725摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:
SENSOR_TYPE=0;则输出OV7725摄像头采集的视频;
SENSOR_TYPE=1;则输出动态彩条的视频;
OV7725摄像头需要i2c初始化配置,本设计配置为640x480@60Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV7725摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV7725摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:
输入Sensor之-->OV5640摄像头
输入Sensor是本工程的输入设备,其一为OV5640摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:
SENSOR_TYPE=0;则输出OV5640摄像头采集的视频;
SENSOR_TYPE=1;则输出动态彩条的视频;
OV5640摄像头需要i2c初始化配置,本设计配置为1280x720@30Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV5640摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV5640摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:
输入Sensor之-->芯片解码的HDMI
输入Sensor是本工程的输入设备,其二为板载的HDMI输入接口;输入源为板载的HDMI输入接口或动态彩条,分辨率为1920x1080@60Hz,使用笔记本电脑接入HDMI输入接口,以模拟输入Sensor;HDMI解码方案为芯片解码,使用IT6802,可将输入的HDMI视频解码为RGB888视频;FPGA纯verilog实现的i2c配置模块完成对IT6802芯片的配置,分辨率配置为1920x1080@60Hz;可以通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:
SENSOR_TYPE=0;则输出HDMI接口采集的视频;
SENSOR_TYPE=1;则输出动态彩条的视频;
整个模块代码架构如下:
图像缩放模块详解
图像缩放模块功能框图如下,由跨时钟FIFO、插值+RAM阵列构成,跨时钟FIFO的目的是解决跨时钟域的问题,比如从低分辨率视频放大到高分辨率视频时,像素时钟必然需要变大,这是就需要异步FIFO了,插值算法和RAM阵列具体负责图像缩放算法层面的实现;
插值算法和RAM阵列以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
依据上图,图像缩放模块内部核心是例化了4个双口RAM,作用是缓存4行图像,以得到4个临近的像素,以此为基础做线性插值;如果是做图像放大操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中插入更多的像素点来扩大分辨率;如果是做图像缩小操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中删除更多的像素点来缩小分辨率;此外,前面描述的工作是实时的、整幅图像全部扫描式的进行,所以需要对RAM的读写操作进行精准控制;
图像缩放模块代码架构如下:模块的例化请参考工程源码的顶层代码;
图像缩放模块FIFO的选择可以调用工程对应的PDS工具自带的FIFO IP核,也可以使用纯verilog实现的FIFO,可通过接口参数选择,图像缩放模块顶层接口如下:
FIFO_TYPE选择原则如下:
1:总体原则,选择"ziguang"好处大于选择"verilog";
2:当你的FPGA逻辑资源不足时,请选"ziguang";
3:当你图像缩放的视频分辨率较大时,请选"ziguang";
4:当你的FPGA没有FIFO IP或者FIFO IP快用完了,请选"verilog";
5:当你向自学一下异步FIFO时,,请选"verilog";
6:不同FPGA型号对应的工程FIFO_TYPE参数不一样,但选择原则一样,具体参考代码;
2种插值算法的整合与选择
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:
c
input wire i_scaler_type //0-->bilinear;1-->neighbor
通过输入i_scaler_type 的值即可选择;
输入0选择双线性插值算法;
输入1选择邻域插值算法;
代码里的配置如下:
图像缩放模块使用(重点阅读)
图像缩放模块使用非常简单,顶层代码里设置了四个参数,如下:
上图是将输入视频分辨率从1280x720缩放为1920x1080;
如果你想将输入视频分辨率从1280x720缩放为640x480;
则只需修改为如下:
再比如你想将输入视频分辨率从1280x720缩放为960x540;
则只需修改为如下:
在本博主这里,想要实现图像缩放,操作就是这么无脑简单,就该两个参数就能搞定貌似高大上的双线性插值图像缩放,这种设计、这种操作、这种工程源码,你还喜欢吗?
图像缩放模块仿真
图像缩放模块需要vivado和matlab联合仿真;
需要注意的是,仿真的目的是为了验证,这一步我已经替你们做完了,所以读者不再需要单独仿真,如果读者是在需要自己仿真玩玩儿,需要自己写仿真代码;vivado和matlab联合仿真详细步骤如下:
第一步:网上下载一张1280X720的图片,并用matlab将图片转换为RGB格式的txt文档;
第二步:在vivado下设计tstbench,将RGB格式的txt文档作为视频输入源给到图像缩放模块,并将缩放后的图像数据写入输出txt文档;
第二步:用matlab将输出txt文档转换为图片,并于原图一并输出显示以做比较;
根据以上方法得到以下仿真结果:
双线性插值算法原图1280X720缩小到800x600如下:
邻域插值算法原图1280X720缩小到800x600如下:
双线性插值算法原图1280X720放大到1920x1080如下:
邻域插值算法原图1280X720放大到1920x1080如下:
视频数据组包
由于视频需要在HSSTHP中通过aurora 8b/10b协议收发,所以数据必须进行组包,以适应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:
首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入HSSTHP发送;在此之前,需要对一帧视频进行编号,也叫作指令,HSSTHP组包时根据固定的指令进行数据发送,HSSTHP解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好理解,所以我在代码里进行了详细的中文注释,需要注意的是,为了防止中文注释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:
注意!!!指令可以任意更改,但最低字节必须为bc;
基于HSSTHP高速接口的视频传输架构
本设计使用HSSTHP高速接口传输视频,使用8b/10b编解码协议,搭建基于HSSTHP高速接口的视频传输架构,包括视频数据组包模块、HSSTHP IP核配置调用、接收数据对齐模块、视频数据解包模块等部分,总体代码架构如下:
基于HSSTHP高速接口的视频传输架构顶层接口核参数配置如下:
本设计共例化了2路HSSTHP,所以2路HSSTHP的收发回环方式也做了灵活的参数化配置,如果你只需要1路HSSTHP,则可删除另一路,如果你想例化更多路HSSTHP,则可根据上述设计方法扩展,十分方便;
HSSTHP IP 简介
关于HSSTHP介绍最详细的肯定是紫光同创官方的《Titan2 系列产品 HSSTHP IP用户指南》,我们以此来解读:
Titan2系列产品内置了高速串行接口模块,即 HSSTHP。除了 PMA,HSSTHP还集成了丰富的 PCS功能,可灵活应用于各种串行协议标准,每通道的收发速度高达12.5 Gb/s,收发器支持不同的串行传输接口或协议,支持 PCI1.0,PCI2.0,XAUI,千兆以太网,CPRI,SRIO 等协议,官方宣称可对标Xilinx的GTX;
HSSTHP基本结构
紫光同创FPGA的HSSTHP模仿了Xilinx的GTX,HSSTHP基本结构如下:
每个 HSSTHP由两个 PLL 和四个收发 LANE 组成,其中每个 LANE 有两个子层:PCS(物理编码子层)和 PMA(物理媒体连接子层),PCS 子层包含 8B/10B 编解码、缓冲区、通道绑定和时钟修正等电路;PMA 层主要进行串并、并串转换、预加重、去加重、串行数据的发送和数据时钟的提取,包括四个组件:PCS Transmitter,PMATransmitter,PCS Receiver,PMA Receiver。PCS Transmitter 和 PMA Transmitter组成发送通路,PCS Receiver 和 PMA Receiver 组成接收通路;HSSTLP 中的四个收发 LANE 共享 PLL0 和 PLL1,每个发送或者接收 LANE 都可以独立选择 PLL0 或者 PLL1,PLL 工作频率范围参见《Titan2 系列产品 HSSTHP IP用户指南》。PLL0 和 PLL1 都各自对应有一对外部差分参考时钟输入,每个 PLL 还可以选择来自另一个 PLL 的参考时钟或者来自 Fabric 的时钟作为参考时钟输入(Fabric 逻辑时钟做参考时钟,仅用于内部测试);PLL 输出频率支持动态再分频,以适应 Data Rate 范围。
HSSTHP发送和接收处理流程
首先用户逻辑数据经过 8B/10B 编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 设计时不慎将 TXP 和 TXN 差分引脚交叉连接,则可以通过极性控制(Polarity)来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。这里的每一个功能点都可以写一篇论文甚至是一本书,所以这里只需要知道个概念即可,在具体的项目中回具体用到,还是那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。
HSSTHP的参考时钟
HSSTHP参考时钟源选择的结构示意图如下:
HSSTHP支持PLL0、PLL1和LANE TX/RX 参考时钟的灵活选择:每个HSSTHP都有两对专用的差分参考时钟输入管脚 P_REFCK0P/P_REFCK0N和P_REFCK1P/P_REFCK1N,PLL 也可以选择来自 Fabric 的时钟P_PLL0_REF_CLK,P_PLL1_REF_CLK(Fabric 逻辑时钟做参考时钟,仅用于内部测试),仅Titan2器件支持选择来自相邻HSSTHP的参考时钟,通过PMA_PLL_REG_REFCLK_SEL和PMA_PLL_REG_CML_CLK_OUT_EN配置,PG2L 系列 25H、50H、100H 不支持这种用法,LANE TX,RX可以各自独立选择来自PLL0或者PLL1输出的时钟;专用时钟输入管脚P_REFCK0P/P_REFCK0N 和
P_REFCK1P/P_REFCK1N也可以通过端口P_PLL0_REFCK2CORE和P_PLL1_REFCK2CORE 输出到Fabric;
HSSTHP发送接口
紫光同创官方的《Titan2 系列产品 HSSTHP IP用户指南》详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲HSSTHP例化时留给用户的发送部分需要用到的接口;用户只需要关心发送接口的时钟和数据即可,以例化2路HSSTHP为例,经本博主优化,用户只需要关心如下HSSTHP发送接口即可快速使用HSSTHP;
HSSTHP接收接口
紫光同创官方的《Titan2 系列产品 HSSTHP IP用户指南》详细介绍了接收处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲HSSTHP例化时留给用户的发送部分需要用到的接口;用户只需要关心接收接口的时钟和数据即可,以例化2路HSSTHP为例,经本博主优化,用户只需要关心如下HSSTHP接收接口即可快速使用HSSTHP;
HSSTHP IP核调用和使用
HSSTHP的使用比较特殊,需要先调用配置IP,然后再打开官方生成的Example工程,然后修改Example工程,删除数据生成和数据比对模块,再添加用户需要的信号逻辑,用起来比较麻烦;因为HSSTHP IP配置后并不能直接使用,需要修改其内部代码才能使用,这也是国产FPGA的不成熟之处;HSSTHP IP核配置调用在工程种位置如下:
IP配置好后,打开打开官方生成的Example工程,位置如下:
!!!注意
本设计使用的HSSTHP IP版本为ipm2t_hssthp_v1_4,安装包以放在资料中,请用户自行安装,安装包目录如下:
HSSTHP IP核调用和使用很简单,通过PDS的UI界面即可完成,如下:
这里对上图的标号做解释:
1:线速率,根据自己的项目需求来,HSSTHP线速率最高12.5G,由于我的项目是视频传输,所以在HSSTHP的速率范围内均可,为了通用性,我在工程中配置为3G;
2:参考时钟,这个得根据你的原理图来,可以是80M、125M、148.5M、156.25M等等,我的开发板是125M;
4:HSSTHP通道(Channel)的绑定,这个很重要,他的绑定参考依据有两个,一是你的开发板原理图,二是官方的参考资料《Titan2 系列产品 HSSTHP IP用户指南》;我的板子原理图如下:
数据对齐
由于HSSTHP资源的aurora 8b/10b数据收发天然有着数据错位的情况,所以需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:
我定义的 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 字节的数据中[15: 8] 为 COM 码;
rx_ctrl = 4'b0100 表示 4 字节的数据中[23:16] 为 COM 码;
rx_ctrl = 4'b1000 表示 4 字节的数据中[31:24] 为 COM 码;
基于此,当接收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的基础操作,这里不再赘述;数据对齐模块顶层接口如下:
视频数据解包
数据解包是数据组包的逆过程,代码位置如下:
HSSTHP解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;由于数据解包是数据组包的逆过程,所以这里不再过多赘述,视频数据解包模块顶层接口如下:
图像缓存架构
此模块为点对点视频接收端工程所独有;图像缓存架构实现的功能是将输入视频缓存到板载DDR4中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了紫光官方的HMIC_S IP核作为DDR4控制器,所以图像缓存架构就是实现用户数据到HMIC_S的桥接作用;架构如下:
图像缓存架构由视频缓存帧更新模块+写视频控制逻辑+读视频控制逻辑+AXI4-FULL-Master总线模块组成;AXI4-FULL-Master总线模块实际上就是一个AXI4-FULL总线主设备,与HMIC_S IP核对接,HMIC_S IP核配置为AXI4-FULL接口;写视频控制逻辑、读视频控制逻辑实际上就是一个视频读写状态机,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;写视频控制逻辑每次写入一次突发传输的视频数据,记作Y,即每次向DDR4中写入Y个像素,写M×N÷Y次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以忽略AXI4内部代码,以简单地像使用FIFO那样操作AXI4总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为4帧缓存;图像缓存模块代码架构如下:
DDR4控制器IP安装包以附带资料包中,如下:
HDMI输出架构
HDMI输出包括Native视频时序和HDMI编码,Native视频时序的作用是产生传统VGA的、RGB的视频流;HDMI编码采用Silicom9134芯片编码方式,FPGA仅需输出RGB视频流即可;HDMI输出代码架构如下:
工程源码架构
以工程2为例,工程源码架构如下:
4、PDS工程源码1详解:OV7725输入版本
开发板FPGA型号:紫光同创--PG2T390H-6FFBG900;
开发环境:Pango Design Suite 2021.1
输入:OV7725摄像头或FPGA内部动态彩条,分辨率640x480@60Hz;
输出:HDMI,Silicom9134芯片编码,1920x1080黑色背景下叠加显示缩放后的图像;
回环光口类型:SFP+光口;
高速接口类型:HSSTHP,线速率3Gbps;
高速接口编解码协议:8b/10b编解码;
图像缩放方案:纯Verilog图像缩放;
图像缩放实例:640x480缩放到1920x1080,其他分辨率缩放可自行修改;
图像缓存方案:纯Verilog图像缓存,4帧缓存;
工程作用:紫光同创FPGA图像视频采集系统;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握紫光同创FPGA实现HSSTHP光口视频传输的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
5、PDS工程源码2详解:OV5640输入版本
开发板FPGA型号:紫光同创--PG2T390H-6FFBG900;
开发环境:Pango Design Suite 2021.1
输入:OV5640摄像头或FPGA内部动态彩条,分辨率1280x720@30Hz;
输出:HDMI,Silicom9134芯片编码,1920x1080黑色背景下叠加显示缩放后的图像;
回环光口类型:SFP+光口;
高速接口类型:HSSTHP,线速率3Gbps;
高速接口编解码协议:8b/10b编解码;
图像缩放方案:纯Verilog图像缩放;
图像缩放实例:640x480缩放到1920x1080,其他分辨率缩放可自行修改;
图像缓存方案:纯Verilog图像缓存,4帧缓存;
工程作用:紫光同创FPGA图像视频采集系统;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握紫光同创FPGA实现HSSTHP光口视频传输的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
6、PDS工程源码3详解:HDMI输入版本
开发板FPGA型号:紫光同创--PG2T390H-6FFBG900;
开发环境:Pango Design Suite 2021.1
输入:HDMI或者FPGA内部动态彩条,silicom9011芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:HDMI,Silicom9134芯片编码,1920x1080黑色背景下叠加显示缩放后的图像;
回环光口类型:SFP+光口;
高速接口类型:HSSTHP,线速率3Gbps;
高速接口编解码协议:8b/10b编解码;
图像缩放方案:纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到1280x720,其他分辨率缩放可自行修改;
图像缓存方案:纯Verilog图像缓存,4帧缓存;
工程作用:紫光同创FPGA图像视频采集系统;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握紫光同创FPGA实现HSSTHP光口视频传输的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
7、上板调试验证并演示
准备工作
你需要有以下装备才能移植并测试该工程代码:
1:FPGA开发板;
2:OV7725或OV5640摄像头或笔记本电脑,没有则请使用FPGA内部生成的彩条;
3:HDMI传输线;
4:HDMI显示,要求分辨率支持1920x1080;
SFP光模块和光纤;
我的开发板了连接如下:
HSSTHP光口视频缩放传输效果演示
HSSTHP光口视频缩放传输效果演示如下:
紫光-SFP缩放
8、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。