6数字设计和计算机体系结构(RISC-V 版)

数字构建模块

从位到字

寄存器文件RAMROM地址译码

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第6章 数字构建模块(从位到字)

一、导读

6.1 本章学习目标

掌握寄存器文件(Register File)的结构设计和工作原理

理解静态RAM(SRAM)和动态RAM(DRAM)的单元结构与工作差异

了解只读存储器(ROM)的类型及其在嵌入式系统中的应用

掌握地址译码(Address Decoding)的设计方法和存储器扩展技术

理解存储器的性能指标:访问时间为、吞吐量、功耗和面积

了解逻辑阵列(PLA和PAL)的基本结构和应用

学会使用这些构建模块设计完整的存储子系统

理解存储器层次结构的基本概念及其对系统性能的影响

6.2 为什么本章如此重要

前几章介绍的逻辑门、组合电路和时序元件是数字系统的"原子"级别组件。本章将这些原子组装成更高级的"分子"级别构建模块——寄存器文件、RAM、ROM和逻辑阵列。这些模块是构成完整计算机系统的基础组件,直接决定了计算机的数据存储能力和控制逻辑实现方式。

存储器是计算机体系结构中最关键的资源之一。从CPU内部的寄存器文件到主存储器(RAM),从固件存储(ROM/Flash)到高速缓存(Cache),存储器无处不在。存储器的容量、速度和功耗直接影响整个系统的性能。理解存储器的设计原理,不仅有助于设计高效的存储子系统,更重要的是为后续学习存储器层次结构、虚拟存储器等高级主题奠定基础。

此外,本章介绍的构建模块还展示了数字设计中"规模化"的思想。从一位存储单元到千位、兆位的存储器阵列,设计方法需要从关注单个元件的特性转向关注阵列的组织、译码的效率和访问的优化。这种从微观到宏观的思维方式,是数字系统设计中不可或缺的能力。

6.3 核心问题引导

寄存器文件和RAM有什么区别?为什么CPU内部使用寄存器文件而不是RAM?

SRAM和DRAM的存储单元结构有什么不同?各自的优缺点是什么?

为什么DRAM需要周期性刷新?刷新操作对系统性能有什么影响?

地址译码的两种基本方式(线性译码和二维译码)各适用于什么场景?

如何用多个小容量存储器芯片扩展为大容量存储器?字扩展和位扩展如何实现?

ROM有哪些不同类型?它们在嵌入式系统中分别用于什么目的?

可编程逻辑阵列(PLA)和可编程阵列逻辑(PAL)的结构有什么区别?


二、核心概念详解

6.1 寄存器文件

寄存器文件(Register File)是CPU内部的高速存储结构,由一组可寻址的寄存器组成。一个典型的32位RISC-V处理器包含32个32位通用寄存器(x0-x31),组成一个32×32的寄存器文件(32个寄存器,每个32位宽)。寄存器文件支持同时读取两个寄存器(通过两个读端口)和写入一个寄存器(通过一个写端口),这种配置称为2读1写(2R1W)。

寄存器文件的内部结构包含三个主要部分:存储阵列、读端口和写端口。存储阵列由32个32位的SRAM单元组成,排列成矩阵形式。读端口包含读地址译码器和读数据通路——给定读地址,译码器选中对应的寄存器,其数据通过位线(Bit Line)传送到读数据输出。由于SRAM的读操作是组合逻辑(地址到数据的通路不包含时序元件),读端口可以在同一时钟周期内提供数据。

写端口包含写地址译码器和写数据通路。在时钟上升沿,如果写使能信号有效,写数据被存入写地址指定的寄存器。寄存器文件的读写操作是独立的——可以在同一时钟周期内同时进行两个读操作和一个写操作。

寄存器文件的一个特殊设计是寄存器x0始终为0(在RISC-V中)。这简化了指令编码和硬件设计——许多需要常量0的场景可以直接引用x0,而不需要额外的立即数编码。

