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

2023-11-18

原文地址: http://www.eefocus.com/%E5%8D%83%E9%87%8C%E7%9F%A5%E9%B9%B0/blog/10-03/186914_04945.html
FLASH连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位。为什么要偏1位?

从软件和CPU的角度而言,一个地址对应一个字节,就是8位数据。这是肯定的,不要怀疑这点。

对于具体器件而言,它的位宽是一定的,所谓位宽,指的是"读/写操作时,最小的数据单元" -- 别说最小单元是"位",一般设备上没有单独的"位操作",修改位时通过把整个字节、字或双字读出来、修改,再回写。

CPU的地址线(A0-A20)对应的最小数据单元是字节,即8位;
而位宽为16的NOR FLASH的地址线(A0-A19)对应的最小数据单元是16位。
这两个怎么对应起来?

如果说外设的位宽是16,难道我们写程序时会"特意"以16位进行操作吗?不用的,我们写程序时根本不用管外设位宽是8、16还是32。

仔细想想,其实是可以想通的:既然CPU、外设NOR FLASH的最小读/写单元已经固定,那么肯定就是CPU与NOR FLASH之间有个中间层,它来做处理:
这个中间层被称为"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位的数据,这是NOR FLASH中的第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位(注意,前面的低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位(注意,第3点是低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位的数据,这是NOR FLASH中的第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位的数据,这是NOR FLASH中的第1个"最小数据单元"
③ "Memory Controller"读入这个16位数据
④ "Memory Controller"发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
⑤ NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第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。

但是也不是所有位宽16bit的flash与cpu的连接 都是像上述那样错开一位的,与具体的flash芯片设计有关系,所以需要查看其datsheet,下文以芯片士通的29LV650和intel的E29F128为例进行说明

这里看来intel nor flash在位宽为16bit时(由VPEN选择),把A0忽略掉了(需要查手册查证)

下面研究一下系统总线地址(cpu_addr)、宽度(bus_width)与nor flash设备总线地址(device_addr)、位度(device_width)的区别与联系:

一、对于nor flash设备来说
1、 nor flash设备的位宽视芯片厂商而定,有x8、x16两总方式(虽然现在主要使用x16的方式,不过内核于启动代码里面仍然保留着对x8和x16两种方式的支持);把多片nor flash并起来使用可以扩大位宽(比如两片x8的nor flash并起来使用位宽扩大为x16)。

2、nor flash设备的总线地址(寻址)范围视具体芯片以及其采用的位宽而定:

以富士通的29LV650为例:
(29LV650的容量是8Mbyte,共128个sector,每个sector的大小是64 kbyte)
1)如果选择位宽为x8,设备总线的每个地址代表了一个byte的存储单元,固其总线地址范围为8M(0x000000~0x7fffff);
2)如果选择位宽为x16,设备总线的每个地址代表了两个byte的存储单元,固其总线地址范围为4M(0x000000~0x3fffff);

再来看看intel的E29F128:
(E29F128的容量为16Mbyte,共128个sector,每个sector的大小是128Kbyte)
1)如果选择位宽为x8,设备总线的每个地址代表了一个byte的存储单元,固其总线地址范围为16M(0x000000~0xffffff);
2)如果选择位宽为x16,情况和富士通的29LV650不同,这时候设备的A0脚不可用,所以你不能访问到奇地址的存储单元,而只能0、2、4...地址的来访问,其总线地址范围为8M(0x000000~0xffffff的偶地址)

二、对于系统来说
以S3C2410为例,cpu总线宽度是32位,可以通过8、16、32位的总线宽度来访问nor flash设备,视设备的位宽和是否并起来使用而定:
注:
buswidth=device_width*interleave:

然而,在cpu的眼里,每一个地址代表1byte的存储单元,不像nor flash设备那样,还有byte、word之分。


三、好了,了解了系统总线地址、宽度与nor flash设备总线地址、位宽后的区别后,
现在讨论一下cpu与nor flash的接法问题(通过举例来说明):

1、对于富士通的29LV650
1)选择x8方式,cpu的A0~A22接nor flash的A0~A22
2)选择x16方式,cpu的A1~A22接nor flash的A0~A21
注意:
cpu的A1接nor flash的A0,cpu只能访问偶地址,cpu的一次操作访问了2byte大小的存储单元。

