尽管看了不少资料,但是一直对 Avalon slave 的动态地址对齐和静态地址对齐的理解不是很透彻。前两天自己做了一个SOPC的自定义组件,通过Deprecated这个选项的不同选取,一下子就理解了Avalon slave的两种地址对齐方式之间的区别。
下面以Altera提供的PWM自定义外设的例子,介绍两种地址对齐方式的区别。该例子有所改动,源代码中的32-bit的接口被改成了8-bit的接口,如果不这样改动的话,接口是32位,就不存在动态和静态对齐之分,动态对齐和静态对齐都是对于数据总线小于32-bit位宽的slave而言。
上图是在制作自定义PWM组件时,在Deprecated选项框中,Slave addressing选择DYNAMIC。
上图是在制作自定义PWM组件时,在Deprecated选项框中,Slave addressing选择NATIVE。
上图中,把两个自定义组件同时添加到系统中。由图中可以看出,pwm_avalon_interface_dynamic_0这一外设的地址空间为0x00000800 — 0x00000803,共4个字节;而pwm_avalon_interface_native_0这一外设的地址空间为0x00000804 — 0x00000813共16个字节。
分析:在pwm_avalon_interface.v文件中,Avalon总线的地址宽度为2-bit,因此一共会有4个数据。在使用动态地址对齐方式的时候,地址的增长方式以8-bit为单位增长。这种方式的优点是可以得到一个连续的存储器空间,但缺点是当32-bit的NIOS II core 对该外设每进行一次操作,则物理上相当于对该外设进行了4次操作,大部分寄存器类型的slave器件都不能容忍。在使用静态地址对齐方式的时候,地址的增长以32-bit位单位增长。这种方式的缺点是相对于同样的外设,他需要更大存储空间,优点是每对该器件进行一次操作,实际的每次读写也的确只有一次,没有额外的副作用。当一个32位的Nios II core读一个8位宽的slave时,其获得的32位数据低8位从slave获取,而高24位则没有定义。同样,当它读16宽的slave时,其获得的32位数据低16位从slave获取,而高16位则没有定义。当Nios II core想继续读下一个8位(或16位)时,则需要增长字节地址4。除非你一定需要一个连续的地址空间,否则使用静态地址对齐方式是比较保险的方式。
结论:在做自定义组件时,同样的代码,地址对齐方式选择的不同,得到的自定义组件占用的存储器空间大小有所区别,通过这一细微的区别,可以很直观的看出Avalon动态地址对齐和静态地址对齐的差异。