s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)
不同位宽设备的连接
我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的。

8bit rom与CPU地址线的连接

8bit*2 rom与CPU地址线的连接

8bit*4 rom与CPU地址线的连接

16bit rom与CPU地址线的连接

16bit*2 rom与CPU地址线的连接

从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设...
从上面的图中,我们还看见一个规律:
当外设总线位宽为8bit时, 外设A0接CPU的地址总线ADDR[0],
A[1]->ADDR[1] ...A[15]->ADDR[15]
当外设总线位宽为16bit时,外设A0接CPU的地址总线ADDR[1],
A[1]->ADDR[2] ...A[15]->ADDR[16]
当外设总线位宽为32bit时,外设A0接CPU的地址总线ADDR[2],
A[1]->ADDR[3] ...A[15]->ADDR[17]
那么为什么要这样设计呢?
我们先看一个例子:
假设CPU执行:
MOV R0, #3
LDRB R1, [R0] @ 从内存地址为3的地方,读出一个字节
如图有8bitROM、16bitROM、32bitROM

(1)对于8bitROM ,8bit是一次读写的最小单位,即0地址是第一个8bit,1地址是第二个8bit;
CPU发出地址3,即A0和A1都为1,8bitROM的A0和A1收到的也都是1,
于是找到了ROM上地址为3的8bit数据,包含了我们需要的数据。
(2)对于16bitROM ,16bit是一次读写的最小单位,即0地址是第一个16bit,里面有两个8bit数据;
CPU发出地址3,即A0和A1都为1,16bitROM的A0和A1分别收到的是1和0,
于是找到了ROM上地址为1的16bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。
(3)对于32bitROM ,32bit是一次读写的最小单位,即0地址是第一个32bit,里面有四个8bit数据;
CPU发出的地址3,即A0和A1都为0,32bitROM的A0和A1收到的都是0,
于是找到了ROM上地址为0的32bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。
用表格更好理解:
| ROM/bit | CPU发出地址 | ROM收到地址 | ROM返回数据 | 内存控制器挑选出数据给CPU |
|---|---|---|---|---|
| 8bit(ROM) | 0b000011 | 0b000011 | 编号3的存储单元中的8数据 | 编号3的存储单元中的8数据 |
| 16bit(ROM) | 0b000011 | 0b000001 | 编号1的存储单元中的16数据 | 根据”A0=1”,挑出低8bit数据 |
| 32bit(ROM) | 0b000011 | 0b000000 | 编号0的存储单元中的32数据 | 根据”A1A0=11”,挑出最低8bit数据 |
结论:
和cpu地址总线相连的外设地址线确定了要访问外设的地址,即哪个存储单元;
然后内存控制器拿到外设存储单元中的数据后,再根据那几个错开的引脚[A1-A0]的值(CPU地址总线没接的那几个引脚的值),来挑出相应的数据给CPU。
再举一个栗子: 假如读取一个32位的数据时
MOV R0, #4
LDR R1, [R0] @去地址4,读取4字节数据
我们知道CPU发出的是32bit地址,那么
对于16bit Rom,内存控制器会给它发2次,rom也会相应的接收2次;
对于8bit Rom,内存控制器给它发4次, rom接收4次,
那么CPU怎么知道它外接的rom位宽是16bit,8bit还是多少...?
当然内存控制器知道了,配置总线位宽寄存器。 如何配置总线位宽寄存器
执行过程如下:
| ROM/bit | CPU发出地址 | ROM收到地址(内存控制器转发给rom) | ROM返回数据 | 内存控制器组装数据给CPU |
|---|---|---|---|---|
| 8bit(ROM) | 0b000100 | 0b000100 | 地址4的一个1byte数据 | 组装地址7、6、5、4数据成4字节数据 |
| 0b000101 | 地址5的一个1byte数据 | |||
| 0b000110 | 地址6的一个1byte数据 | |||
| 0b000111 | 地址7的一个1byte数据 | |||
| 16bit(ROM) | 0b000100 | 0b00010 | 地址2的一个2byte数据 | 组装地址3、2的数据成4字节数据 |
| 0b00011 | 地址3的一个2byte数据 | |||
| 32bit(ROM) | 0b000100 | 0b00001 | 地址1的一个4byte数据 | 直接返回4字节数据 |
怎样确定芯片的访问地址?
1. 根据片选信号确定基地址
2. 根据芯片所接地址线确定范围


