虽然Nios II CPU是32位构架,但是Avalon总线作为一种开放的总线结构,为了兼容各种位宽的CPU和外设,Avalon Interconnect Fabric地址总线使用的是字节寻址的方式,也就是A0地址一定指向外设的某个字节(但是不一定和外设地址线的A0连接,详后);而不是同CPU宽度的某个32bit空间。
所以,在自定义Avalon MM外设的时候,如果是Avalon MM Master,地址线一定是32根,最低位寻址到一个字节(不一定会用到~~)。
首先注意到Avalon MM Slave可以声明自己采用的地址对齐方式有两种:Native alignment 和Dynamic Alignment。
动态地址对齐方式是将MM从设备的地址空间连续地映射到主设备空间。内存类型的从设备控制器应该采用这种方式。在这种方式下,主设备的每一次读传输(或写传输)对应从设备一次或多次读传输(或写传输)。譬如,主设备数据宽度为32bit,从设备为16bit,则主设备每发起一次读传输,从设备将被读两次,用于返回32bit数据(由Avalon Interconnect Fabric逻辑插入状态机实现,用户无需关心具体实现),同理,每一次写操作,从设备执行两次写入操作。Dynamic对齐方式数据宽度限定为8*2^n次方,即只能为8 16 32 64等值。
源生地址对齐方式将从设备的自然数据宽度(即从设备DATABUS宽度)映射到主设备的单位数据宽度(即主设备的DATABUS宽度),假设主设备宽度为32比特,从设备为16比特,且假设从设备的0x00映射到主设备0x00;则从设备的0x02映射到主设备的0x04。寄存器表类型的外设可以考虑使用这种对齐方式。在这种对齐方式里面,主设备发起的每一次读传输(或写传输),只会对应从设备的一次读传输(或写传输),如果主设备数据宽度大于从设备,那么高位内容被零填充,如果主设备宽度小于从设备,则高位自动被抛弃(Truncated)。
那么,如果要书写这些不同方式的外设,应该如何设定Avalon MM Slave控制器的地址线和可选的byteenable信号呢?其实,对于每一个从设备,地址线的最低位指向从设备单位数据宽度(one word)。在这里,word大小可以是8,16,32,64….而不用担心外设是用Dynamic还是Native地址对齐。
如果是Dynamic外设,为了方便不同数据宽度的主设备读取,最好包含byteenable信号。byteenable信号为one hot编码,每一根信号线(lane)对应一个字节。信号的宽度取决于从设备数据总线的宽度,如果为16,则byteenable信号宽度为2.;如果为32bit,则byteenable信号宽度为4。这样在SOPC Builder生成系统的时候,Avalon Interconnect Fabric会自动适配这些信号线到具体的Fabric地址线,譬如外设宽度为16,则从设备控制器的A0连接到Fabric的A1。而Fabric的A0会看外设是否声明了byteenable信号,如果存在,则将A0译码成2bit宽度的Byteenable信号(并连接到外设声明的byteenable信号)。如果没有,则Fabric A0没有连接。
如果是Native外设,从设备的地址线连接到内部Fabric的方式和Dynamic是一致的,只是没有了byteenable信号,以及低位地址线的译码。
在SOPC Builder里面用component editor添加组件的时候,在Interface选项卡里,每个Avalon MM栏里面都有一个Deprecated子栏目,展开它,选择Slave Addressing的方式为Dynamic。如果是内存,还要勾选Memory Device。这个选项卡还真的有些猥琐,不注意还看不到,不过没办法,人家都说了是Deprecated。
在Nios II EDS里面,提供两类IO指令来直接存取DYNAMIC外设和NATIVE外设,如下图:
IORD和IOWR直接指定外设的基地址和偏移量,这个偏移量的话是Width of
BUS的整数倍,也就是说,如果CPU为32bit宽度,则单位偏移量就是4个字节,也就是,写REGNUM==0的寄存器就是基地址的寄存器,REGNUIM==1的话就是第二个寄存器,地址的话自然是BASE_ADDR+4。
而IORD_8DIRECT读取的正如后面所说,是BASE_ADDR+OFFSET位置的一个字节。
不过我比较奇怪的是,如果我用IOWR_32DIRECT(BASE,2,DATA)之类的指令会出现什么后果呢,也就是说,BASE+OFFSET不是4的整数倍,但是却想去读取一个32bit的数据。感觉这种情况硬件是不支持的。。。
来自: http://hi.baidu.com/narshben/blog/item/3692c21f398df8c6a6866956.html
对于读,等待时间指的是从端口捕获数据的时间相对于read信号的延时 建立时间指的是read信号相对于chips […]...
封装IP1、将写好的Verilog代码添加在Quartus工程中,IP目录下,(如果没有,自己建一个)2、打开 […]...
Quartus II 使用 modelsim 仿真 转自:http://www.cnblogs.com/emo […]...
写在前面 阅读目录: 服务号和订阅号 URL配置 创建菜单 查询、删除菜单 接受消息 发送消息(图文、菜单 […]...
S ThinkPad TrackPoint Keyboard II https://support.leno […]...
中国知网(cnki)上caj格式转pdf的方法 ———— […]...
2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件。基本功能包括人机对战、网络对战。我负 […]...
一、Mac / Windows 电脑抓取Android手机APP 日志的方法 电若脑只连接一个Android设 […]...
(本文为转载,原文出处不详) 引言 一个元件封装的制作过程如下图所示。简单来说,首先用户需要制作自己的焊盘库P […]...
RxSwift 中的调度器 2018-10-09 11:59 by l4y, … 阅读, R […]...
以前学习基础的时候学习了一段时间的多线程,上课的时候老师也讲过一遍,那时候感觉学的似懂非懂。因为到现在很长 […]...
超全面!UI设计师如何适配2018新款iPhone 北京时间9月13日凌晨1点,苹果在美国加利福尼亚州的App […]...
一、前言 前一篇文章总结了对 java 并发中的内置锁的理解,这篇文章来说说线程 ,并发与线程总有剪不断理还乱 […]...
一般写论文需要编辑公式时,在较新的word中可以使用自带的公式(符号),但是新手一般都是不停地点 […]...
其实是很简单的代码,叫了翔哥给代码给我改,果断将JAVA改成C++,太简单了。。 我不知道代码是什么意思,贴个 […]...
【模块介绍】 首先检测用户是否在登录状态下,若用户在登录状态下,则跳过用户名检测环节,直接进入随机密保验证和修 […]...
Powered By WordPress