6.2 静态RAM(SRAM)

SRAM(Static Random Access Memory)使用触发器作为基本存储单元。一个经典的6管SRAM单元(6T SRAM Cell)由两个交叉耦合的反相器(构成一个双稳态触发器,存储1位数据)和两个访问晶体管(连接位线,控制读写操作)组成。

SRAM的读操作:首先将两条位线(BL和BLB)预充电到高电平,然后字线(Word Line)激活,访问晶体管导通。存储单元中存储0的一侧将对应的位线拉低,产生差分信号,由灵敏放大器(Sense Amplifier)检测并放大。

SRAM的写操作:字线激活后,驱动电路强制将一条位线拉高、另一条拉低,通过访问晶体管覆盖存储单元中的原有数据。写操作需要驱动电路的强度大于存储单元内部反馈的强度,以确保数据能够被成功翻转。

SRAM的优点是速度快(访问时间通常在几纳秒以内)、不需要刷新、使用简单。缺点是面积大(每个存储位需要6个晶体管)、功耗较高(待机时也有漏电流)。因此,SRAM通常用于需要高速访问的小容量存储,如CPU缓存(Cache)和寄存器文件。

6.3 动态RAM(DRAM)

DRAM(Dynamic Random Access Memory)使用电容存储电荷来表示数据。一个基本的1管1电容DRAM单元由一个访问晶体管和一个存储电容组成。电容充电到高电压表示1,放电到低电压表示0。

DRAM的优点是单元结构极其简单——每个存储位只需要1个晶体管和1个电容,面积远小于SRAM(约为SRAM的1/6到1/8)。这使得DRAM可以实现非常大的存储容量和更低的每比特成本。因此,DRAM被广泛用作计算机的主存储器。

然而,DRAM有一个根本性的缺点:存储电容上的电荷会随时间泄漏。如果不定期刷新(Refresh),数据就会丢失。刷新操作是逐行进行的——激活一行字线,将所有存储单元的数据读出并通过灵敏放大器放大后写回。整个存储阵列需要在刷新周期(通常为64ms)内完成所有行的刷新。

DRAM的访问速度比SRAM慢(访问时间通常在几十纳秒),而且读操作是破坏性的——读出数据后必须立即写回。此外,DRAM需要复杂的接口电路,包括行地址选通(RAS)、列地址选通(CAS)和刷新控制逻辑。现代DRAM通过DDR(Double Data Rate)技术在时钟的上升沿和下降沿都传输数据,显著提高了接口带宽。

6.4 ROM与存储器类型

只读存储器(Read-Only Memory,ROM)在制造时或编程后写入数据,正常工作时只能读取不能修改。ROM用于存储不需要频繁更改的数据,如引导程序、固件和查找表。

ROM有多种类型。Mask ROM在芯片制造时通过掩模工艺写入数据,一旦制造完成就不能修改,适用于大批量生产。PROM(Programmable ROM)允许用户使用专用设备编程一次,之后不能更改。EPROM(Erasable PROM)可以通过紫外线照射擦除并重新编程。EEPROM(Electrically Erasable PROM)可以通过电信号擦除和重写,但擦写速度较慢。Flash存储器是EEPROM的改进版本,支持块擦除,具有较高的密度和较快的擦写速度,是现代嵌入式系统中最重要的非易失性存储技术。

在FPGA中,配置信息通常存储在Flash或SRAM中。基于Flash的FPGA(如Xilinx Spartan系列)在掉电后保留配置,上电后自动加载。基于SRAM的FPGA(如Xilinx Virtex系列)每次上电都需要从外部Flash加载配置。

6.5 地址译码与存储器扩展

地址译码电路将输入的二进制地址转换为对应存储单元的选择信号。对于一个具有n个地址输入的存储器,地址译码器需要生成2^n个字线选择信号。

