某计算机系统具有8位地址总线和8位数据总线,它有64字节的ROM,起始地址为00H,由一个64×4芯片组成,有128字节的RAM,起始地址为40H,由64×8芯片构成,试问:(10分) 1)试问需要多少个ROM和RAM? 2)画出存储器与CPU之间连接的示意图
时间: 2024-03-19 21:39:52 浏览: 190
1)ROM有64字节,每个字节8位,总共需要的位数为64*8=512位。由于一个64×4芯片只有256位,所以需要2个ROM芯片。RAM有128字节,每个字节8位,总共需要的位数为128*8=1024位。由于一个64×8芯片有512位,所以需要2个RAM芯片。
2)下面是存储器与CPU之间连接的示意图:
```
+---------+
| |
| |
| ROM |
| |
| |
+---------+
|
| 8位地址总线
|
+---------+
| |
| |
| RAM |
| |
| |
+---------+
|
| 8位数据总线
|
+---------+
| |
| |
| CPU |
| |
| |
+---------+
```
相关问题
I2C总线存储器读写实验:单片机通过I2C总线向24C02存储器写入设定数据(如AAH),然后读出该数据并在8个LED灯上显示,用一个按键控制此过程。 具体过程为:单片机上电复位后,8个LED灯全亮,按动“单脉冲开关”后,单片机通过I2C总线向24C02存储器写入设定的1个字节数据(如55H),然后读出该数据并在8个LED灯上显示,显示结果保持一段时间后(如2秒,可用延时程序实现),再回到8个LED灯全亮的状态。再次按动“单脉冲开关”后,重复上述过程。注:写入数据后注意加入1ms以上的延时按如下方式接线:EA 接 +5VP2.7 --- P2.0 接 L7 --- L0,驱动8个LED灯P3.2接 单脉冲开关24C02芯片的SCL接 P1.424C02芯片的SDA接 P1.5
这个实验需要连接单片机、24C02存储器、8个LED灯和一个单脉冲开关。接线如下:
- EA引脚连接到+5V,表示使用内部ROM;
- P2.0引脚连接到24C02的SCL引脚,表示I2C总线的时钟线;
- L7~L0引脚连接到8个LED灯的阳极;
- P3.2引脚连接到8个LED灯的阴极;
- 24C02的SDA引脚连接到单片机的P1.5引脚,表示I2C总线的数据线;
- 24C02的SCL引脚连接到单片机的P1.4引脚,表示I2C总线的时钟线;
- 单脉冲开关的一端连接到单片机的任意一个GPIO引脚(如P0.0),另一端连接到GND。
具体的程序实现可以参考以下代码:
```c
#include <reg51.h>
#define I2C_SCL P2_0
#define I2C_SDA P1_5
#define LED_PORT P2
#define LED_ON 0
#define LED_OFF 1
#define KEY P0_0
void delay(unsigned int t) {
while (t--) {
/* 空循环 */
}
}
void i2c_start() {
I2C_SDA = 1;
I2C_SCL = 1;
delay(1);
I2C_SDA = 0;
delay(1);
I2C_SCL = 0;
}
void i2c_stop() {
I2C_SDA = 0;
I2C_SCL = 1;
delay(1);
I2C_SDA = 1;
delay(1);
}
bit i2c_write_byte(unsigned char dat) {
unsigned char i, ack;
for (i = 0; i < 8; i++) {
if (dat & 0x80) {
I2C_SDA = 1;
} else {
I2C_SDA = 0;
}
dat <<= 1;
I2C_SCL = 1;
delay(1);
I2C_SCL = 0;
}
I2C_SDA = 1;
I2C_SCL = 1;
delay(1);
ack = I2C_SDA;
I2C_SCL = 0;
return ack;
}
unsigned char i2c_read_byte() {
unsigned char i, dat;
I2C_SDA = 1;
for (i = 0; i < 8; i++) {
dat <<= 1;
I2C_SCL = 1;
delay(1);
if (I2C_SDA) {
dat |= 0x01;
}
I2C_SCL = 0;
}
return dat;
}
void led_init() {
LED_PORT = 0xFF;
}
void led_display(unsigned char dat) {
LED_PORT = ~(dat & 0xFF);
}
void main() {
unsigned char buf;
led_init();
while (1) {
while (KEY); /* 等待按键按下 */
delay(1000); /* 消抖延时 */
i2c_start();
i2c_write_byte(0xA0); /* 发送写器件地址 */
i2c_write_byte(0x00); /* 发送写地址 */
i2c_write_byte(0x55); /* 发送数据 */
i2c_stop();
delay(10); /* 等待写操作完成 */
i2c_start();
i2c_write_byte(0xA0); /* 发送写器件地址 */
i2c_write_byte(0x00); /* 发送读地址 */
i2c_start();
i2c_write_byte(0xA1); /* 发送读器件地址 */
buf = i2c_read_byte(); /* 读取数据 */
i2c_stop();
led_display(buf); /* 在LED上显示数据 */
delay(2000); /* 延时2秒 */
led_display(0xFF); /* 关闭LED */
}
}
```
程序中的i2c_start、i2c_stop、i2c_write_byte、i2c_read_byte函数是I2C总线的基本操作函数,用于发送起始位、停止位、写数据、读数据等操作。led_init、led_display函数是LED灯的初始化和显示函数,用于控制LED灯亮灭。main函数中的while循环用于不断读取按键状态,当按键按下时执行I2C读写操作,并在LED上显示数据。
在8086汇编语言框架下利用27系列和26系列存储芯片外扩 16K 字 的ROM 和 8K 字 RAM,绘制总线连接方法并给出相应的存储地址。在ROM中存储一段ASCII文本,编制程序将ROM中的内容复制到RAM中。
在8086汇编语言框架下,将27系列和26系列存储芯片外扩16K字的ROM和8K字RAM,可以使用以下总线连接方法:
```
+------------+
| |
+---------+ +---------+
| 27系列ROM 26系列RAM |
+---------+ +---------+
A15-A0 A13-A0
D7-D0 D7-D0
/CE /CS
/OE /OE
/WE /WE
```
其中,A15-A0为地址总线,D7-D0为数据总线,/CE为ROM的片选信号,/CS为RAM的片选信号,/OE为读使能信号,/WE为写使能信号。
由于ROM存储的是ASCII文本,可以使用指令`MOVSB`直接将ROM中的内容复制到RAM中。以下是一段简单的程序实现该功能:
```
ORG 100h ; 程序从100h地址开始
ROM_START equ 0000h ; ROM起始地址
ROM_SIZE equ 4000h ; ROM大小为16K字
RAM_START equ 8000h ; RAM起始地址
RAM_SIZE equ 2000h ; RAM大小为8K字
section .text
main:
; 初始化存储芯片
mov dx, 3F0h ; 将 DX 设置为存储芯片的基地址
mov al, 80h ; 选择27系列ROM
out dx, al ; 输出控制字节
mov al, 0FFh ; 全部禁止
out dx, al ; 输出控制字节
mov al, 0A0h ; 选择26系列RAM
out dx, al ; 输出控制字节
mov al, 0FFh ; 全部禁止
out dx, al ; 输出控制字节
; 复制ROM中的内容到RAM中
mov si, ROM_START ; 将SI设置为ROM起始地址
mov di, RAM_START ; 将DI设置为RAM起始地址
mov cx, ROM_SIZE ; 将CX设置为ROM大小
cld ; 清除方向位,确保MOVSB是递增的
rep movsb ; 复制ROM到RAM
; 程序结束
hlt ; 停机
```
在程序中,首先通过控制端口向存储芯片发送控制字节,选择27系列ROM和26系列RAM,并全部禁止。然后,通过指令`MOVSB`将ROM中的内容复制到RAM中。最后,程序停机等待执行下一条指令。
阅读全文