FPGA实现AD9361采集转SRIO与DSP交互,FPGA+DSP多核异构信号处理架构,提供2套工程源码和技术支持

发布于:2025-08-01 ⋅ 阅读:(21) ⋅ 点赞:(0)


FPGA实现AD9361采集转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实现AD9361采集转SRIO与DSP交互,搭建FPGA+DSP多核异构信号处理架构,以下从FPGA工程和DSP工程两个方向描述整个设计:

FPGA工程

FPGA工程实现AD信号采集,因为FPGA是并行执行,实时性较好;
FPGA工程主要实现AD9361数据采集、SRIO数据组包、SRIO数据发送功能;输入为示波器生成的正弦波信号,然后进入AD9361芯片实现模数转换;数字信号再进入Xilinx官方的selectlo interface Wizard IP核实现差分转单端,并输出并行的AD数据;然后AD数据进入纯verilog代码实现的SRIO数据组包模块实现将AD数据封装为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发来的AD数据流,并对AD数据进行FFT处理和频谱分析,分析数据通过串口打印;至此,DSP的使命已经完成;

针对市场主流需求,本博客提供2套工程源码,具体如下:
在这里插入图片描述
现对上述2套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx公司的XC7K325T-2FFG676I;FPGA工程主要实现AD9361数据采集、SRIO数据组包、SRIO数据发送功能;输入为示波器生成的正弦波信号,频率设置为 3.0MHz,峰值设置为 2.0Vpp,输出负载设置为 50Ω;然后信号进入AD9361芯片实现模数转换;数字信号再进入Xilinx官方的selectlo interface Wizard IP核实现差分转单端,并输出并行的AD数据;然后AD数据进入纯verilog代码实现的SRIO数据组包模块实现将AD数据封装为SRIO HELLO格式包(SWRITE操作),并在指定数据量后插入门铃通知(DOORBELL操作),最后通过AXI4-Stream接口输出给SRIO IP核;然后调用Xilinx官方的SRIO IP核实现SRIO协议的物理层、传输层、逻辑层,作为SRIO的主设备(initiator),SRIO IP核留出了用户逻辑接口,用户只需要写自己的逻辑电路与之对接即可完成SRIO通信;最后视频数据通过FPGA的GTX高速收发器发送至板载的DSP芯片做后续的数字信号处理;至此,FPGA的使命已经完成;

工程源码2

DSP工程实现数字信号处理,因为DSP转为信号处理而设计,便于算法实现;DSP作为SRIO从设备(Target),通过SRIO高速接口接收FPGA发来的AD数据流,并对AD数据进行FFT处理和频谱分析,分析数据通过串口打印;至此,DSP的使命已经完成;

本文详细描述了FPGA实现AD9361采集转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开发板搭建;以下是专栏地址:
点击直接前往

3、工程详细设计方案

工程设计原理框图

工程设计原理框图如下:
在这里插入图片描述

FPGA端-工程源码架构

FPGA端工程源码架构如下:
在这里插入图片描述

FPGA端-输入信号

输入为示波器生成的正弦波信号,频率设置为 3.0MHz,峰值设置为 2.0Vpp,输出负载设置为 50Ω,如下:
在这里插入图片描述

FPGA端-AD9361数据解码

数字信号再进入Xilinx官方的Selectlo Interface Wizard IP核实现差分转单端,并输出并行的AD数据;Selectlo Interface Wizard配置如下:
在这里插入图片描述
另外,AD9361需要参考时钟驱动,工程中使用250M单端全局时钟转差分时钟输出,如下:
在这里插入图片描述

FPGA端-SRIO数据组包模块

FPGA端SRIO数据组包模块顶层接口如下:
在这里插入图片描述
然后AD数据进入纯verilog代码实现的SRIO数据组包模块实现将AD数据封装为SRIO HELLO格式包(SWRITE操作),并在指定数据量后插入门铃通知(DOORBELL操作),最后通过AXI4-Stream接口输出给SRIO IP核;

SRIO数据组包模块核心功能
该模块实现AD数据流到SRIO协议包的实时转换与传输,主要完成:
1、数据预处理
将24位输入数据拆分为两个12位数据(I/Q通道)
符号扩展为16位(高位补符号位)
每两个采样周期组合成64位数据写入FIFO
2、SRIO数据包封装
使用SWRITE事务类型(0x6)
包头包含:目标地址、包大小、本地ID和目标ID
每个数据包256字节(32个64位数据)
3、门铃机制
每发送16KB数据(DOORB_TRIGER_THRESHOLD)发送门铃信息
支持两级门铃通知(SRIO_DOORB_INFO1和SRIO_DOORB_INFO2)
使用DOORBELL事务类型(0xA)
4、异步FIFO缓冲
跨时钟域处理(AD采样时钟 vs SRIO逻辑时钟)
使用Xilinx 36Kb BRAM实现双时钟FIFO
5、流控机制
等待SRIO链路初始化完成(srio_link_initialized)
响应AXI4-Stream的tready信号
FIFO可编程满阈值控制(256字节)

