如果使用静态地址对齐(每个寄存器在Avalon总线上占4个字节的地址)
设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addressAlignment {NATIVE}
在软件编程时
可以使用IOWR(基地址,寄存器编号(n),数据)对自定义IP的第n个寄存器进行写入操作
可以使用IORD(基地址,寄存器编号(n)) 对自定义IP的第n个寄存器进行读出操作
如果使用动态地址对齐,(每个寄存器在Avalon总线上占 数据位宽/8个字节的地址)(默认)
在软件编程时,使用IOWR_32DIRECT(数据位宽为32位)、IOWR_16DIRECT(数据位宽为16位)、IOWR_8DIRECT(数据位宽为8位)进行写操作
在软件编程时,使用IORD_32DIRECT(数据位宽为32位)、IORD_16DIRECT(数据位宽为16位)、IOWR_RDIRECT(数据位宽为8位)进行写操作
IOWR_8DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*1
IOWR_16DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*2
IOWR_32DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*4
IORD_8DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*1
IORD_16DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*2
IORD_32DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*4
在SOPC Builder 8.0版本以前,地址对齐中有动态对齐(dynamic)和静态对齐(Native)的两个选项,但是现在它不推荐使用静态对齐的方式。
因为静态对齐可能会有副作用(this coding could have negative side-effects)。
但是11.0等等新的版本中仍然有这个选项,只是放在deprecated(不推荐)中,而且默认为dynamic的。
所以,总结是:
如果,自定义外设需要的数据位宽不是32bit,如8bit,那么推荐两种方式搞定
1.writedata,readdata为8bit,自定义外设中,配置为Native方式。
2.writedata,readdata为32bit,只是高24bit无用,自定义外设中,配置为dynamic(优选)或者Native方式。
在写软件时,IOWR均可正常使用。
来源:oschina
链接:https://my.oschina.net/u/4261553/blog/4942849