有不少人问到: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与外设之间地址线的连接方法的更多相关文章

  1. FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法

    转 http://blog.csdn.net/linweig/article/details/5556819 flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19 ...

  2. Flash的不同位宽与CPU地址线的接线问题?

    一般Flash都有8.16.32等这些不同的位宽,当然说白了就是Flash的数据线位数. 在Flash与CPU的地址线的连接问题时:不同位宽的有不同的连接方法: 一般是:位宽为8时CPU的ADDR0与 ...

  3. s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)

    不同位宽设备的连接 black 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的. 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 r ...

  4. 16位的MD5加密和32位MD5加密的区别

    16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16 ...

  5. 内存寻址能力与CPU的位宽有关系吗?

    答案是:没有关系.CPU的寻址能力与它的地址总线位宽有关,而我们通常说的CPU位宽指的是数据总线位宽,它和地址总线位宽半毛钱关系也没有,自然也与寻址能力无关. 简单的说,CPU位宽指的是一个时钟周期内 ...

  6. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  7. FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证

    本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根 ...

  8. C语言-字、半字、内存位宽相关

    1.32位系统:32位系统指的是32位数据线,但是一般地址线也是32位,这个地址线32位决定了内存地址只能有32位二进制,所以逻辑上的大小为2的32次方.内存限制就为4G.实际上32位系统中可用的内存 ...

  9. win10 64位专业版系统中显示32位dcom组件配置的方法

    word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...

随机推荐

  1. 线性代数-矩阵-【3】矩阵加减 C和C++实现

    点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...

  2. CSS3笔记之第二天

    1.CSS盒模型 指定元素的宽度和高度width,height 2.CSS边框 border-style:solid; border-width:5px; border-top-width:15px; ...

  3. 网络唤醒全攻略(Wake On Lan)

    家里组了台服务器存放资料,或者作为开发服务器,远程登陆成为刚性需求,由于机器需要的时候才用到,所以如果经常开机的话很费电,按需开机是最佳办法:网上教程很多,但是比较杂乱,表达累赘:还是自己总结一篇简单 ...

  4. hover用法实例

    //hover,鼠标移入移出的另一种用法 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu ...

  5. HDU 6185 Covering 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...

  6. robot framework 牛刀一试

    1.New Project   Type选择Directory,Format选择TXT 2.New Suite   在Project的基础上Create New Suite,Type选择File,Fo ...

  7. Day3 - Linux系统安装_Centos6.9

    第1章 虚拟机安装  1.1 镜像下载 1.1.1 新版本下载 http://mirrors.aliyun.com  #阿里云官方镜像站点 1.1.2 旧版本下载 http://vault.cento ...

  8. bugly cocos 接入和 符号表使用

    bugly cocos 接入和 符号表使用 在bugly网站下载 BuglyCocosPlugin 的sdk ios 1. 在 项目的 classes 里面新建 文件夹  BuglyCocosPlug ...

  9. java 得到以后的日期

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt222 import java.text.ParseException; im ...

  10. Java之String、StringBuffer、StringBuilder

    String.StringBuffer和StringBuilder的理解 这三个类学过已经有一段时间了,想通过这篇文章再将其复习一下,以求温故知新. 首先说一下三者各自的特性 String: Stri ...