外设位宽为8、16、32时,CPU与外设之间地址线的连接方法
有不少人问到:flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位。为什么要偏1位?
(全文有点晦涩,建议收藏本文对照着1期MMU视频阅读)
从软件和CPU的角度而言,一个地址对应一个字节,就是8位数据。这是肯定的,不要怀疑这点。
对于具体器件而言,它的位宽是一定的,所谓位宽,指的是“读/写操作时,最小的数据单元”──别说最小单元是“位”,一般设备上没有单独的“位操作”,修改位时通过把整个字节、字或双字读出来、修改,再回写。
CPU的地址线(A0-A20)对应的最小数据单元是字节,即8位;
而位宽为16的NOR FLASH的地址线(A0-A19)对应的最小数据单元是16位。
这两个怎么对应起来?
如果说外设的位宽是16,难道我们写程序时会“特意”以16位进行操作吗?不用的,我们写程序时根本不用管外设位宽是8、16还是32。
仔细想想,其实是可以想通的:既然CPU、外设NOR FLASH的最小读/写单元已经固定,那么肯定就是CPU与NORFLASH之间有个中间层,它来做处理:
这个中间层被称为“Memory Controller”,CPU要进行读写操作时,“Memory Controller”根据NOR FLASH的位宽,每次总是读/写16位数据。
以读操作为例:
CPU想进行8位操作时,它选择其中的8位返回给CPU;
CPU想进行16位操作时,它直接把这16位数据返回给CPU;
CPU想进行32位操作时,它发起2次读/写,把结果组合成32位返回给CPU。
现在的连线是:CPU的(A1-A20)接到 16位的NOR FLASH(A0-A19),即CPU的A0不接──这说明:不管A0是0还是1,NOR FLASH接收到的地址是一样的。
CPU发出地址0bxxxxxxxxx0、0bxxxxxxxxx1时,NOR FLASH看到的都是0bxxxxxxxxx,返回给“Memory Controller”的都是同一个16位数据。
再由“Memory Controller”选择其中的低8位或高8位给CPU。
“Memory Controller”会帮助我们做这些事情,举例为证:
1. 软件要读取地址0上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NORFLASH中的第1个“最小数据单元”
③ “Memory
Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。
2. 软件要读取地址1上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000001的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的高8位返回给CPU,这就是一个8位数据。
3. 软件要读取地址2上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。
4. 软件要读取地址3上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000011的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的高8位返回给CPU,这就是一个8位数据。
5. 软件要读取地址0和1上的16位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据返回给CPU
6. 软件要读取地址2和3上的16位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NORFLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据返回给CPU
7. 软件要读取地址0、1、2、3上的32位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NORFLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
⑤ NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NORFLASH中的第2个“最小数据单元”
⑥ “Memory Controller”读入这个16位数据
⑦ “Memory Controller”把两个16位的数据组合成一个32位的数据,返回给CPU。
从1~7可知:
① 对于软件而言,它不知道底下发生了什么事,它只管结果:
读取地址0的8位数据,就得到了一个8位数据;读取地址1的8位数据,就得到另一个紧挨着的8位数据,读取地址0开始的16位数据,就得到了一个16位数据;读取地址2开始的16位数据,就得到另一个紧挨着的16位数据,读取地址0开始的32位数据,就得到了一个32位数据;读取地址4开始的32位数据,就得到另一个紧挨着的32位数据
② 对于NOR FLASH,它只按照A0-A19地址线,提供16位数据,才不管软件要的是8位、16位,还是32位呢。
③“Memory Controller”完成了这些位宽之间的数据选择、合并。
所以:
外设位宽是8时,CPU的A0~AXX与外设的A0~AXX直接相连
外设位宽是16时,CPU的A1~AXX与外设的A0~AYY直接相连,表示不管CPU的A0是0还是1,外设看到的都是同一个地址,对应16位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU。
外设位宽是32时,CPU的A2~AXX与外设的A0~AZZ直接相连,表示不管CPU的A0A1是00,01,10还是11,外设看到的都是同一个地址,对应32位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU。
外设位宽为8、16、32时,CPU与外设之间地址线的连接方法的更多相关文章
- FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法
转 http://blog.csdn.net/linweig/article/details/5556819 flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19 ...
- Flash的不同位宽与CPU地址线的接线问题?
一般Flash都有8.16.32等这些不同的位宽,当然说白了就是Flash的数据线位数. 在Flash与CPU的地址线的连接问题时:不同位宽的有不同的连接方法: 一般是:位宽为8时CPU的ADDR0与 ...
- s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)
不同位宽设备的连接 black 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的. 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 r ...
- 16位的MD5加密和32位MD5加密的区别
16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16 ...
- 内存寻址能力与CPU的位宽有关系吗?
答案是:没有关系.CPU的寻址能力与它的地址总线位宽有关,而我们通常说的CPU位宽指的是数据总线位宽,它和地址总线位宽半毛钱关系也没有,自然也与寻址能力无关. 简单的说,CPU位宽指的是一个时钟周期内 ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证
本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根 ...
- C语言-字、半字、内存位宽相关
1.32位系统:32位系统指的是32位数据线,但是一般地址线也是32位,这个地址线32位决定了内存地址只能有32位二进制,所以逻辑上的大小为2的32次方.内存限制就为4G.实际上32位系统中可用的内存 ...
- win10 64位专业版系统中显示32位dcom组件配置的方法
word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...
随机推荐
- sublime中css输入分号后自动提示的烦恼
sublime开发前端确实好用,有好多些个的插件,轻量便捷,但是在使用sublime中的一些插件的时候总是会遇到困扰,跟自己想象中的不一样,比如在使用SublimeCodeIntel插件的时候,就会遇 ...
- 有哪些关于 Python 的技术博客?
Python是一种动态解释型的编程语言,它可以在Windows.UNIX.MAC等多种操作系统以及Java..NET开发平台上使用.不过包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.因此如何 ...
- JSP入门必读
JSP基础知识:转自老师上课梳理的笔记,希望对大家有所帮助.有什么不妥当的地方还望大家批评指正. 特别适用于JSP入门的人员使用.1.JSP [1] 简介1.1 HTML HTML擅长显示一个静 ...
- 配置文件http://www.cnblogs.com/Jevon-ran/p/7112007.html
author:JevonWei 版权声明:原创作品 /etc/centos-release 记录系统版本信息 /etc/issue 系统登录前提示信息 /etc/motd 系统登陆后提示信息 /etc ...
- JS源生代码“增删改查”之增
51呢最近在做一个管理数据的,第一次接触到用JS的源代码去实现一些功能,才知道网页里的许多功能都是依赖于“增删改查”完成的,下面的几张图片就是对于增的演示: 下面是有关HTML的代码:这个主要是弹窗部 ...
- Selenium常规操作---基于python
from selenium import webdriver 1. 打开浏览器 driver=webdriver.Firefox() #火狐浏览器 driver=webdriver.Ie() #打 ...
- AT&T汇编语言学习:利用c库、文件读写
AT&T汇编.调用C库函数.读/写文件 d0321:更新读文件代码(图片)以后会更新代码版. d0329:汇编文本读取.简单动画. ============================== ...
- webpack配置这一篇就够
最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...
- 转:JDK中的URLConnection参数详解
针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验 ...
- 测试驱动开发(TDD)
测试驱动开发的基本概念 为什么会出现测试驱动开发 当有一个新的任务时,往往第一个念头就是如何去实现它呢? 拿到任务就开始编码,一边写,变修改和设计 我已经调试了好几遍,应该不会有问题了,好了,先休息一 ...