热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正确理解AvalonMM总线的动态地址寻址DynamicAddressing

目前Nios已经取消了Native寻址模式(即从设备到主设备寄存器直接映射),全部采用了Dynamic寻址模式,查找了目前存在的一些资料,尤其是某些教程,还在使用Native模式,

目前Nios已经取消了Native寻址模式(即从设备到主设备寄存器直接映射),全部采用了Dynamic寻址模式,查找了目前存在的一些资料,尤其是某些教程,还在使用Native模式,对Dynamic动态模式避而不谈,还有好多资料摸棱两可,说的模模糊糊,感觉应该是没吃透这个东西,要么就是调试程序的使用使用固有的2或者4方法,其实为什么这么做,可能也不知道。下面根据查询官方手册,给出我的理解。

以下所说的32bit,16bit表示的都是数据宽度。
所有的寄存器都是8bit的!!
在Master来看,一个地址只对应一个寄存器!!!

1. Avalon MM 的master是32bit宽度

动态地址对齐方式是将MM从设备的地址空间连续地映射到主设备空间。内存类型的从设备控制器应该采用这种方式。在这种方式下,主设备的每一次读传输(或写传输)对应从设备一次或多次读传输(或写传输)。譬如,主设备数据宽度为32bit,从设备为16bit,则主设备每发起一次读传输,从设备将被读两次,用于返回32bit数据(由Avalon Interconnect Fabric逻辑插入状态机实现,用户无需关心具体实现),同理,每一次写操作,从设备执行两次写入操作。Dynamic对齐方式数据宽度限定为8*2^n次方,即只能为8 16 32 64等值
《正确理解Avalon MM总线的动态地址寻址Dynamic Addressing》
《正确理解Avalon MM总线的动态地址寻址Dynamic Addressing》
《正确理解Avalon MM总线的动态地址寻址Dynamic Addressing》

2. Slave端的数据宽度

在软件编程时,使用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

这里引出个问题,这个乘1、2、4是怎么来的?

2.1 8 bit

比如,外设中的数据长度为256,数据宽度为8bit。那么在外设中的数据存放方式为

地址数据 (8bit)
0x00REG[0]
0x01REG[1]
0x02REG[2]
REG[…]
0xFFREG[255]

在Dynmatic动态寻址模式下,master读入到Avalon MM 的时候是这样的

地址数据 (32-bit)
0x00REG[3] REG[2] REG[1] REG[0]
0x04REG[7] REG[6] REG[5] REG[4]
0x08REG[11] REG[10] REG[9] REG[8]
REG[…] REG[…] REG[…] REG[…]
0xFCREG[255] REG[254] REG[253] REG[252]

根据上面的表格,当采用指令IORD_32DIRECT(BASE,OFFSET)的时候,读出的数据是32bit的也就是是4个字节,或者称为4个寄存器。有如下规律:

IORD_32DIRECT(BASE,0) //得到第一组4个寄存器(0-3)数据
IORD_32DIRECT(BASE,4) //得到第二组4个寄存器(4-7)数据

如果要单独读取某一个寄存器,那么就是用提供的API

IORD_8DIRECT(BASE,0) //得到第1个寄存器(0)数据
IORD_8DIRECT(BASE,1) //得到第2个寄存器(1)数据

这才解释了上面引用的代码IORD_8DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*1这里的1是如何来的。

2.2 16bit

理解了8bit的之后,16bit数据就需要理解一下原始的数据存放方式中的地址,到底是不是所谓的寄存器地址了,之前说了,寄存器的数据宽度是8bit的,这个是永远不会变化的,而且master看每个地址只有一个8bit字节。综合这两句话,可以知道,其实每个16bit的数据实际上是由两个寄存器数据组成的,这样我们就需要重新排列以下原始数据了。

外设中的数据长度为128,数据宽度为16bit。那么在外设中的数据存放方式为

外设上的地址寄存器地址数据 (16bit)
0x000x01-0x00REG[1] REG[0]
0x010x03-0x02REG[3] REG[2]
0x020x05-0x04REG[5] REG[4]
0x…-0x…REG[…] REG[…]
0x7F0x7F-0x7EREG[255] REG[254]

在Dynmatic动态寻址模式下,master读入到Avalon MM 的时候是这样的

地址数据 (32-bit)
0x00REG[3] REG[2] REG[1] REG[0]
0x04REG[7] REG[6] REG[5] REG[4]
0x08REG[11] REG[10] REG[9] REG[8]
REG[…] REG[…] REG[…] REG[…]
0xFCREG[255] REG[254] REG[253] REG[252]

看没看到,实际上和8bit的时候是一样一样的,这个也就是为什么说将Native寻址模式干掉的原因了,因为无论外部如何变化,采用动态寻址的模式,到内部的寄存器排列模式是一摸一样的。这样就理解了Altera的那句使用Dynamic更加便捷的原因了。
有代码

IORD_32DIRECT(BASE,0) //得到第一组2个16bit 4个寄存器(0-3)数据
IORD_32DIRECT(BASE,4) //得到第二组2个16bit 4个寄存器(4-7)数据

同样如果要单独读取某一个16bit数据(2个寄存器),那么就是用提供的API

IORD_16DIRECT(BASE,0) //得到外设地址0x00上的1个16bit 2个寄存器(0-1)数据
IORD_16DIRECT(BASE,2) //得到外设地址0x01上的1个16bit 2个寄存器(2-3)数据

解释了上面引用的代码IORD_16DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*2这里的2是如何来的。

总结起来就是这样:
无论外部设备上的地址或者数据宽度如何变化,我(master)从AvalonMM总线上读取过来的数据都是一片连续的由8bit寄存器组成的内存空间,具体表示的数据是多少位的,通过3种不同的API(8DIRECT、16DIRECT、32DIRECT)来去读取或者截取就好了,只需要计算好响应的寄存器变量下表就完事儿。

2.3 32bit 和64 bit

这样32bit和64bit,甚至更多,也就很好理解了。这里面唯独有一个特殊的就是32bit,因为32bit是和master一样的数据宽度,实际上无论是原来的静态寻址Native模式还是Dynamic动态模式都无所谓了,可以采用原来的Native模式下的APIIORD(BASE, REGNUM) ,主意,这里的REGNUM看样子说的是寄存器,实际上这里的寄存器是32bit的,也就是说是实际寄存器的4倍!!!就是因为很容易混淆,所以我个人极力不推荐采用原始的API。

3. 尾巴

最后附一个官方的新图
《正确理解Avalon MM总线的动态地址寻址Dynamic Addressing》
实在不想吐槽官方,给的图实在是看的不是通透,注意第二列 是Access,表示的是Master向Avalon MM总线第几次访问的次数!!!不是表示的偏移量!!!这个图的意思就是如果Slave是8bit的数据宽度,那就访问4次,得到全部32bit数据,如果是16bit,就访问2次…根本不是表示数据地址排列的,也没法指导怎么写API。


推荐阅读
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
author-avatar
百度地震姜常宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有