RapidIO的一个难点在于地址转换方法,即将远端的Memory映射到当前Avalon-MM总线,所以地址需要一个转换过程——Local Avalon-MM<->RapidIO Addr<->Remote Avalon-MM。下面具体描述从本地访问远端内存这个方向,公式如下:
- (address & mask) == (base & mask)
- rio_addr [33:3] = {xamo, (offset [31:3] & mask [31:3]) | (avalon_address [31:3])}
其中不容易理解address和avalon_address两个数值,它们表述是同一个数值,但是并不是表示Local Avalon-MM总线的物理地址,而是表示基于IO Avalon-MM Slave模块的偏移地址,也就是说address的范围是从0x0开始,直至该Slave访问范围结束。
上述表达式中base虽然是基地址的含义,但是该基地址也仅限于address的地址范围进行地址划分,同理mask也需要这样理解。
可能说的不是很清楚,现在简单举个实例。假设我们在SOPC中实例一个RapidIO Core,远端也有RapidIO Core连接至1M内存,其中io_write_slave基地址0x50000000,可访问范围是1M地址空间(0x50000000~0x500fffff),我们需要把远端的1M内存映射到本地,配置如下:Base=0x0,Mask=0xfff00000,offset看你访问地址决定,如需访问0x100,则offset=0x100,远端Base,Mask寄存器同本地Base,Mask,但是远端的offset是远端Avalon-MM总线1M内存的基地址。
下面主要描述RapidIO Core的调试手段:
首先,我们要判断RapidIO是否正常启动,RapidIO Core上电类似于网口的上电顺序,首先发送一连串控制字给远端的RapidIO,然后等待响应。这一步主要用于两端RapidIO的时序同步。有两种手段判断RapidIO是否启动,一是查看port_initialized(RapidIO Core自带)接口是否输出'1';还有就是查看物理层寄存器Port 0 Error and Status CSR(offset:0x158)的第1位PORT_OK。
当你在本地发送一个写请求包到远端RapidIO时,而远端RapidIO又没有任何响应时,该如何查询呢?使能所有本地中断请求信号,即Input/Output Slave Interrupt Enable(offset:0x10504)寄存器值为0x1f,所以当有数据写入IO Avalon-MM Slave Module时,正常情况下,位于Input/Output Slave Interrupt(offset:0x10500)寄存器的NWRITE_RS_COMPLETED位会置位有效,说明写请求包发送成功,远端RapidIO发送回响应包,否则根据该寄存器低4位判断写入过程发生错误的原因。
上述讲述或许不是很清楚,如果有RapidIO需求的朋友并且发生问题,可在博客发送消息,大家一起讨论。
Altera网站上有一个专门讲述RapidIO Megacore的Flash,请大家
下载观看。
文章评论(0条评论)
登录后参与讨论