| 外设类型 | 接内存控制器的哪个片选 | 基地址 | 占用CPU的地址总线 | 地址范围(offset + size) |
|---|---|---|---|---|
| nor | nGCS0 | 0x0000,0000 | ADDR0-ADDR20 | 0x0000,0000 ~ 0x001f,ffff(2M) |
| dm9000网卡 | nGCS4 | 0x2000,0000 | ADDR0和ADDR2 | 0x2000,0000 ~ 0x2000,0005(5byte) |
| sdram | nGCS6 | 0x3000,0000 | ADDR0-ADDR25 | SDRAM的地址范围 |
这里再次提醒一下,有人发现nor没有和CPU的ADDR0相连接,sdram没有和CPU的ADDR0、ADDR1相连接。不要觉得ADDR0、ADDR1没用到,由于nor数据位宽是16bit,ADDR0是给内存控制器拆分数据用的,同样sdram数据位宽32bit,ADDR0、ADDR1也是给内存控制器拆分数据用的。这个上面已分析过,这也是什么要错位连接的原因。
s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)的更多相关文章
- s3c2440裸机-内存控制器(三、norflash初始化-时序设置)
1.norflash与2440的硬件连接 2.初始化nor,配置nor时序 1.如图是S3C2440的内存控制器的可编程访问周期读写时序,里面的时间参数要根据外部设备的性能进行配置,这里先列出时间参数 ...
- s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
1.SDRAM原理 black (1)SDRAM内部存储结构: (2)再看看与2440连接的SDRAM原理图: sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联 ...
- s3c2440裸机-内存控制器(五、SDRAM编程实现)
配置内存控制器-SDRAM编程配置 2440内存控制器共有13个寄存器. BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0-5)两个寄存器: BANK6.BANK7外接SDRA ...
- s3c2440裸机-内存控制器(一、内存控制器的原理)
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nan ...
- s3c2440裸机-时钟编程(二、配置时钟寄存器)
s3c2440裸机编程-时钟编程(二.配置时钟寄存器) 1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作. 2.nRESET复位信号 ...
- s3c2440裸机-UART编程(二、UART编程实现)
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解. 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putc ...
- 内存寻址能力与CPU的位宽有关系吗?
答案是:没有关系.CPU的寻址能力与它的地址总线位宽有关,而我们通常说的CPU位宽指的是数据总线位宽,它和地址总线位宽半毛钱关系也没有,自然也与寻址能力无关. 简单的说,CPU位宽指的是一个时钟周期内 ...
- S3C2440—7.存储控制器访问外设
文章目录 一.内存接口的概念 二.存储控制器(内存控制器) 2.1 什么是存储控制器? 2.2 S3C2440存储控制器介绍 2.3 存储控制器如何处理不同位宽的外设 2.4 怎么确定芯片的访问地址? ...
- 十二、S3C2440 裸机 — SDRAM
12.1 SDRAM 介绍 12.1.1 SDRAM 定义 SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存储器-内存条 同步是指内存工作 ...
随机推荐
- Python活力练习Day3
Day3:请输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个字母. #这是一道典型的题,一次输入一个字母,首字母匹配一个list里的内容.如果匹配到多个,再输入并匹配第二个字 ...
- Xshell/Xftp连接Linux速度非常慢(已解决)
原因: 在使用shell连接虚拟机时连接等待时间太长,ssh的服务端在连接时会自动检测dns环境是否一致导致的,修改为不检测即可! 解决方案: 1.打开sshd服务的配置文件/etc/ssh/sshd ...
- GitLab-使用SSH的方式拉取和推送项目
场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- GitLab-怎样使用GitLab托管项目
场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- java编译报错 错误: 编码GBK的不可映射字符
解决方法: 1. javac -encoding UTF-8 .\Test_Sql.java //加上参数指定utf-8 2.改变文件编码 使用 ANSI编码.
- s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
1.SDRAM原理 black (1)SDRAM内部存储结构: (2)再看看与2440连接的SDRAM原理图: sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联 ...
- [洛谷P1144][题解]最短路计数
这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans ...
- 关于AttributeError: 'NoneType' object has no attribute 'send_keys'
在学web自动化测试时,通过PO模型将特定页面的一些元素及元素操作放在特定页面模块中, 然后提取公共的部分, 如元素等待WebDriverWait, 元素操作send_keys, click, 获取元 ...
- 浅谈Httpmodules
HttpModule是ASP.NET过滤器,可以理解为HTTP请求的必经之地我们只要实现IHttpModule接口,就可以取代HttpModule namespace BookShop.Handler ...
- PAT 1009 Product of Polynomials 模拟
This time, you are supposed to find A*B where A and B are two polynomials. Input Specification: Each ...