2、对于intel的E29F128
1)选择x8方式,cpu的A0~A23接nor flash的A0~A23
2)选择x16方式,由于这时候地址线A0不再有效(这点与富士通的29LV650不同),
intel E29F128的A1等价于富士通的29LV650的A0,所以系统总线A1~A23接nor flash的A1~A23

四、在cpu对nor flash寻址方面

1、对于富士通的29LV650
1)在x8模式,系统总线和nor flash总线一一对应,直接访问
2) 在x16模式,nor flash的对外总线缩小一半,一个地址可寻址的存储单元由原来的1 byte变为1 word(1 sector的地址范围由原来的1<<16变为1<<15),所以我们对其进行寻址的时候,需要把所要寻址的存储单元地址>>1位
注意:
我这里说的是以byte为单位的存储单元地址

由于系统总线的A1接nor flash的A0,固系统总线地址等于nor flash总线地址<<1位
注意:
我这里说的是nor flash的总线地址,对于x8方式以byte为单位,对于x16方式以word为单位


2、对于intel的E29F128
1)在x8模式,系统总线和nor flash总线一一对应,直接访问
2)在x16模式,nor flash总线的A0不再使用,有效的总线为A1~A23,所以我们对其寻址的时候,不必像富士通的29LV650那样需要把所要访问的存储单元地址>>1位(因为A0不再有效,等于奇地址自动被忽略,只有偶地址起作用)
同样:
由于nor flash总线的A0不起作用,系统总线的A1接nor flash的A1,所以我们只要直接给出存储单元的地址即可,不比对其进行<<1位操作(不过由于设备总线A0不起作用,所以系统只能访问到偶地址的存储单元,奇地址将会被忽略)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将按钮控件嵌入到现有 Direct3D 应用程序中

    我想将自己的内容覆盖在 Direct3D v9 游戏 由第三方制作 之上 叠加互动按钮 具体来说 我想覆盖一个可点击的按钮控件 就像 Steam 所做的那样 尽管我正在尝试一个更简单的界面 理想情况下 我能够覆盖 WPF 按钮或 Windo
  • 来自 RAZOR 中不同文件夹的 RenderPartial

    我一直在尝试将我的 aspx 页面转换为 cshtml 并且在从另一个文件夹渲染部分页面时遇到问题 我以前做过的事 我认为等价的是 Html RenderPartial Views Inquiry InquiryList cshtml Mo
  • 如何利用磁盘 IO 队列

    我需要从 3 7 GB 文件中读取小数据序列 我需要阅读的职位是不相邻 但我可以命令 IO 以便从头到尾读取文件 该文件存储在 iSCSI SAN 上 该 SAN 应该能够处理 优化排队 IO 问题是 如何一次性请求我需要的所有数据 位置
  • 通过 Office API 将多个 Word 文档保存为 HTML

    我有大量的Word文档需要解析 由于它们都是从同一个模板创建的 我认为最好的方法是将它们保存为 HTML 文件并解析 HTML 本身 虽然将单个 Word 文档保存为 HTML 相当容易 但我还没有找到从 Word 内部执行批量过程的方法
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • 私有方法和属性的 JetBrains Rider C# 命名风格

    我想将私有方法的首字母设为小写 将公共方法的首字母设为大写 然而 在 Rider 中 C 命名风格下似乎只有一个选项可以应用所有方法 属性和事件 告诉 Rider 仅对私人使用不同约定的最佳方式是什么 也可以看看 私有方法和属性的 ReSh
  • 将数据表传递给存储过程

    我有一个用 C 创建的数据表 using DataTable dt new DataTable dt Columns Add MetricId typeof int dt Columns Add Descr typeof string dt
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • WPF 应用程序在每个系统规模上具有相同的大小(与规模无关)

    有没有办法让 WPF 应用程序在每个系统规模上获得相同的大小 当我改变时更改文本 应用程序和其他项目的大小在windows系统设置中125 推荐 to 100 在全高清屏幕中 我的 WPF 应用程序变得太小 为了实现独立的系统缩放应用程序
  • C++ 按值而不是按引用将数组发送到函数

    我的 C 有问题 我有一个对数组进行排序的函数 但我不想处理原始数组 我想通过值而不是通过引用将数组发送到函数 请帮我 int bogoSort int tab int n int iloscOperacjiDominujacych 0 c
  • 使用资源文件进行本地化不起作用

    我添加了新的 Rosource 文件 UserNotification resx 然后我添加了两个文件进行本地化 并将其命名为 UserNotification hr HR resx 和 UserNotification sl SI res
  • 执行按钮单击时使 wpf UI 响应

    在我的 wpf c 应用程序中 当用户按下按钮时会执行一个很长的过程 当按下按钮直到执行完整的代码时 窗口将冻结 用户无法在窗口中执行任何其他任务 如何使按钮单击代码作为后台进程 以便窗口响应用户 我尝试过以下方法 但没有成功 privat
  • 私有静态方法有必要吗?

    原理工程师 https stackoverflow com users 201787 metal在我上一家公司有一条规则private static方法应该作为实现文件中的函数实现 而不是作为类方法 我不记得他的规则是否有任何例外 我在目前
  • System.Globalization.CultureInfo 不包含 Name 的定义

    我对 System Globalization CultureInfo 类和 System Globalization 命名空间有这个特殊问题 我从具有 CultureInfo 属性的 API 调用返回一个对象 语言 我能够成功地将其在客户
  • 如何通过列名检查MySqlDataReader中的NULL?

    我怎样才能检查NULL开放的价值MySqlDataReader 以下不起作用 它总是击中else if rdr GetString timeOut null queryResult Egresstime Logged in else que
  • 升压参数库

    最近我发现参数 http www boost org doc libs 1 50 0 libs parameter doc html index htmlBoost 中的库 老实说 我不明白为什么这是 Boost 的一部分 当需要向函数传递
  • 虚拟继承 - 跳过构造函数

    我有以下课程 class Socket Socket Socket SOCKET s class Connection public virtual Socket Connection IP ip 这两个类包含一些纯虚函数和一些非虚函数以及
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • Actionscript 对象的属性数量

    如何获取通用 Actionscript 对象中的属性数量 如数组长度 您必须循环所有元素才能对它们进行计数 function objectLength myObject Object int var cnt int 0 for var s

