目前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等值


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)
0x00 REG[0]
0x01 REG[1]
0x02 REG[2]
REG[…]
0xFF REG[255]

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

地址 数据 (32-bit)
0x00 REG[3] REG[2] REG[1] REG[0]
0x04 REG[7] REG[6] REG[5] REG[4]
0x08 REG[11] REG[10] REG[9] REG[8]
REG[…] REG[…] REG[…] REG[…]
0xFC REG[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)
0x00 0x01-0x00 REG[1] REG[0]
0x01 0x03-0x02 REG[3] REG[2]
0x02 0x05-0x04 REG[5] REG[4]
0x…-0x… REG[…] REG[…]
0x7F 0x7F-0x7E REG[255] REG[254]

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

地址 数据 (32-bit)
0x00 REG[3] REG[2] REG[1] REG[0]
0x04 REG[7] REG[6] REG[5] REG[4]
0x08 REG[11] REG[10] REG[9] REG[8]
REG[…] REG[…] REG[…] REG[…]
0xFC REG[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. 尾巴

最后附一个官方的新图

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

正确理解Avalon MM总线的动态地址寻址Dynamic Addressing相关推荐

  1. NIOS II 16:Avalon MM Master学习总结

    1.Avalon MM Master 通过学习我们知道NIOS II就是一个典型的Avalon MM Master. Master在Avalon MM总线上,可以对Slave进行读写操作. 2.用户自 ...

  2. 理解Avalon总线的静态地址对齐与动态地址对齐

    尽管看了不少资料,但是一直对 Avalon slave 的动态地址对齐和静态地址对齐的理解不是很透彻.前两天自己做了一个SOPC的自定义组件,通过Deprecated这个选项的不同选取,一下子就理解了 ...

  3. [转载]【转】Avalon总线的静态地址对齐与动态地址对齐_Detective_ALong_新浪博客

    原文地址:[转]Avalon总线的静态地址对齐与动态地址对齐作者:笨鳥先飛 SOPC系统自定义外设之软件设计 时间:2010-10-20 博客园 路漫漫... 完成自定义外设的硬件设计后,就需要编写软 ...

  4. 易语言中动态地址的理解

    易语言中存在"动态地址"和"静态地址" 我开始会觉得很奇怪 为什么会存在动态地址呢 程序代码的设定不是一成不变的吗 我想是动态地址由于动态内存分配形成的

  5. Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 提起Java领域中的锁,是否有种"道不尽红尘奢恋,诉不完人间恩怨"的 ...

  6. 消息中间件解析 | 如何正确理解软件应用系统中关于系统通信的那些事?

    苍穹之边,浩瀚之挚,眰恦之美:悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 随着业务需求的发展和用户数量的激增,对于互联网应用系统或者服务应用程序则提出了新的挑战,也 ...

  7. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 逐层分析分析 静态地址 到 动态地址 的寻址 + 偏移 过程 ) ★

    文章目录 前言 一.上一篇博客中获取到的静态地址 二.第一层静态地址 cstrike.exe+1100ABC 三.第二层地址 四.第三层地址 五.第四层地址 六.静态地址 到 动态地址 的寻址 + 偏 ...

  8. 智能的定义是什么?如何正确理解智能家居?

    近几年,智能家居是一个比较火爆的行业!有很多的人(特别是寻找好的创业的项目的朋友)想从事这个行业,也有很多是想在自己家里装上智能化,享受科技带来的生活便利:还有部分人处于对智能家居的了解期.不管你属于 ...

  9. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

最新文章

  1. 图论-无向图的连通性(POJ1144)(POJ3352)
  2. 丢弃Transformer!旷视和西安交大提出基于FCN的端到端目标检测网络
  3. jdbc在项目中的应用
  4. 蓝桥杯java第四届决赛第一题--猜灯谜
  5. SQL数据库对象的建立
  6. iview 下拉select样式_Vue.js相关:iview实现select tree树形下拉框的示例代码
  7. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
  8. HTML期末作业-中国足球网页
  9. extjs 中登录保存用户名
  10. 案例:演示JDBC的使用
  11. java实现dex转jar,Android 逆向相关
  12. Prototype使用$()函数
  13. 微信小程序云开发教程-WXML入门-列表渲染
  14. ZXing开发彩色二维码
  15. 增长黑客理论(AARRR)模型
  16. 【SpringBoot】11、SpringBoot中使用Lombok
  17. oppor11st升Android p,OPPO R11st刷机教程_OPPO R11st卡刷升级更新官方系统包
  18. 原创|一个统计查询模块基于设计模式的抽象设计
  19. 论文精读:D3S:D3S – A Discriminative Single Shot Segmentation Tracker
  20. java md5 签名_java md5签名

热门文章

  1. Python中循环语句的使用
  2. 如何用css排段落,标准网页中用CSS进行段落排版的方法
  3. Java 通过POI 操作excel表格:读取、写入
  4. 计算2000年1月1日到2020年1月1日相距多少天 java
  5. 公共关系礼仪实务章节测试题——公共关系的类型(四)
  6. 软件看板之父David Anderson:使用看板方法进行项目管理
  7. 085-Java测试题 (2018)
  8. 年轻人不讲武德!200个网络渗透测试工具大汇总
  9. AI呼叫中心市场现状研究分析-
  10. linux查看蓝牙驱动版本号,linux蓝牙驱动代码阅读笔记