存储器地址寄存器 (MAR)
概述
- 用途:存储器地址寄存器 (MAR) 是一个 8 位寄存器,用于保存读/写操作的内存地址。它充当 CPU 内部地址源(程序计数器、指令寄存器)与外部内存地址总线之间的缓冲器,实现正确的时序和地址信号隔离。
- 符号:MAR 以矩形方块表示,具有 8 位数据输入总线、时钟 (CLK) 输入、加载使能 (LD) 控制信号和 8 位地址输出总线。
- DigiSim.io 角色:在 CPU 设计中不可或缺的组件,将地址生成与内存访问分离,实现正确的总线时序,并支持 8 位计算机架构中的复杂寻址模式。

功能描述
逻辑行为
存储器地址寄存器在 CLK 信号上升沿 且 加载使能 (LD) 为 HIGH 时锁存一个 8 位地址值。此设计与 DigiSim 8 位计算机架构中的其他同步寄存器保持一致。一旦锁存,地址将持续驱动到输出引脚,直到加载新地址。与三态组件不同,MAR 始终驱动其输出。
功能表:
| CLK 边沿 | LD | 操作 | A0-A7 输出 |
|---|---|---|---|
| ↑ | 1 | 锁存新地址 | D0-D7 输入数据 |
| ↑ | 0 | 保持 | 先前地址 |
| - | X | 保持 | 先前地址 |
注:↑ 表示 CLK 信号的上升沿 LD 必须在时钟上升沿时为 HIGH 才能锁存新数据 输出始终被驱动(非三态),以确保地址总线稳定
输入和输出
输入(共 10 个):
- D0-D7[7:0]:8 位数据输入(总线输入),用于加载新地址。这些被配置为总线输入,允许多个源通过三态缓冲器驱动它们。
- CLK:时钟输入(上升沿触发)。当 LD 为 HIGH 时,数据在 CLK 上升沿锁存。
- LD:1 位加载使能输入(电平敏感)。必须在 CLK 上升沿时为 HIGH 才能锁存新数据。
输出(共 8 个):
- A0-A7[7:0]:8 位地址输出,连接到存储器组件(RAM/ROM)。这些输出始终被驱动(非三态)。
引脚布局
输入引脚(左侧):
- 引脚 0-7:D0-D7(数据/地址输入 - 总线输入)
- 引脚 8:CLK(时钟 - 上升沿触发)
- 引脚 9:LD(加载使能 - 电平敏感)
输出引脚(右侧):
- 引脚 0-7:A0-A7(地址输出至存储器)
可配置参数
- 初始值:上电时的地址值(通常为 0x00)。
- 边沿敏感性:在 CLK 信号上升沿触发(当 LD 为 HIGH 时)。
- 传播延迟:从 CLK 上升沿到输出稳定的时间。
DigiSim.io 中的视觉表示
存储器地址寄存器显示为矩形方块(128×192 像素,8×12 网格),包含:
- 左侧 8 个数据输入引脚(D0-D7),relativeY:0.16667 至 0.75
- 1 个时钟输入引脚(CLK),relativeY:0.83333
- 1 个加载使能引脚(LD),relativeY:0.91667
- 右侧 8 个地址输出引脚(A0-A7),relativeY:0.25 至 0.83333
组件标签 "MAR" 显示在中心,"ADDR" 表示其作为地址寄存器的角色。输入引脚标记为总线输入,以较粗的连接点表示,可以接受多个三态驱动器。
教育价值
核心概念
- 地址缓冲:演示地址如何与其来源隔离以实现正确的总线时序。
- 边沿触发锁存:展示数据如何在时钟/控制信号边沿被捕获。
- 总线架构:说明 CPU 设计中地址总线和数据总线的分离。
- 内存寻址:计算机架构中的基本概念。
- 流水线级:MAR 代表取指-译码-执行流水线中的一个级。
学习目标
- 理解地址寄存器在内存操作中的作用。
- 学习地址缓冲如何实现复杂的内存访问模式。
- 认识内存地址建立和保持的时序要求。
- 将 MAR 概念应用于设计 CPU 内存接口。
- 理解多个地址源(PC、IR、ALU)如何共享单一内存地址总线。
使用示例
- 指令获取:在从 ROM/RAM 获取指令之前,将 PC 值加载到 MAR 中。
- 数据加载/存储:将 IR 中的操作数地址加载到 MAR 中以进行数据内存访问。
- 间接寻址:将 ALU 计算的地址加载用于基于指针的访问。
- 栈操作:加载栈指针值用于压栈/弹栈操作。
- DMA 操作:外部地址源可以加载值用于直接内存访问。
在 8 位计算机中的集成
在 DigiSim 8 位计算机架构中,MAR 作为中央地址缓冲器:
┌─────────────────────────────────────────────────────────────┐
│ 地址源 │
│ ┌────────┐ ┌─────────────────┐ ┌──────────────┐ │
│ │ PC │ │ IR │ │ ALU │ │
│ │ (8-bit)│ │ (4-bit address) │ │ (computed) │ │
│ └───┬────┘ └───────┬─────────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 三态缓冲器 │ │
│ │ (由控制单元控制) │ │
│ └───────────────────────┬───────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ │
│ │ MAR │◄──── LD (来自 CU) │
│ │ (8-bit) │ │
│ └─────┬─────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ RAM / ROM │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
控制信号
控制单元在特定的微代码步骤中生成 MAR_LD 信号:
- FETCH 状态:加载 PC 值以读取下一条指令(MAR_LD=1,在 CLK 上升沿时)
- EXECUTE 状态:加载操作数地址用于内存操作(MAR_LD=1,在 CLK 上升沿时)
CLK 信号是与所有同步组件共享的系统时钟。
技术说明
- MAR 支持完整的 8 位寻址(256 字节),相比指令寄存器的 4 位地址输出。
- 总线输入允许多个三态源连接,无需显式多路复用。
- 上升沿时钟触发确保地址切换时无毛刺。
- 输出始终被驱动,以在内存访问期间保持地址总线稳定。
- MAR 应在断言内存读/写信号之前被加载。
- 在时序关键的设计中应考虑传播延迟。
- 时钟输入(CLK)使 MAR 与其他 CPU 组件同步。
相关组件
- 程序计数器 (PC):指令获取期间的主要地址来源。
- 指令寄存器 (IR):为内存操作提供操作数地址。
- RAM:由 MAR 输出寻址的随机存取存储器。
- ROM:由 MAR 输出寻址的只读存储器。
- 控制单元:在适当时机生成 LD 信号。
- 数据总线:用于与内存之间数据传输的独立总线。
- 三态缓冲器:用于将不同地址源接入 MAR 输入。