随机推荐

  • beam search的例子

    看了一下网上对beam search的讲解 感觉都说的太杂了 我试图用一个最简单的例子来帮助读者理解 见下图 假设我有一个模型 能够根据当前词输出下一个词的概率分布 最后依次这样就能生成一大串文本 以上面的图为例 The 的下一个词的最大概
  • Spring StateMachine使用笔记

    Spring StateMachine使用笔记 配置状态机 状态 分层状态 withStates 配置状态 states状态列表 可以使用多个withStates进行parent分层 配置区域 当相同的分层状态机具有多组状态时 每个都具有初
  • 系统移植开发阶段部署

    开发阶段部署阶段 uboot镜像 ubootpak bin flash SD linux内核镜像 uImage tftp下载 根文件系统 rootfs nfs挂载 本文操作需要用到uboot命令进行镜像搬移和根文件系统挂载 uboot中常用
  • EPS学习笔记3----------常用地物采集方法(房屋,斜坡,台阶)

    1 三维模型中房屋绘制方法 面状地物 五点房 不会自动弹出房屋属性录入窗口 任意绘制法 绘制结束弹出房屋属性录入窗口 多点法 1 首先在房屋某一面用鼠标左键选择一点 2 鼠标移到房屋屋檐处 利用shift A将前一节点高程移到屋檐高程 3
  • 前端开发常见面试题第三篇(Vue和React)

    文章目录 1 Vue中直接获取组件内的DOM元素或子组件实例 2 生命周期 3 双向绑定原理 4 v if和v show的区别 5 Vue导航钩子 6 路由跳转的方式 7 vuex常用的是什么 怎么使用 8 父子组件之间通信 9 跨域处理
  • Java排序算法:选择排序

    Java排序算法 选择排序 选择排序它的主要思想是 在未排序的数组中选择最小的元素 然后将其放置在数组的起始位置 再在剩余的未排序数组中选择最小元素 并将其放置在已排序部分的末尾 重复此过程 直到整个数组排序完成 选择排序的步骤如下 1 从
  • 15款业界公认的最佳视频处理软件

    因为需要购买昂贵的视频处理软件和高性能图形计算机 所以视频处理是一项比较耗费金钱的技术活 正是由于这样 一部分人选择使用性能较好的免费在线编辑软件 无需太多视频处理知识便可在浏览器中剪切和编辑视频 然而 当我们无法连接网络或网络很慢的时候
  • IC卡片使用基础

    一 卡片基本概念 集成电路卡 即日常生活中常使用的卡片 可以根据读写特性分为两类 ID卡和IC卡 ID卡 全称身份识别卡 是一种不可写入的感应卡 含固定编号 卡内除了卡号外 无任何保密功能 其 卡号 是公开 裸漏的 IC卡 带有存储器 又称
  • redis缓存击穿、缓存穿透、缓存雪崩、缓存一致性解决方案的代码实现

    1 0 缓存击穿 概念 一些redis的key过期 同时大量数据请求过期的key或者redis不存在的key 导致大量请求打到数据库 导致数据库瘫痪 解决方案 1 设置热点数据永不过期 2 对热点数据加锁 分布式锁 代码实现 初始化项目 商
  • 【笔记】有点麻烦的MatConvNet的dagnn的debug过程

    尝试用MatConvNet训练 然而遇到了以下bug 一脸懵逼折腾了四天 No public property dilate exists for class dagnn Conv Error in dagnn Layer load lin
  • javaweb课程设计之商品后台管理系统

    主要技术 layui框架 html5 jsp oracle数据库 servlet session filter 功能说明 基于java开发的商品管理系统 管理员在后台进行添加商品 修改商品 删除商品 批量删除商品 设置商品上下架功能等 完美
  • webSocket的使用

    在Spring Boot项目中使用Java WebSocket 添加依赖 在项目的构建文件 如pom xml 中添加Java WebSocket的依赖项 可以使用Java EE的WebSocket API或者其他第三方库 例如 Tyrus
  • MATLAB绘制局部放大图

    在数据处理时 当曲线出现跳变的时间极短 出于观察跳变时间段波形的需要 需要对曲线跳变处进行局部放大处理 本文给出了此种情况下MATLAB绘制局部放大图的流程 同时 当曲线的峰值数据与平均值相差一个数量级时 如峰值12 平均值范围落在是 1间
  • awk内置函数

    http blog csdn net nuoline article details 8610679
  • 【爬虫进阶】猿人学任务七之字体反爬(难度2.0)

    目录 前言 特此说明 分析 代码过程 成果 完整源码 前言 往期有讲解过某团字体反爬 感觉效果不太好 所以本章重新找了个例子 希望能帮助大家理解透彻 再遇到直接手撕 特此说明 如果涉及到版权问题 请立刻联系博主删除 分析 首先 我们看题目
  • C++实现栈(链表模拟)【每一步详细深入讲解,代码清晰、简单、易懂】

    文章目录 一 利用链表实现栈 1 链表实现的思路 2 设计栈的结构 3 入栈操作 4 出栈操作 5 判断栈空 6 构造析构 7 完整代码 一 利用链表实现栈 1 链表实现的思路 由于栈是一种较为简单的数据结构 用链表实现栈 逻辑上和数组差不
  • 多输入通道和多输出通道

    目录 多输入通道和多输出通道 目录 1 什么是多输入通道和多输出通道 2 多输入通道和多输出通道的实现 2 1 多输入通道和多输出通道的卷积操作 2 2 多输入通道和多输出通道的全连接操作 3 多输入通道和多输出通道的实例 3 1 导入必要
  • 若依SpringBoot+Vue分离版打包部署(前端)

    遇到的问题为vue项目webpack dev server配置后本地连接服务器地址正常请求 但是打包之后请求服务器接口一直是404 Vue前端打包 1 npm run build prod 打包 2 npm run preview 打包正式
  • 【Vue2从入门到精通】深入浅出,带你彻底搞懂Vue2组件通信的9种方式

    文章目录 人工智能福利文章 Vue组件间通信分类 1 props emit 1 1 父组件向子组件传值 1 2 子组件向父组件传值 2 parent children 3 ref refs 3 1 ref作用于组件 3 2 ref作用于Ht
  • FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法

    原文地址 http www eefocus com E5 8D 83 E9 87 8C E7 9F A5 E9 B9 B0 blog 10 03 186914 04945 html FLASH连接CPU时 根据不同的数据宽度 比如16位的N