SRIO数据组包模块工作流程
SRIO数据组包模块系统流程图如下:
在这里插入图片描述
SRIO数据组包模块系统状态图如下:
在这里插入图片描述
SRIO视频组包模块工作流程详解
1、数据采集阶段
每个AD采样时钟接收24位数据
拆分并符号扩展为两个16位数据
每两个周期组合为64位写入FIFO
本设计调用Xilinx官方的FIFO_DUALCLOCK_MACRO原语实现FIFO缓冲,配置 FIFO 大小为 36Kbit,读写数据的位宽为 64bit(FIFO 深度为 512);如下:
在这里插入图片描述
2、数据发送阶段
检测FIFO可编程满信号
发送SWRITE包头(包含目标地址和包大小)
连续发送32个64位数据(256字节)
包结束时置位tlast
3、门铃通知阶段
每发送16KB数据后发送DOORBELL包
门铃信息包含预设的16位状态码
发送完成后返回数据传输状态

总结
该模块实现了高速ADC数据到SRIO协议的高效转换,通过门铃机制实现DSP的精确事件通知,适用于高速数据采集和实时处理系统

FPGA端-SRIO主设备(initiator)

FPGA工程调用Xilinx官方的SRIO IP核实现SRIO协议的物理层、传输层、逻辑层,作为SRIO的主设备(initiator),SRIO IP核留出了用户逻辑接口,用户只需要写自己的逻辑电路与之对接即可完成SRIO通信;本设计使用Xilinx官方的Serial Rapidlo Gen2 IP核,基础配置如下:
在这里插入图片描述
SRIO配置为5Gbps×4 Lane,对应的GT差分时钟需为125M;工程代码中通过配置cdcm61002时钟芯片输出125M连接至GTX高速收发器BANK;SRIO设计请参考Xilinx官方数据手册《pg007_srio_gen2》;I/O 端口配置使用 HELLO 格式包,其他参数保持默认值即可;

DSP端工程

DSP工程实现数字信号处理,因为DSP转为信号处理而设计,便于算法实现;DSP作为SRIO从设备(Target),通过SRIO高速接口接收FPGA发来的AD数据流,并对AD数据进行FFT处理和频谱分析,分析数据通过串口打印;至此,DSP的使命已经完成;

代码功能解析
该代码是用于DSP(TMS320C66x)接收FPGA通过SRIO发送的AD9361采样数据,并进行FFT处理的嵌入式程序。主要功能包括:
1、SRIO初始化与配置
使能SRIO电源域和时钟
配置SRIO SERDES收发器参数(2.5GHz时钟)
设置设备ID和端口参数
配置门铃中断路由和数据处理模式
2、中断处理
门铃中断服务程序srio_db_isr
根据门铃信息确定数据地址
通过邮箱唤醒FFT处理任务
3、FFT处理
生成FFT旋转因子
8个DSP核心并行处理数据
调用DSPLIB库函数DSPF_sp_fftSPxSP执行FFT
主核周期性触发幅度计算
4、频谱分析
计算FFT幅度谱
寻找频谱峰值点
计算输入信号频率
通过UART输出频率分析结果

关键参数
在这里插入图片描述
DSP端工程流程图
在这里插入图片描述
DSP端工程状态图
在这里插入图片描述
核心处理流程
1、SRIO初始化

enable_srio();      // 使能SRIO电源和时钟
srio_device_init(); // 配置SRIO参数

2、中断处理

void srio_db_isr(UArg arg) {
  // 获取门铃状态
  CSL_SRIO_GetDoorbellPendingInterrupt(hSrio, 0, &db_status);
  
  // 确定数据地址
  if(db_status && (1 << SRIO_DOORB_INFO0)) 
      srio_data_addr = SRIO_DATA_ADDR;
  else 
      srio_data_addr = SRIO_DATA_ADDR + SRIO_TRANS_SIZE;
  
  // 唤醒FFT任务
  Mailbox_post(mbox_fft, &srio_data_addr, 0);
}

3、FFT处理

void srio_fft(UArg arg0, UArg arg1) {
  // 生成旋转因子
  tw_fft_gen(twiddle, ADC_SAMPLING_FFT_NUM);
  
  while(1) {
      // 等待数据就绪
      Mailbox_pend(mbox_fft, &srio_data_addr, BIOS_WAIT_FOREVER);
      
      // 8核并行处理
      srio_data_addr_core = srio_data_addr + (srio_data_size * core_id);
      
      // 执行FFT
      DSPF_sp_fftSPxSP(ADC_SAMPLING_FFT_NUM, fft_input, 
                       twiddle, fft_output, brev, radix, 0, 
                       ADC_SAMPLING_FFT_NUM);
  }
}

4、频谱分析

