有不少人问到: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的最小读/写单元已经固定,那么肯定就是CPUNORFLASH之间有个中间层,它来做处理:

这个中间层被称为“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不接──这说明:不管A00还是1NOR 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. Tkinter 导入安装包

    Tkinter (capitalized) refers to versions <3.0. tkinter (all lowecase) refers to versions ≥3.0

  2. JavaScript+html5 canvas实现本地截图教程

    这篇文章主要介绍了JavaScript+html5 canvas实现本地截图教程,对截图功能感兴趣的小伙伴们可以参考一下 最近有时间了解了下html5的各API,发现新浪微博的头像设置是使用canva ...

  3. .NET Core多平台开发体验[2]: Mac OS X

    除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的支持,我们先来体验 ...

  4. POI操作Excel的API注意点总结

    本篇是关于POI.jar操作Excel的API注意事项 基数问题 说明:我使用的是POI 3.15版本的,在版本问题上建议大家,在版本稳定的基础上尽量使用高版本的 看过很多帖子在问一个问题:假设原来有 ...

  5. Linux学习之路 -- 简单日常使用命令

    tail -f catalina.out #在 logs 下面查看日志( -f 实时查看) rm -rf /var/log/httpd/access #删除文件(-r删除文件 并删除文件夹下的内容 - ...

  6. 用GDI+画验证码

    1.新建一个窗体应用程序,在上面拖一个pictureBox对象,为其添加单击事件 2.创建GDI对象.产生随机数画入图片中.画线条.最后将图片到pictureBox中,代码如下: private vo ...

  7. §--------算法分界线--------§

    如题 As said in the title~ 计算机的cpu计算从根源上由最基本的逻辑电路(晶体管)组成,由此衍生出最基本的数值运算:四则运算.而此后所有的高级算法都是建立在这个基本计算原理(逻辑 ...

  8. js Web存储方式

    JSON是数据交互中最常用的一种数据格式. 由于各种语言的语法都不同,在传递数据时,可以将自己语言中的数组.对象等转换为JSON字符串> 传递之后,可以讲JSON字符串,在解析为JSON对象. ...

  9. 团队作业10——项目复审与事后分析(Beta版本)

    油炸咸鱼24点APP 团队作业10--事后诸葛亮分析; 团队作业10--Beta阶段项目复审;

  10. 201521123091 《Java程序设计》第4周学习总结

    Java 第二周总结 第四周的作业. 目录 1.本章学习总结 2.Java Q&A 3.使用码云管理Java代码 4.PTA实验 1.本章学习总结 1.1 尝试使用思维导图总结有关继承的知识点 ...