线性译码(Linear Decoding)使用一个n-to-2^n译码器,直接为每个存储行生成字线信号。这种方式结构简单,但当地址位数较多时,译码器的规模呈指数增长。例如,一个20位地址的存储器需要1-to-1M的译码器,这在物理实现上是不现实的。

二维译码(Matrix Decoding)将地址分为行地址和列地址两部分,分别用两个较小的译码器进行译码。例如,一个20位地址可以分为10位行地址和10位列地址,分别驱动1024条字线和1024条位线。存储阵列排列为1024×1024的矩阵,通过行译码器和列译码器的交叉选择确定具体的存储单元。二维译码将译码器的规模从O(2^n)降低到O(2^(n/2)),极大地减少了硬件复杂度。

当单个存储器芯片的容量不能满足需求时,可以通过扩展来增加容量。字扩展(Word Extension)增加存储字的数量:多个芯片共享地址线和控制线,每个芯片由独立的片选信号(Chip Select)控制。位扩展(Bit Extension)增加每个字的位数:多个芯片共享地址线和控制线,每个芯片提供数据的一部分,所有芯片的数据组合形成完整的字。字位同时扩展则是两种方式的组合。


三、深入分析与讨论

6.1 存储器性能指标与权衡

存储器的设计涉及多个相互制约的性能指标。访问时间(Access Time)是从发出读请求到数据可用的时间延迟。吞吐量(Throughput)是单位时间内能够完成的访问次数。功耗包括读/写操作时的动态功耗和待机时的静态功耗。面积决定了存储器的容量和成本。

这些指标之间存在根本性的权衡。SRAM速度快但面积大、功耗高;DRAM面积小、成本低但速度慢、需要刷新。大容量存储器通常速度较慢(因为位线更长、负载更大),而高速存储器通常容量较小。这种速度和容量之间的矛盾催生了存储器层次结构的概念——使用多级存储器(寄存器→L1 Cache→L2 Cache→主存→磁盘)在成本和性能之间取得平衡。

在嵌入式系统中,功耗往往是最重要的约束。存储器子系统的功耗优化技术包括:时钟门控(Clock Gating)在不访问时关闭存储器时钟;分区访问(Banked Access)只激活被访问的存储分区;低电压操作降低动态功耗。

6.2 存储器接口与现代DRAM技术

现代计算机系统中,CPU和主存之间的接口设计至关重要。DDR SDRAM(Double Data Rate Synchronous DRAM)是目前最广泛使用的主存技术。DDR通过以下技术提高性能:在时钟的上升沿和下降沿都传输数据(双倍速率);使用突发传输(Burst Transfer)连续传输多个数据字;使用流水线操作重叠行激活、列读写和预充电操作。

DDR的代际演进(DDR→DDR2→DDR3→DDR4→DDR5)主要通过以下方式提升性能:提高时钟频率、增加预取宽度(Prefetch Width)、降低供电电压、增加Bank数量。每一代DDR都提高了带宽和容量,同时降低了每比特的成本和功耗。


四、实践案例

6.1 案例一:32×32寄存器文件的Verilog实现

verilog
module regfile #(
  parameter WIDTH = 32,
  parameter DEPTH = 32,
  parameter ADDR_BITS = 5
) (
  input wire clk,
  input wire we,
  input wire [ADDR_BITS-1:0] ra1, ra2, wa,
  input wire [WIDTH-1:0] wd,
  output wire [WIDTH-1:0] rd1, rd2
);
  reg [WIDTH-1:0] rf [0:DEPTH-1];

  assign rd1 = (ra1 == 0) ? 0 : rf[ra1];
  assign rd2 = (ra2 == 0) ? 0 : rf[ra2];

  always @(posedge clk) begin
    if (we && wa != 0)
      rf[wa] <= wd;
  end
endmodule

这个设计实现了RISC-V的32位寄存器文件。读操作是组合逻辑(assign语句),写操作是时序逻辑(always块)。x0寄存器始终返回0,写操作被忽略。

