SRIO调试(C6678->SRIO和Virtex6->FPGA)
C6678->SRIO和Virtex6->FPGA
设计的板子到了SRIO调试阶段了,在板子上,一片V6和两片6678通过4XSRIO互联,中间没有Switch,总算搞定了相互之间的通信。
首先,感谢Ti论坛提供的SRIO程序范例,但是其硬件平台是EVM板,更多的只能用于loopback测试,但是可以在其基础上修改。
1.初始化DSP的SRIO,主要是对SerDes进行配置,然后是Lane和Speed的配置,最后需要等待FPGA的LinK建立,我们在建立时候碰到一点困难,每次建立并不都是4X,一直没有找到问题,我们使用了一个别的办法来保证link为4X。
2.数据发送,DSP上提供的数据发送方法主要有两种,DirectIO和Message,主要区别为DirectIO需要TX和RX双方知道地址映射关系,而Message是通过Message中mail信息得到数据需要保存的地址,我们使用的为DirectIO方法,6678上提供了8组LSU来进行DirectIO数据发送,每个LSU有6个寄存器,当5th寄存器写完后,数据会发送出去,第6个寄存器主要用于检测当前的LSU状态。LSU还有16(32)个影子寄存器
3.SWRITE/NWRITE/NREAD:对DSP来说,初始化完SRIO后,FPGA便可以通过SRIO来发送数据,但是要注意,Designer并不知道什么时候FPGA会发送数据,所以通常会先发送一个DoorBell信息来告知DSP,FPGA要发送数据了,DoorBell可以触发中断,对于NREAD来说,FPGA发送这个命令后,DSP会自动的将请求的数据发送出去,Designer也并不知道数据发送出去,这些都需要DoorBell来支持。
1 问题:
你好,我们现在也能DSP发数据到fpga,但是存在如下问题:
dsp用Nwrite给fpga写数据,fpga能收到数据但是没有响应数据给dsp?(请问需不要两边都确认下 读写的地址??)
dsp用Nread给fpga发,尝试着读取fpga里的数据,但是fpga这边没反应?
fpga主动发起给dsp读写数据,dsp那边该怎么写程序啊?
答:
采用DirectIO模式,FPGA不会主动响应的
DSP发送Nread命令,FPGA应该使用用户接口将Nread命令中请求的地址空间中的数据发送出去
可以采用先发送Doorbell,再发送数据
2 问:
现在我们已经能dsp主动发起对fpga进行读写,但可是fpga无法主动发起对dsp进行读写? 不知道fpga这边需要怎样配置ip核才能实现 dsp,fpga都能主动发起读写数据请求??
答:
如果没记错的话,FPGA发送NREAD命令就可以了,DSP会自动将数据发送过去,注意NREAD命令中的地址是DSP的实际访问地址
3 问:
你好,请问用DirectIO传输数据是用DMA传输的吗?
这个需要寄存器配置还是直接默认的就是?
还有,FPGA这端有没有DMA这个说法?需不需要进行配置啊?
答:
应该不需要 FPGA没有DMA这个东西 一般FPGA的DMA都是和上位机配合完成的本身没有DMA的吧
注:在编辑模式下可以看到详细问答
PS:我用一代核V5.6和二代核都试过,都是这样的情况;
1.DSP和FPGA,四对LVDS收发线相连。
2.我们准备FPGA发数据给DSP,DSP再发送给FPGA;后期会DSP处理完后再发回给FPGA。
请问,FPGA如何通知DSP接收数据?FPGA何时开始发送数据?DSP怎么知道何时接收完毕;完毕后,又怎么通知FPGA接收数据?FPGA何时开始接收数据?
我只了解一些大概,真正实现,还有很多疑惑。
期待您的回复,能否留下您的QQ号?即时向您请教几个问题?非常感谢!
转载自:http://www.cnblogs.com/fpga/archive/2012/07/13/2590929.html
C6678 SRIO DSP接收Doorbell中断问题
-
在公司自己开发的板卡上调试SRIO
使用的DSP是TMS320C6678,FPGA是K7系列芯片,芯片间通过SRIO连接
C6678使用的开发环境是CCS5.3,编译器版本为C6000_7.4.1,MCSDK版本为2.1.2.6。
在调试过程中,C6678与FPGA互相用nwrite方式写数据均成功。调试Doorbell中断时,C6678向FPGA发送Doorbell没有问题,
但是FPGA向C6678发送Doorbell中断时,C6678最多只能接收999次Doorbell中断,之后就再也不能响应,此时FPGA在ChipScope中还能观察到Doorbell已发送出去。
附上调试用的C6678 SRIO程序,请各位工程师帮我看看程序中哪里配置有问题,导致有这个现象产生
谢谢!
-
-
-
-
谢谢 Thomas Yang1,问题有了进展,增加了FPGA发送门铃的间隔,DSP就不丢门铃中断了。DSP测试程序然虽然开了几个中断,但只有一个门铃中断会被触发。
我使用的是FPGA的SRIO IP核,IP核中测试例程会向外发起多个SRIO通信(写、读、门铃、stream等),每种SRIO通信的间隔都很小,我就是把这些SRIO通信都改为门铃,就出现了DSP了丢失门铃中断问题。我现在的困惑是FPGA的SRIO IP核测试例程为什么不增加每种SRIO通信的间隔。
-
DSP门铃中断服务程序只有三行代码,除了下面2行,另外一行就是给一个全局变量置位。
//read doorbell. this test only use doorbell reg 0
doorbell= gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICSR;//clear doorbell interrupt
gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICCR= doorbell;另外,我们的C6657与FPGA通信不太稳定,经常会出现无法建立连接的问题,也就时等不到port OK。关于这些问题我会在另外的帖子中提问,这个问题基本算有个结论了。谢谢大家。
-
-
只能进一次中断,主要是这两个寄存器设置有问题(6678 DSP):
3.8.9.2 Interrupt Rate Counter Register(对于映射到INTDST0-INTDST15):
INTDSTn_RATE_CNTL Interrupt Rate Control Counter 和 INTDST_RATE_DIS Interrupt Pacing Disable (Address Offset 0x0310)这两个寄存器没有设置正确。如果
在INTDST_RATE_DIS Interrupt Pacing Disable = 0x0000的情况下,不重复写INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器的话中断就只能进去一
次。如果你不想重复写INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器,就将INTDST_RATE_DIS Interrupt Pacing Disable = 0xFFFF。
-
我在调试的过程中发现如果DSP(6678)中断服务程序占用时间较长的话,在Doorbell间隔比较小的情况下会造成doorbell丢包(可以从chipscope看到Doorbell应答消息
(Hello Format)的错误标志位有时候为1),如果想分析问题,在调试程序时,尽量减少printf这些语句的使用。我觉得应该是中断服务子程序的时间决定doorbell的
时间间隔。而要及时的触发中断(INTDST0-INTDST15),则可以设置INTDST_RATE_DIS Interrupt Pacing Disable 和 INTDSTn_RATE_CNTL Interrupt Rate Control Counter寄存器。
我主要负责FPGA这一部分,用的是IP核V5.6,核程序里面用到了 ILA VIO 的核,请问我能不用这些核吗? 我想直接自己建立.cdc文件抓自己想抓的数据? 如果是自己建立的.cdc文件,那该怎么去触发核呢(该怎么去给核发Nread,Nwrite之类的请求?)?原来是用VIO 触发的吧。
因为是新手,所以可能问的也不是很清楚,还望多包涵包涵~~~~