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

[复制链接]

版主

发表于 2017-9-27 15:34:15   3064 查看 7 回复 显示全部楼层 倒序浏览
分享
本帖最后由 weidongshan 于 2017-9-27 15:35 编辑

有不少人问到:flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH A0A19),处理器的地址线要(A1A20)左移偏1位。为什么要偏1位?

(全文有点晦涩,不懂也没关系。可以先记住结论,不会影响后续学习。建议收藏本文对照着1MMU视频阅读)

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

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

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

如果说外设的位宽是16,难道我们写程序时会特意16位进行操作吗?不用的,我们写程序时根本不用管外设位宽是816还是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的(A1A20)接到 16位的NOR FLASHA0A19),即CPUA0不接──这说明:不管A00还是1NOR FLASH接收到的地址是一样的

CPU
发出地址0bxxxxxxxxx00bxxxxxxxxx1时,NOR FLASH看到的都是0bxxxxxxxxx,返回给“Memory Controller”的都是同一个16位数据。
再由“Memory Controller”选择其中的低8位或高8位给CPU

“Memory Controller”
会帮助我们做这些事情,举例为证:
1.
软件要读取地址0上的8位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000000的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000000
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NORFLASH中的第1最小数据单元
“MemoryController”读入这个16位数据
Memory Controller把这个16位数据的低8位返回给CPU,这就是一个8位数据。

2.
软件要读取地址1上的8位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000001的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000000
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NOR FLASH中的第1最小数据单元
Memory Controller读入这个16位数据
Memory Controller把这个16位数据的高8位返回给CPU,这就是一个8位数据。

3.
软件要读取地址2上的8位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000010的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000001
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NOR FLASH中的第2最小数据单元
Memory Controller读入这个16位数据
Memory Controller把这个16位数据的低8位返回给CPU,这就是一个8位数据。

4.
软件要读取地址3上的8位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000011的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000001
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NOR FLASH中的第2最小数据单元
Memory Controller读入这个16位数据
Memory Controller把这个16位数据的高8位返回给CPU,这就是一个8位数据。

5.
软件要读取地址01上的16位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000000的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000000
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NOR FLASH中的第1最小数据单元
Memory Controller读入这个16位数据
Memory Controller把这个16位数据返回给CPU

6.
软件要读取地址23上的16位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000010的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000001
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NORFLASH中的第2最小数据单元
Memory Controller读入这个16位数据
Memory Controller把这个16位数据返回给CPU

7.
软件要读取地址0123上的32位数据时,硬件是这样进行的:
Memory Controller发出0b000000000000000000000的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000000
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NORFLASH中的第1最小数据单元
Memory Controller读入这个16位数据
   
Memory Controller发出0b000000000000000000010的地址信号,NOR FLASHA0A19线上的信号是:0b00000000000000000001
NOR FLASH在数据总线D0D15上提供一个16位的数据,这是NORFLASH中的第2最小数据单元
Memory Controller读入这个16位数据
Memory Controller把两个16位的数据组合成一个32位的数据,返回给CPU
   
17可知:
对于软件而言,它不知道底下发生了什么事,它只管结果
读取地址08位数据,就得到了一个8位数据;读取地址18位数据,就得到另一个紧挨着的8位数据,读取地址0开始的16位数据,就得到了一个16位数据;读取地址2开始的16位数据,就得到另一个紧挨着的16位数据,读取地址0开始的32位数据,就得到了一个32位数据;读取地址4开始的32位数据,就得到另一个紧挨着的32位数据

对于NOR FLASH,它只按照A0A19地址线,提供16位数据,才不管软件要的是8位、16位,还是32位呢。
Memory Controller完成了这些位宽之间的数据选择、合并。


所以:
外设位宽是8时,CPUA0AXX与外设的A0AXX直接相连
外设位宽是16时,CPUA1AXX与外设的A0AYY直接相连,表示不管CPUA00还是1,外设看到的都是同一个地址,对应16位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU
外设位宽是32时,CPUA2AXX与外设的A0AZZ直接相连,表示不管CPUA0A1000110还是11,外设看到的都是同一个地址,对应32位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU

标签:ARM MMU 嵌入式

总工程师

发表于 2017-9-28 12:55:39  
非常不错的资料分享     
回复

点赞 举报

总工程师

发表于 2017-10-13 00:31:09  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
韦老师的大作啊
回复

点赞 举报

总工程师

发表于 2017-10-13 00:31:42  
进来学习一下下了,
回复

点赞 举报

总工程师

发表于 2017-10-13 00:32:19  
受益良多的啊,
回复

点赞 举报

实习生

发表于 2017-10-23 16:46:13  
谢谢韦老师,一直在学习他的课程,很好
回复

点赞 举报

实习生

发表于 2017-10-24 18:09:51   来自手机
很好
回复

举报

技术员

发表于 2017-11-21 15:20:16  
精华帖子控制的好严格
回复

点赞 举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区