6.2 案例二:存储器字扩展设计

假设需要用4片64K×8位的SRAM芯片构建一个256K×8位的存储器。每片芯片有16位地址线(A0-A15)、8位数据线(D0-D7)和片选信号(CS)。

设计方案:4片芯片共享16位地址线和8位数据线。使用一个2-to-4译码器,输入为地址的高2位(A16-A17),输出分别连接到4片芯片的CS信号。当A16A17=00时选中第0片(地址0x00000-0x0FFFF),01时选中第1片(0x10000-0x1FFFF),10时选中第2片(0x20000-0x2FFFF),11时选中第3片(0x30000-0x3FFFF)。

这种字扩展方式将存储容量从64K扩展到256K,而每个字的位宽保持8位不变。地址空间连续,CPU可以直接通过18位地址访问全部256K字节。


五、常见误区与注意事项

5.1 误区一:混淆SRAM和DRAM的应用场景

SRAM速度快、不需要刷新,但面积大、成本高,适合小容量高速缓存。DRAM容量大、成本低,但速度慢、需要刷新,适合大容量主存。在CPU设计中,Cache使用SRAM,主存使用DRAM。不能简单地说"SRAM比DRAM好"——它们各有适用的场景。

5.2 误区二:忽视存储器的读/写冲突

当同一时钟周期内对同一地址进行读和写操作时,结果取决于存储器的具体实现。某些存储器保证写优先(读出旧数据),某些可能产生不确定的结果。在寄存器文件中,如果读地址和写地址相同,通常设计为读出写入的新数据(写穿读,Write-Through Read)。设计者需要明确了解所用存储器的读/写冲突处理策略。

5.3 误区三:地址译码中忽视片选逻辑

在多芯片扩展的存储器系统中,片选(Chip Select)信号的正确生成至关重要。如果片选逻辑有误,可能导致多个芯片同时被选中(数据冲突)或没有芯片被选中(总线浮空)。地址译码器必须覆盖完整的地址空间,且各芯片的地址范围不能重叠。

5.4 误区四:认为ROM完全不可修改

虽然ROM在正常工作时只能读取,但某些类型的ROM(如EEPROM和Flash)可以通过特殊操作进行擦除和重写。在嵌入式系统中,Flash存储器常用于存储固件,支持现场升级。区分不同类型的ROM特性,对于系统设计非常重要。


六、本章小结

本章介绍了构成数字系统的重要构建模块。寄存器文件为CPU提供了高速的数据暂存能力,SRAM和DRAM分别适用于高速小容量和大容量低速的存储场景,ROM用于存储固件和不可变数据。地址译码技术实现了高效的存储访问,存储器扩展技术解决了容量不足的问题。这些构建模块是搭建完整计算机系统的基石,理解它们的设计原理和性能特性,对于后续学习存储器层次结构和处理器设计具有重要的基础作用。


七、思考题与练习

设计一个16×8的寄存器文件(16个8位寄存器),具有2个读端口和1个写端口。画出内部结构框图。

比较6T SRAM单元和1T1C DRAM单元在面积、速度、功耗和数据保持方面的差异。

解释为什么DRAM需要刷新操作。如果一个DRAM阵列有8192行,刷新周期为64ms,计算刷新操作占用的时间比例(假设每行刷新需要100ns)。

用4片16K×4的SRAM芯片设计一个32K×8的存储器。说明地址线的连接方式和片选逻辑。

比较线性译码和二维译码的优缺点。对于一个22位地址的存储器,两种译码方式分别需要多少译码门输入?

解释Flash存储器的工作原理。与EEPROM相比,Flash有哪些优势和限制?

设计一个4×4的ROM,存储以下函数表:F(0)=1010, F(1)=0110, F(2)=1100, F(3)=0011。画出ROM的内部结构。

讨论存储器层次结构的基本原理。为什么不能只用一种类型的存储器来满足所有需求?

6/8数字构建
0%