Avalon Memory-Mapped Interfaces的寻址
关于Avalon Memory-Mapped Interfaces的地址对齐,在《Avalon Interface Specifications.pdf》 中的3.6 Avalon Memory-Mapped Interfaces有一些简单的描述:
1. 主机比从机数据位宽大的情况下,主机会多次映射从机地址空间。例如,对于一个32位的主机需要读一个16位的从机端口,主机会连续两次读取从机连续地址空间的数据,从而获得32位的数据。
2. 主机比从机数据位宽小的情况下,主机使用从机低字节端的数据。主机写传输时,系统互连逻辑置位byteenable信号,使得数据写入相应地址空间。
在实际的应用中,外挂一个Avalon Memory-Mapped Slave Interfaces时,如果这个slave与master(主要指NIOS2处理器)的位宽不匹配,这个地址线的连接又是怎么回事呢?
例如下图中的Ethernet从机数据位宽为16,而主机位宽为32,在从机一端连接的地址线是A[10:0]即11位,而在主机一端连接的数据位宽为addr[11:1]也是11位,既然都是11位,为什么不都写成常见的[10:0]?实际的数据量到底是2048*32bit还是2048*16bit呢?另外,如果使用正常的IOWR_16DIRECT(BASE, OFFSET, DATA)函数来寻址这个Ethernet从机,其中的OFFSET到底是表示8位数据的地址偏移还是32位数据的地址偏移,或者说是16位数据的地址偏移呢?
其实,特权同学是带着这些疑问来研究这个Avalon Memory-Mapped Interfaces的。如果翻阅一些官方的handbook,再有一些思考(将上述问题全都放到一块观察和比对)和尝试(板级调试,哈哈,必须有能跑NIOS2的板子哦),上面这些问题并不难解决。
首先需要明确一个概念,就是NIOS2处理器的地址分配都是以字节(即8bit)为单位计算的。它的总的寻址空间是2的32次方个字节,表示为ADDR[31:0];换算成16位宽数据则寻址空间是2的31次方,习惯上表示为ADDR[31:1];换算成32位宽数据则寻址空间是2的30次方,习惯上表示为ADDR[31:2]。因此,上面提到的addr[11:1]也不是平白无故的出现的,它代表了2的10次方的16位数据寻址空间。下一个问题的答案也浮出水面:这里的数据量是2048*16bit。需要强调的一点是,在Avalon Memory-Mapped Slave于Master连接的时候,其地址是以主从机连接的数据位宽(比如这个例子的数据位宽是16)为单位寻址的。
再来看下一个问题,也是特权同学曾经比较困惑的问题。IOWR_16DIRECT(BASE, OFFSET, DATA)函数表示写16位数据到基址为BASE、地址偏移量为OFFSET的地址空间。NIOS2处理器的基址是以8bit为单位寻址的,这一点毋庸置疑。那么由于前面地址问题的困扰,特权同学比较纳闷的是OFFSET也是以8bit为单位吗?还是以这里的写入数据位宽16bit为单位?实践证明,“NIOS2处理器的地址是以8bit为单位寻址”这句话还是适用的,这里的OFFSET也是以8bit为单位寻址。因此,就出现了动态寻址和静态寻址的概念,本文开始引用handbook的一些描述说的就是动态地址对齐的基本思路。因此,设计者必须注意的是在寻址非8bit数据位宽的时候,地址偏移量的计算必须纳入寻址的考虑之中。例如本例是16bit数据写入,如果要最小地址遍历写数据,写入第一个数据是IOWR_16DIRECT(BASE, 0, DATA),那么第二个数据就应该是IOWR_16DIRECT(BASE, 2, DATA)。24bit、32bit的都是类似的。
文章评论(0条评论)
登录后参与讨论