1、在IP核内部,地址线指的是以字为单位的。
如一个ram,数据线宽度为32bit,地址线宽度为14bit,该ram的容量为2^14=16384个字,每个字4字节,即64KB。在qsys互联空间内,该ram的地址空间是0~FFFF,因此qsys是以字节为单位互联的。
2、制作一个avalon-mm master标准的IP核向该ram写数据。avalon有如下要求:
数据线宽度:必须和ram相同,为32bit;
地址线宽度:至少为16bit,因为挂到互联空间中,是以字节为单位的。你看到的ram核的地址线为14bit(写ram的模块内部的地址也为14bit),是原始IP,还需要经过互联文件的转换,总之挂到互联总线的 地址一定是16bit;
下面这张图是qsys内的write_ctrl核向ram写数据的一个过程,从ram内部抓到的地址来看,互联总线已经将write_ctrl的地址(字节地址)转换为了字地址,即0~3对应0,4~7对应1。
我的意图是向ram写入0~1023这1024个数字,但实际只向ram的地址0写入了3,地址1写入了7,地址2写入了B等等。其他数据被覆盖了。
解决办法:在自制的IP核里,做地址转换,将字地址转为字节地址,即左移2位输出。PrSv_WrAddr_s为14bit,和要写入的ram的ip核内部地址相同。
amm_address_o <= PrSv_WrAddr_s(13 downto 0) & "00"; -- 转换为字节地址
3、还可以将onchip-ram的数据端口导出到qsys外部,在顶层对其写入,此时写入数据的模块的特点如下:
地址线宽度为14bit,数据线宽度32bit,写入时可以按字操作,因为此时没有经过avalon总线的互联。