void fft_amplitude(UArg arg0, UArg arg1) {
  // 计算幅度谱
  amplitude[i] = sqrtsp(powsp(fft_output_copy[2*i],2) + 
                       powsp(fft_output_copy[2*i+1],2));
  
  // 寻找峰值
  if(amplitude[i] >= max_amplitude) {
      max_amplitude = amplitude[i];
      peak_point = i;
  }
  
  // 计算频率
  freq = (ADC_SAMPLING_FREQ / ADC_SAMPLING_FFT_NUM) * peak_point;
  
  // 输出结果
  uart_printf("peak point: %3d | frequency: %10f Hz\n", 
              peak_point, freq);
}

多核处理机制
1、数据分配

srio_data_size = SRIO_TRANS_SIZE / 8; // 每个核心16KB/8=2KB
srio_data_addr_core = srio_data_addr + (srio_data_size * core_id);

2、缓存管理

Cache_inv((void *)srio_data_addr_core, srio_data_size, 
          Cache_Type_L1D, CACHE_WAIT);

3、任务调度
高优先级任务(15):FFT计算
低优先级任务(1):幅度计算

工程代码实时性分析
数据块处理周期:16KB @ 250MSPS = 65.536μs
FFT触发周期:每1.6秒执行一次幅度计算(10万次中断)
UART输出频率:约0.625Hz(1.6秒/次)

总结
该实现充分利用了C66x DSP的8核并行处理能力,通过SRIO高速接口实现实时数据处理,适用于雷达、通信等需要高速频谱分析的场景

4、工程源码1详解:FPGA逻辑工程

开发板FPGA型号:Xilinx–XC7K325T-2FFG676I;
FPGA开发环境:Vivado2019.1;
信号输入:正弦波信号,频率3.0MHz,峰值2.0Vpp,输出负载50Ω;
信号输出:SRIO高速接口,5Gbps×4 Lane;
ADC接收设备:AD9361芯片;
AD9361解码方式:Xilinx官方Selectlo Interface Wizard IP核;
实现功能:AD9361转SRIO,FPGA为SRIO主设备(Initiator);
工程作用:此工程目的是让读者掌握FPGA实现AD9361采集转SRIO与DSP交互的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解:DSP RTOS系统工程

开发板DSP型号:TI–TMS320C6678;
FPGA开发环境:CCS5.5;
信号输入:SSRIO高速接口AD数据,5Gbps×4 Lane;
信号处理:FFT处理、频谱分析;
实现功能:DSP为SRIO从设备(Target);
DSP工程操作系统:RTOS操作系统;
工程作用:此工程目的是让读者掌握FPGA实现AD9361采集转SRIO与DSP交互的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
DSP-RTOS工程源码架构如下:
在这里插入图片描述

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、上板调试验证

准备工作

需要准备的器材如下:
示波器;
AD9361转接板;
FPGA+DSP异构开发板;
测试用PC电脑;
串口线;

程序下载bit

步骤如下:(顺序一定要对)
1、先下载FPGA程序
2、再下载从核心DSP程序;

FPGA端AD采集演示

下载bit和ila文件后,打开ILA可看到AD波形如下:
在这里插入图片描述

DSP RTOS系统工程测试

将 DSP 端程序可执行文件分别加载至 C66xx_1~C66xx_7 核心后并运行。再将程序可执行文件加载至 C66xx_0 核心,C66xx_0 核心停在 main 函数中,如下:
在这里插入图片描述
运行 C66xx_0 核心程序,DSP 端的串口调试终端将会打印存在信号的点的编号,以及对应的采样频率
在这里插入图片描述
根据采样频率计算公式,某点 n 所表示的采样频率为:Fn = n * (Fs / N)(n >= 0),参数解析如下:
Fn:采样频率;
n :存在信号的点
Fs :信号采样率
N :FFT 变换点数

由上式可得:
实际的采样频率 Fn = 6 * (250MHz / 512) = 2.9296875MHz,与信号发生器的3.0MHz 标称值接近;

AD信号时域分析

通过 CCS Graph 工具可查看 C66xx_0~C66xx_7 核心的信号时域波形,亦可在 C66x_0核心查看信号频域(振幅)波形。
打开 srio_fft.c 程序源文件,在 488 行"uart_printf"函数处创建 C66xx_0 核心断点,使程序暂停以便于查看 C66xx_0 核心信号波形。右击"uart_printf"函数,选择"Breakpoint(Code Composer Studio) -> Breakpoint"创建断点,如下:
在这里插入图片描述
点击 CCS 的"Tools -> Graph -> Single Time",在弹出的界面中按照下图内容进行配置。其中 Start Address 选项填写 ch_A(对应 ADC_CHA 通道)。点击 OK,即可查看 C66xx_0 核心的原始信号时域波形,如下:
在这里插入图片描述

AD信号频域分析

点击 CCS 的"Tools -> Graph -> Single Time",在弹出的界面中按照下图内容进行配置。其中 Start Address 选项填写 amplitude,点击 OK,即可查看经 C66xx_0 核心 FFT 处理后的信号频域(振幅)波形,如下:
在这里插入图片描述

8、工程代码获取

工程代码如下:
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到