FPGA实现CameraLink视频解码转SRIO与DSP交互,FPGA+DSP多核异构图像处理架构,提供2套工程源码和技术支持
目录
- 1、前言:SRIO在FPGA+DSP架构中的作用
- 工程概述
- 免责声明
- 2、相关方案推荐
- 我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
- 我这里已有的FPGA+DSP异构方案
- 我这里已有的 GT 高速接口解决方案
- FPGA实现CameraLink视频编解码方案
- 3、工程详细设计方案
- 工程设计原理框图
- FPGA端-工程源码架构
- FPGA端-输入CameraLink相机
- FPGA端-LVDS视频解码模块
- FPGA端-LVDS视频对齐
- FPGA端-SRIO视频组包模块
- FPGA端-SRIO主设备(initiator)
- DSP端工程
- 4、工程源码1详解:FPGA逻辑工程
- 5、工程源码2详解:DSP RTOS系统工程
- 6、工程移植说明
- vivado版本不一致处理
- FPGA型号不一致处理
- 其他注意事项
- 7、上板调试验证
- 准备工作
- 程序下载bit
- DSP RTOS系统工程测试
- 8、工程代码获取
FPGA实现CameraLink视频解码转SRIO与DSP交互,FPGA+DSP多核异构图像处理架构,提供2套工程源码和技术支持
1、前言:SRIO在FPGA+DSP架构中的作用
SRIO简介:
RapidIO 是由 Motorola 和 Mercury 等公司率先倡导的一种高性能、 低引脚数,基于数据包交换的互连体系结构,是为满足高性能嵌入式系统需求而设计的一种开放式互连技术标准;SRIO 包含三层结构协议,即物理层、传输层、逻辑层,SRIO体系结构如下:
逻辑层:定义包的类型、大小、物理地址、传输协议等必要配置信息。
传输层:定义包交换、路由和寻址规则,以确保信息在系统内正确传输。
物理层:包含设备级接口信息,如电气特性、错误管理数据和基本流量控制数据等信息。
SRIO收发逻辑框图如下:
SRIO(Serial RapidIO)在FPGA+DSP异构架构中扮演着高速数据通道与系统互连核心的角色,其作用与优势主要体现在以下方面:
SRIO的核心作用
1、高速数据通道
实时数据传输:FPGA负责前端数据采集(如雷达回波、图像信号),通过SRIO将原始数据直接传输至DSP处理,速率可达 8-10 Gbps(实测效率>80%理论值)。
低延迟交互:点对点传输延迟仅微秒级,满足实时处理需求(如电机控制、雷达成像)。
2、直接内存访问(DMA)
DSP可通过SRIO直接读写FPGA的片上存储或外挂DDR,无需CPU干预。例如:
SWRITE事务实现零开销突发传输,效率达95%以上。
FPGA作为协处理器时,DSP直接获取处理结果(如滤波后图像)。
3、可靠消息通知
门铃(Doorbell)中断:DSP向FPGA发送16位轻量级消息,触发实时响应(如任务启动/停止)。
中断延迟<1μs,优于传统GPIO。
4、系统级扩展性
通过SRIO交换器连接多DSP/FPGA,构建分布式计算网络(如4个DSP+FPGA的基带处理卡)。
支持动态路由与多播传输,适应复杂拓扑。
SRIO的技术优势
1、高带宽与低延迟
2、硬件级可靠性
错误检测与重传:内置CRC校验与链路层重传机制,误码率<10⁻¹²。
路径冗余:支持多路径备份,单点故障不影响系统运行(关键用于航天电子)。
3、灵活的协议支持
传输模式:
Direct I/O:直接存储映射(NWRITE/NREAD),适合大数据块传输。
Message Passing:信箱机制,支持复杂命令交互(如FPGA向DSP发送状态报告)。
物理层适配:支持1x/2x/4x链路聚合,兼容背板(VPX)、光模块等连接方式。
4、低功耗设计
相比PCIe,SRIO功耗低30-40%(实测1.5W@5Gbps)。
静态功耗<0.1W,适合电池供电设备(如无人机雷达)。
典型应用场景
1、实时图像处理系统
FPGA完成像素校正,DSP执行AI识别,传输延迟<10ms
2、无线通信基带
FPGA处理ADC采样数据,经SRIO分发至多DSP核(如LDPC解码)。
支持5G Massive MIMO的μs级波束成型。
3、高可靠性系统
航天器中的FPGA+DSP通过SRIO互连,抗辐射设计(如三模冗余)确保太空环境下的数据传输
总结
SRIO在FPGA+DSP架构中的核心价值是:
✅ 突破总线瓶颈:提供>8Gbps的稳定带宽,替代共享总线。
✅ 实现异构协同:FPGA并行预处理 + DSP复杂算法,通过SRIO无缝衔接。
✅ 构建高可靠网络:冗余链路与硬件校验机制,满足军工/航天级需求
工程概述
本文详细描述了Xilinx的7系列FPGA实现CameraLink视频解码转SRIO与DSP交互,搭建FPGA+DSP多核异构图像处理架构,以下从FPGA工程和DSP工程两个方向描述整个设计:
FPGA工程
FPGA工程实现Sensor采集,因为FPGA是并行执行,实时性较好;
FPGA工程主要实现CameraLink视频解码、SRIO视频组包、SRIO数据发送功能;输入视频为CameraLink相机,相机为Full模式,LVDS差分对为12对差分数据+3对随路差分时钟;CameraLink相机LVDS视频对首先送入纯verilog代码实现的LVDS接收解码模块实现LVDS视频解码,输出并行视频数据,LVDS接收解码模块需要用到Xilinx ISERDES2原语;然后解码视频送入纯verilog代码实现的LVDS视频对齐模块实现视频时序恢复,根据CameraLink协议和相机数据手册将并行视频数据恢复为Native视频时序,提取出行同步信号、长同步信号、数据有效信号和视频像素数据;然后解码视频进入纯verilog代码实现的SRIO视频组包模块实现将视频数据封装为SRIO HELLO格式包(SWRITE操作),并在指定数据量后插入门铃通知(DOORBELL操作),最后通过AXI4-Stream接口输出给SRIO IP核;然后调用Xilinx官方的SRIO IP核实现SRIO协议的物理层、传输层、逻辑层,作为SRIO的主设备(initiator),SRIO IP核留出了用户逻辑接口,用户只需要写自己的逻辑电路与之对接即可完成SRIO通信;最后视频数据通过FPGA的GTX高速收发器发送至板载的DSP芯片做后续的图像处理;至此,FPGA的使命已经完成;
DSP工程
DSP工程实现图像处理,因为DSP转为信号处理而设计,便于算法实现;
DSP工程实现 DSP作为SRIO从设备(Target),通过SRIO高速接口接收FPGA发来的视频流,并对视频进行图像处理后通过网口输出PC上位机显示;DSP工程为多核协同工作,跑RTOS操作系统,功能包括通过SRIO接口接收FPGA发送的视频流数据、使用多核并行处理进行图像边缘检测、通过以太网将处理后的图像传输到Web客户端、提供Web界面控制处理参数(处理核数、帧率等)等,经过图像处理后的视频会被压缩为JPEG图片,通过有线网发送到PC端网页显示图片;至此,DSP的使命已经完成;
针对市场主流需求,本博客提供2套工程源码,具体如下:
现对上述2套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为Xilinx公司的XC7K325T-2FFG676I;FPGA工程主要实现CameraLink视频解码、SRIO视频组包、SRIO数据发送功能;输入视频为CameraLink相机,相机为Full模式,分辨率为2560x2048@107Hz;CameraLink相机LVDS视频对首先送入纯verilog代码实现的LVDS接收解码模块实现LVDS视频解码,输出并行视频数据,LVDS接收解码模块需要用到Xilinx ISERDES2原语;然后解码视频送入纯verilog代码实现的LVDS视频对齐模块实现视频时序恢复,根据CameraLink协议和相机数据手册将并行视频数据恢复为Native视频时序,提取出行同步信号、长同步信号、数据有效信号和视频像素数据;然后解码视频进入纯verilog代码实现的SRIO视频组包模块实现将视频数据封装为SRIO HELLO格式包(SWRITE操作),并在指定数据量后插入门铃通知(DOORBELL操作),最后通过AXI4-Stream接口输出给SRIO IP核;然后调用Xilinx官方的SRIO IP核实现SRIO协议的物理层、传输层、逻辑层,作为SRIO的主设备(initiator),SRIO IP核留出了用户逻辑接口,用户只需要写自己的逻辑电路与之对接即可完成SRIO通信;最后视频数据通过FPGA的GTX高速收发器发送至板载的DSP芯片做后续的图像处理,输出分辨率为2560x2048@107Hz;至此,FPGA的使命已经完成;
工程源码2
DSP工程实现 DSP作为SRIO从设备(Target),通过SRIO高速接口接收FPGA发来的视频流,并对视频进行图像处理后通过网口输出PC上位机显示;DSP工程为多核协同工作,C66xx_0为主核心,C66xx_1~C66xx_7为从核心,跑RTOS操作系统,功能包括通过SRIO接口接收FPGA发送的视频流数据、使用多核并行处理进行图像边缘检测、通过以太网将处理后的图像传输到Web客户端、提供Web界面控制处理参数(处理核数、帧率等)等,经过图像处理后的视频会被压缩为JPEG图片,通过有线网发送到PC端网页显示图片;至此,DSP的使命已经完成;
本文详细描述了FPGA实现CameraLink视频解码转SRIO与DSP交互的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往
我这里已有的FPGA+DSP异构方案
目前我这里有大量FPGA+DSP异构方案的工程源码,包括EMIF、SRIO、PCIE等等,对FPGA+DSP异构方案有需求的兄弟可以去看看:
直接点击前往
我这里已有的 GT 高速接口解决方案
我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往
FPGA实现CameraLink视频编解码方案
我的CameraLink视频专栏有很多FPGA的CaeraLink视频编解码方案,既有CaeraLink接收,也有CaeraLink发送,既有CaeraLink普通输出显示,也有CaeraLink视频拼接输出等等,专栏链接如下:欢迎前往查看:
点击直接前往
3、工程详细设计方案
工程设计原理框图
工程设计原理框图如下:
FPGA端-工程源码架构
FPGA端工程源码架构如下:
FPGA端-输入CameraLink相机
输入视频为CameraLink工业相机,相机为Full模式,输出分辨率为2560x2048@107Hz,输出灰度图,输出为4-Tap模式,即一个像素时钟输出4个像素;CameraLink相机如下:
FPGA端-LVDS视频解码模块
本设计参考了Xilinx官方设计,基于ISERDES2原语实现的LVDS解码模块对输入的CameraLink视频进行解码;LVDS视频解码模块设计框图如下:
LVDS视频解码模块输入为随路差分时钟对和LVDS差分数据对;利用Xilinx官方IDELAY和ISERDES原语实现串并转换;模块总体代码架构如下:
IDELAY原语用于接收延时,保证接收端视频的稳定性;ISERDES2原语用于串并转换,将输入串行差分数据转换为并行数据;此外,LVDS解串视频还需要做对齐处理,随路时钟也需要通过MMCM输出同步处理;整个LVDS视频解码模块严格按照设计框图实现,解码模块顶层接口如下:
这两个参数可自由配置,以适应CameraLink相机的不同模式;具体配置如下:
FPGA端-LVDS视频对齐
调用LVDS视频对齐模块,根据CameraLink视频协议提取出行同步信号、场同步信号、数据有效信号和像素数据;模块总体代码架构如下:
模块顶层接口如下:
FPGA端-SRIO视频组包模块
FPGA端SRIO视频组包模块顶层接口如下:
解码视频进入纯verilog代码实现的SRIO视频组包模块实现将视频数据封装为SRIO HELLO格式包(SWRITE操作),并在指定数据量后插入门铃通知(DOORBELL操作),最后通过AXI4-Stream接口输出给SRIO IP核;
SRIO视频组包模块核心功能
该模块实现视频流到SRIO协议包的实时转换与传输,主要完成:
1、接收视频数据流(AXIS接口)
2、将视频数据封装为SRIO HELLO格式包(SWRITE操作)
3、在指定数据量后插入门铃通知(DOORBELL操作)
4、通过AXI4-Stream接口输出给SRIO IP核
SRIO视频组包模块系统架构图
SRIO视频组包模块系统架构图如下:
SRIO视频组包模块工作流程详解
1、视频数据接收与缓冲
本设计调用Xilinx官方的FIFO_DUALCLOCK_MACRO原语实现FIFO缓冲,配置 FIFO 大小为 36Kbit,读写数据的位宽为 64bit(FIFO 深度为 512);如下:
2、SRIO数据包发送流程如下:
3、系统状态机设计如下:
状态说明:
SEND_DATA:发送视频数据包(SWRITE操作)
SEND_DB:发送门铃通知包(DOORBELL操作)
FPGA端-SRIO主设备(initiator)
FPGA工程调用Xilinx官方的SRIO IP核实现SRIO协议的物理层、传输层、逻辑层,作为SRIO的主设备(initiator),SRIO IP核留出了用户逻辑接口,用户只需要写自己的逻辑电路与之对接即可完成SRIO通信;本设计使用Xilinx官方的Serial Rapidlo Gen2 IP核,基础配置如下:
SRIO配置为5Gbps×2 Lane,对应的GT差分时钟需为125M;工程代码中通过配置cdcm61002时钟芯片输出125M连接至GTX高速收发器BANK;SRIO设计请参考Xilinx官方数据手册《pg007_srio_gen2》;I/O 端口配置使用 HELLO 格式包,其他参数保持默认值即可;
DSP端工程
DSP工程实现 DSP作为SRIO从设备(Target),通过SRIO高速接口接收FPGA发来的视频流,并对视频进行图像处理后通过网口输出PC上位机显示;DSP工程为多核协同工作,C66xx_0为主核心,C66xx_1~C66xx_7为从核心,跑RTOS操作系统,功能包括通过SRIO接口接收FPGA发送的视频流数据、使用多核并行处理进行图像边缘检测、通过以太网将处理后的图像传输到Web客户端、提供Web界面控制处理参数(处理核数、帧率等)等,经过图像处理后的视频会被压缩为JPEG图片,通过有线网发送到PC端网页显示图片;至此,DSP的使命已经完成;
多核协同
DSP工程为多核协同工作,C66xx_0为主核心,C66xx_1~C66xx_7为从核心,跑RTOS操作系统,如下:
代码功能概述
这是一个基于TI C66x DSP的SRIO图像处理系统主程序,主要功能包括:
1、通过SRIO接口接收FPGA发送的视频流数据
2、使用多核并行处理进行图像边缘检测
3、通过以太网将处理后的图像传输到Web客户端
4、提供Web界面控制处理参数(处理核数、帧率等)
DSP端工程主核心流程图如下:
DSP端工程主核心程序状态图如下:
DSP端详细代码解析
1、系统初始化
int main(void) {// 硬件初始化psc_init(); // 电源管理uart_init(); // 串口调试enable_srio(); // 启用SRIOsrio_device_init(); // SRIO设备配置init_sgmii(); // 网络PHY初始化// 多核通信初始化HeapBufMP_create(); // 共享内存MessageQ_registerHeap();MultiProc_setLocalId();// 中断配置CpIntc_dispatchPlug(); // SRIO门铃中断Hwi_create(); // 硬件中断// 任务创建Task_create(image_processing_master); // 网络服务Task_create(timer_task); // 统计任务Task_create(image_processing_slave); // 从核处理Task_create(srio_image); // 主处理BIOS_start(); // 启动调度器
}
2、SRIO中断处理
void srio_db_isr(UArg arg) {// 获取门铃中断状态CSL_SRIO_GetDoorbellPendingInterrupt(hSrio, 0, &db_status);// 确定数据地址 (双缓冲)srio_data_addr = (db_status == SRIO_DOORB_INFO1) ? SRIO_DATA_ADDR : SRIO_DATA_ADDR + SRIO_TRANS_SIZE;// 通知处理任务Mailbox_post(mbox_image, &srio_data_addr, 0);// 清除中断标志CSL_SRIO_ClearDoorbellPendingInterrupt(hSrio, 0, db_status);
}
3、图像处理任务
void srio_image(UArg arg0, UArg arg1) {while(1) {// 等待SRIO数据Mailbox_pend(mbox_image, &srio_data_addr, BIOS_WAIT_FOREVER);// 帧率控制逻辑if(需要处理帧) {input_image.data = (uint8_t*)srio_data_addr;output_image.data = edge_buffer;// 多核边缘检测mc_process_image(&input_image, &output_image, number_of_cores, &process_time, &sobel_time);// 统计信息更新process_time_total += process_time;sobel_time_total += sobel_time;edge_frame_count++;} else {// 帧丢弃统计drop_frame_count++;}// 通知网络传输if(需要显示) {Mailbox_post(mbox_display, NULL, 0);}}
}
4、网络服务
int image_processing_master(void) {// 网络配置if(使用静态IP) {CfgAddEntry(CFGTAG_IPNET...); // 添加IP配置} else {CfgAddEntry(CFGITEM_SERVICE_DHCPCLIENT...); // DHCP配置}// 添加Web服务image_processing_webfiles_add();CfgAddEntry(CFGITEM_SERVICE_HTTP...);// 启动网络栈NC_NetStart(hCfg, NetworkOpen, NetworkClose, NetworkIPAddr);
}
5、性能统计任务
void timer_task(UArg arg0, UArg arg1) {while(1) {// 计算帧率edge_frame_rate = edge_frame_count / 时间间隔;// UART输出统计信息uart_printf("\r--> image edge framerate: %5d fps", edge_frame_rate);uart_printf("\r--> image display framerate: %5d fps", display_frame_count);// 重置计数器display_frame_count = 0;edge_frame_count = 0;Task_sleep(1000); // 1秒间隔}
}
关键数据结构
// 原始图像结构
typedef struct {uint8_t* data; // 图像数据指针uint32_t length; // 数据长度
} raw_image_data_t;// 全局图像实例
raw_image_data_t input_image = {0, 0}; // 输入图像
raw_image_data_t output_image = {0, 0}; // 输出图像// 处理缓冲区
#pragma DATA_SECTION(edge_buffer,"systemHeapMaster");
uint8_t edge_buffer[IMAGE_WIDTH * IMAGE_HEIGH]; // 边缘检测结果
#pragma DATA_SECTION(jpeg_buffer,"systemHeapMaster");
uint8_t jpeg_buffer[IMAGE_WIDTH * IMAGE_HEIGH]; // JPEG编码缓冲区
核心价值总结
此代码实现的价值在于:
1、高性能并行处理:
利用多核DSP并行处理图像(C6678支持8核,C665x支持2核)
基于邮箱(Mailbox)的核间通信机制
2、动态参数调整:
通过Web界面实时调整处理核数(number_of_cores)
动态帧率控制(max_of_frames)
3、双缓冲机制:
#define SRIO_DATA_ADDR 0x90000000 // 缓冲区1
#define SRIO_TRANS_SIZE (IMAGE_WIDTH*IMAGE_HEIGH)
// 缓冲区2 = SRIO_DATA_ADDR + SRIO_TRANS_SIZE
4、实时统计:
边缘检测帧率
处理时间统计
帧丢弃统计
5、灵活网络配置:
支持静态IP/DHCP自动配置
内嵌Web服务器
此系统实现了从高速SRIO接口接收视频流,到多核并行处理,最后通过网络传输的完整图像处理流水线,适用于工业视觉检测、医疗影像处理等实时图像处理场景。
4、工程源码1详解:FPGA逻辑工程
开发板FPGA型号:Xilinx–XC7K325T-2FFG676I;
FPGA开发环境:Vivado2019.1;
视频输入:CameraLink相机,Full模式,分辨率2560x2048@107Hz;
视频输口:SRIO高速接口,分辨率2560x2048@107Hz;
CameraLink视频解码方案:Xilinx官方ISERDES2原语LVDS解码方案;
LVDS差分对:12对差分数据+3对随路差分时钟;
实现功能:CameraLink转SRIO,FPGA为SRIO主设备(Initiator);
工程作用:此工程目的是让读者掌握FPGA实现CameraLink视频解码转SRIO与DSP交互的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
5、工程源码2详解:DSP RTOS系统工程
开发板DSP型号:TI–TMS320C6678;
FPGA开发环境:CCS5.5;
视频输入:SRIO高速接口,分辨率2560x2048@107Hz;
图像输出:千兆网口,JPEG压缩图片,图片大小2560x2048;
图像处理:Sobel边缘检测、JPEG压缩;
实现功能:DSP为SRIO从设备(Target);
DSP工程操作系统:RTOS操作系统;
工程作用:此工程目的是让读者掌握FPGA实现CameraLink视频解码转SRIO与DSP交互的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
DSP裸机工程源码架构如下:
6、工程移植说明
vivado版本不一致处理
1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解决如下:
打开工程后会发现IP都被锁住了,如下:
此时需要升级IP,操作如下:
FPGA型号不一致处理
如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;
其他注意事项
1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;
7、上板调试验证
准备工作
需要准备的器材如下:
CameraLink相机;
CameraLink转接板;
FPGA+DSP异构开发板;
测试用PC电脑;
串口线、网线;
用网线连接FPGA+DSP开发板到PC电脑端;
程序下载bit
步骤如下:(顺序一定要对)
1、先下载FPGA程序
2、再下载从核心DSP程序srio_image_processing_slave.out到至 C66xx_1~C66xx_7;
3、再下载主核心DSP程序srio_image_processing_master.out到至 C66xx0;
如下:
DSP RTOS系统工程测试
运行 C66xx_0 核心程序,DSP 端串口调试终端将会打印如下信息,开发板使用DHCP模式自动获取IP地址,如下:
然后在PC电脑端浏览器输入开发板IP地址打开网页界面,在网页界面中选择处理核心数量为Eight cores,选择本设计所使用相机的最高处理帧率为 107fps,如下:
点击"Program Item",网页将显示经 DSP 端进行 Sobel(边缘检测)算法处理后的图像,如下:
同时,DSP 端串口调试终端将会打印处理信息,如下:
8、工程代码获取
工程代码如下: