基于SRIO的FPGA与DSP间高速数据传输

引言

  前段时间实现了DSP与FPGA之间的门铃通信,但SRIO不只是可以用来传门铃事务产生中断,它最大的优势在于能够实现嵌入式平台上的高速数据传输。我计划采用SWRITE事务包,从FPGA向DSP发送640×512×8bit图像数据,测试DSP端完成数据接收所需的时间。

参考资料:
SPRU976E - TMS320C645x DSP Serial RapidIO (SRIO) User’s Guide
SPRU732J - TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide

FPGA发送数据至DSP

  DSP端中断的产生在SPRU976E中有详细的说明,4.2节中指出,DSP在接收从外部送来的数据时,不管是Message还是Direct I/O的事务,外部的设备都需要通过门铃中断来告知DSP已经有数据传输完成。但是门铃事务和传数据的事务是独立的。如果发送端在发完数据后紧接着发门铃中断,有可能数据还未传输完成,DSP就已经开始响应门铃中断了。
  为了避免这种情况的发生,发送端需要最后发送一个与前面发送的事务同样优先级的带响应的写(NWRITE_R),在接收到正确的响应后就能确保数据确实已经传输完成。再接着由发送端发起门铃中断,告知DSP传输完成。

测试过程示意图

测试框图

  测试过程的示意图如上图所示,FPGA等待接收从DSP发过来的门铃信号,DB0和DB1分别指的是门铃的Info字段为“0”或者“1”的门铃事务,用于区分不同的工作模式。
  DB0对应参照组,DSP端记录从发送门铃到接收门铃所用的时间 t 1 t_1 t1
  DB1是测试组,FPGA在收到DB1后,先后依次发送1280包SWRITE事务,再发送NWAITE_R事务,收到响应后发送DB1。DSP记录总时间 t 2 t_2 t2
  实际发送数据所用时间为:
t = t 2 − t 1 t = t_2-t_1 t=t2t1

DSP程序计时

  DSP程序计时用的最多的感觉就是TSC(Time Stamp Counter Registers)寄存器。SPRU732J 的2.9.14对TSCL和TSCH两个寄存器有详细的介绍。这两个寄存器在初始化的时候默认是不启动的,可以往TSCL中写任意值来启动计时器,这个值不会被写入,因为这两个寄存器都是只读的,但是起到了启动计时器的功能。一旦计时器启动,就只能通过复位或者掉电来停止。
  读当前的计时值也有讲究。先读TSCL,这时计时器实际的高32位的值也会写入TSCH,接着读TSCH,读到的就是准确的计时。两次读之间不要有中断,万一在中断中也有人去读TSC的值,那么之前的值就丢了。
  一个寄存器32位,当前系统时钟1GHz,从0开始计数,只需要4.29s就能计满。而且有时候TSC的起点不是0,所以用的时间会更少,在计时的时候不能省略TSCH不读。
2 32 / 1 0 9 = 4.29 s 2^{32}/10^9 = 4.29s 232/109=4.29s

大小端问题

  DSP端的SRIO用的是大端模式,而FPGA上实例化的Xilinx IP SRIO Gen2是小端模式。我感觉挺混乱的,实际测试发现,如果数据以字节为单位,那么每个字节中的bit顺序是对的;而每个字节的顺序是反的。
  我利用状态机,控制ireq通道发送的数据,发送NWRITE_R事务包时,指定地址为0xE0050000,发送数据为64’hFEDCBA9876543210。

……
else if (cstate == WRHD) IP_ireq_tdata = {srcTID, NWRITE_R, 1'b0, prio, CRF, 8'd7, 2'b0, 34'hE0050000};
else if (cstate == WRDAT) IP_ireq_tdata = 64'hFEDCBA9876543210;
……

  结果如下图所示,最高地址的字节0xFE,到了最低的地址0xE0050000处,而0xFE本身还是0xFE,没有变成0x7F。
在这里插入图片描述
  根据这一特点,在以后用SRIO的时候,需要在FPGA发送端对数据重新组织或者更改DSP的大小端模式。

测试结果

测试结果
  测试结果如上图所示,我们只用了port 2 上的一对链路,物理层的链路速率是3.125Gbps,DSP的主频是1GHz,因此这里的时间单位是ns。
  对照组所用时间为2.179us,也就是发送并接收门铃的时间。测试组的结果已经减去了对照组中的额外时间开销,传输数据所用时间为1.191960ms。
640 × 512 × 8 b i t 1191960 n s = 2.20 G b p s \frac{640\times512\times8\rm{bit}}{1191960\rm{ns}}=2.20\rm{Gbps} 1191960ns640×512×8bit=2.20Gbps
η = 2.20 3.125 × 100 % = 70.4 % \eta = \frac{2.20}{3.125}\times100\%=70.4\% η=3.1252.20×100%=70.4%
  有效数据带宽2.2Gbps,数据传输效率70.4%。

FPGA从DSP读数据

  为了测试FPGA从DSP读数据的时间开销,同样设置有一组对照组和一组测试组。与前面的测试不同的是,这里FPGA完成的是读取数据的任务,在数据读取完成后向DSP发送中断。
在这里插入图片描述
  读数据并不是马上就能得到响应。FPGA每次在ireq端口发起NREAD事务之后,需要过一段时间才能在iresp端口读到数据。上图是相应的ILA波形,每次开始接收数据是,FPGA同时发起下一个NREAD事务。可以看到这里有大部分时间iresp通道都是空闲的状态,因此传输效率并没有发送图像数据时那么高。但这样做的优点是,整个过程不需要DSP干预,减轻了CPU的负担。
在这里插入图片描述
  这里因为换了一块FPGA,所以也换了一个SRIO的端口,换到了端口0,不知道为什么它的通道工作模式指示的是4x的模式,实际上还是1x的链路。可以从上图看书,整个过程花的时间大概是3.568179ms。
640 × 512 × 8 b i t 3568179 n s = 734.7 M b p s \frac{640\times512\times8\rm{bit}}{3568179\rm{ns}}=734.7\rm{Mbps} 3568179ns640×512×8bit=734.7Mbps
η = 0.7347 3.125 × 100 % = 23.5 % \eta = \frac{0.7347}{3.125}\times100\%=23.5\% η=3.1250.7347×100%=23.5%
  有效数据带宽734.7Mbps,数据传输效率23.5%。接收数据的过程效率还可以进一步提高,但那样也会占用更多DSP的SRIO中的发送缓冲区的空间,更容易发生拥塞。

  • 4
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: FPGA使用SRIO传输到DSP的流程如下: 1. FPGA通过SRIO接口将数据发送到DSP。 2. DSP接收到数据后进行处理。 3. 处理完成后,DSP通过SRIO接口将处理结果发送回FPGA。 4. FPGA接收到处理结果后进行后续操作。 需要注意的是,SRIO是一种高速串行接口,其传输速率非常快,可以达到数十Gbps的速度。因此,在使用SRIO进行数据传输时,需要考虑数据的带宽和延迟等问题,以确保数据传输的稳定和可靠。 ### 回答2: FPGA(现场可编程门阵列)和DSP(数字信号处理器)是现代电子系统中经常使用的两个独立的芯片,它们在功能上互补。FPGA可用于灵活实现各种数字电路,而DSP则可用于高效地执行信号处理任务。将这两个芯片结合,可以在许多应用中实现更高效和更灵活的系统。 SRIO(串行寄存器输入/输出)是一种高速串行通信协议,一般用于连接FPGADSP。它支持高速数据传输和低延迟通信,并为DSP芯片和FPGA的设备提供同步时钟。在FPGADSP使用SRIO的主要优点是高速通信、低延迟和对调试和诊断的支持。 下面将简述FPGA使用SRIO传输到DSP的流程: 1. FPGA将数据通过输入端口打包到SRIO协议,并使用SRIO物理层将数据通过高速串行通信发送到DSP。 2. DSP接收SRIO数据流,并将它们解包到DSP内部。 3. DSP执行信号处理任务,然后将处理结果打包为SRIO数据,并发送回FPGA。 4. FPGA接收DSP返回的SRIO数据流,并将其解包到FPGA内部。 5. FPGA使用处理结果继续执行下一个计算或操作。 在流程中,需要注意的是SRIO通信通常由硬件来处理。FPGADSP需要具备相应的硬件资源和适当的SRIO控制器和收发器,以实现SRIO通信功能。在设计SRIO传输通信时,需要考虑很多因素,例如数据速率,时钟同步,错误校验和设备发现等。 总的来说,FPGA使用SRIO传输到DSP是一种高速、低延迟的通信方式,能够提高数字信号处理系统的效率和灵活性。它可以应用于许多领域,例如高速通信嵌入式系统和可编程逻辑控制器等。 ### 回答3: FPGADSP是常用于高性能计算的处理器,而SRIO(Serdes-based RapidIO)则是一种高速、高可靠性和低延迟的串行总线协议,在数字信号处理和通信领域广泛应用。将FPGA使用SRIO传输到DSP可以使得数据和控制信号在这两个处理器之高速传输,提高了数据处理的效率和准确性。 SRIO协议通常采用点对点连接,因此实际上FPGA使用SRIO传输到DSP的流程可以归纳为以下几个步骤: 1.连接设置:FPGADSP需要根据SRIO协议建立正确的物理连接和通信参数,如数据速率、帧格式、地址映射等。这通常需要在系统设计和调试阶段进行。 2.数据帧传输:FPGA产生的数据可以通过SRIO发送到DSP进行处理。在SRIO协议中,数据按照固定的格式组成数据帧,帧中包含各种控制信息和校验码。FPGA通过SRIO传送数据帧到DSPDSP可以根据帧头信息来识别帧的类型和目的地地址,然后进行数据处理。 3.数据处理:从SRIO接收到的数据可以被DSP根据具体应用进行处理。DSP可以利用SRIO高速性能和低延迟特性来实时处理数据,完成各种算法和功能。如果需要返回处理结果,DSP则可以通过SRIO反向发送数据帧到FPGA。 4.错误处理:在SRIO协议传输过程中,数据可能会出现错误,如丢失、重复、校验错等。因此,FPGADSP都需要设置适当的错误检测和纠错机制,以保证传输的数据正确无误。 总之,FPGA使用SRIO传输到DSP的流程是一个相对复杂的过程,需要合理设置连接参数、数据帧格式和检错机制等,以确保高效、可靠和准确的数据传输和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小裘HUST

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值