如何实现一个非常简单的异步 DRAM 控制器?

电器工程 记忆 定时 德拉姆 7400
2022-01-16 09:54:56

我想知道如何构建一个简单的异步 DRAM 控制器。我有一些 30 针 1MB SIMM 70ns DRAM(1Mx9 带奇偶校验)模块,我想在自制复古计算机项目中使用它们。不幸的是,他们没有数据表,所以我一直从Siemens HYM 91000S-70和IBM 的“Understanding DRAM Operation”开始。

我想最终得到的基本界面是

  • /CS:输入,片选
  • R/W:输入,读/不写
  • RDY:输出,数据准备好时为高电平
  • D:输入/输出,8位数据总线
  • A:in,20位地址总线

刷新似乎很简单,有几种方法可以让它正确。我应该能够在 CPU 时钟低(在此特定芯片中没有进行内存访问)期间使用任何旧计数器进行行地址跟踪,从而进行分布式(交错)仅 RAS 刷新(ROR)。我相信所有行都需要根据 JEDEC 至少每 64 毫秒刷新一次(根据 Seimens 数据表,每 8 毫秒 512 次,即周期/15.6us 的标准刷新),所以这应该可以正常工作,如果我遇到困难,我会发布另一个问题。我更感兴趣的是让读写变得简单、正确,并确定我对速度的期望。

我将首先快速描述我认为它是如何工作的以及到目前为止我提出的潜在解决方案。

基本上,您将一个 20 位地址分成两半,一半用于列,另一半用于行。您选通行地址,然后是列地址,如果 /CAS 变低时 /W 为高,则为读,否则为写。如果是写入,则此时数据需要已经在数据总线上。一段时间后,如果是读取,则数据可用;如果是写入,则数据肯定已被写入。然后 /RAS 和 /CAS 需要在违反直觉的“预充电”期间再次变为高电平。这样就完成了循环。

所以,基本上它是通过几个状态的转换,每个转换之间的特定延迟不统一。我将其列为一个“表格”,按交易每个阶段的持续时间进行索引:

  1. t(ASR) = 0ns
    • /RAS:H
    • /现金
    • A0-9:RA
    • /W:H
  2. t(RAH) = 10ns
    • /RAS:L
    • /现金
    • A0-9:RA
    • /W:H
  3. t(ASC) = 0ns
    • /RAS:L
    • /现金
    • A0-9:加州
    • /W:H
  4. t(CAH) = 15ns
    • /RAS:L
    • /CAS:大号
    • A0-9:加州
    • /W:H
  5. t(CAC) - t(CAH) = ?
    • /RAS:L
    • /CAS:大号
    • A0-9: X
    • /W:H(可用数据)
  6. t(RP) = 40ns
    • /RAS:H
    • /CAS:大号
    • A0-9: X
    • /W:X
  7. t(CP) = 10ns
    • /RAS:H
    • /现金
    • A0-9: X
    • /W:X

我所指的时间如下图所示。

时序图

(CA = 列地址,RA = 行地址,X = 无关)

即使它不完全是那样,它也是那样的,我认为同样的解决方案会起作用。所以到目前为止我已经提出了几个想法,但我认为只有最后一个有潜力,我正在寻找更好的想法。我在这里忽略了刷新、快速页面和奇偶校验/生成。

最简单的解决方案是使用一个计数器和一个 ROM,其中计数器输出是 ROM 地址输入,每个字节在地址对应的时间段内都有适当的状态输出。这不起作用,因为 ROM 很慢。即使是预装的 SRAM 似乎也太慢了,不值得。

第二个想法是使用 GAL16V8 或其他东西,但我认为我对它们的理解不够好,程序员非常昂贵,而且据我所知,编程软件是封闭源代码和仅限 Windows 的。

我的最后一个想法是我认为唯一可行的。74ACT 逻辑系列具有低传播延迟并接受高时钟频率。我想读写可以用一些CD74ACT164E移位寄存器和SN74ACT573N来完成。

基本上,每个独特的状态都有自己的锁存器,使用 5V 和 GND 轨进行静态编程。每个移位寄存器输出到一个锁存器的 /OE 引脚。如果我对数据表的理解正确,每个状态之间的延迟只能是 1/SCLK,但这比 PROM 或 74HC 解决方案要好得多。

那么,最后一种方法可能奏效吗?有没有更快、更小或通常更好的方法来做到这一点?我想我看到 IBM PC/XT 将 7400 芯片用于与 DRAM 相关的东西,但我只看到了顶板照片,所以我不确定它是如何工作的。

ps 我希望这在 DIP 中是可行的,而不是使用 FPGA 或现代 uC“作弊”。

pps 也许直接使用门延迟和相同的锁存方法是一个更好的主意。我意识到移位寄存器和直接门/传播延迟方法都会随温度而变化,但我接受这一点。

对于将来发现这一点的任何人, Bil Herd 和 André Fachat 之间的讨论涵盖了该线程中提到的几个设计,并讨论了包括 DRAM 测试在内的其他问题。

3个回答

IBM Personal Computer XT 技术参考手册(附录 D)中有 IBM PC/XT 的完整原理图,您可以在网上找到。

这里的问题是,给定一条在内存读取或写入时激活的选通线,您希望为地址多路复用器生成 RAS、CAS 和控制线(称为 MUX)。为简单起见,我将不切实际地假设选通、RAS 和 CAS 都是高电平有效。

看了一下PC/XT的原理图和这段时间其他一些电脑的原理图,我看到了三个基本的策略,大致如下:

  • 为 RAS 使用频闪灯。在 RAS 上使用延迟线(其输出是其输入的延时版本的部分)生成 MUX,并使用另一条延迟线生成更晚版本的 RAS,用于 CAS。PC/XT 和 TRS-80 Model II 使用了这种策略。

    一个示例(现代)延迟线部件是 Maxim DS1100。

  • RAS 使用选通,MUX 和 CAS 使用延迟,但使用高速移位寄存器而不是延迟线来执行此操作。TRS-80 Model I 和 Apple II 使用了这种策略。

  • 使用定制 IC。这就是 Commodore 64 的策略。

你的问题很复杂,我什至不确定你的实际问题是什么,但我会试试的!

我能找到的“最干净”的基于 6502 的 DRAM 设计来自Commodore PET 2001-N它有一个以 1 MHz 运行的 6502,但 DRAM 逻辑的时钟频率为 16 MHz,可能会生成所有时序。

我没有分析细节,但主要动作似乎发生在连接到 74164 移位寄存器的 74191 4 位计数器上。这会输出 8 条单独的线路进入由 R/W 线路控制的 74157 MUX。MUX 的输出进入 7474 触发器和一些离散逻辑以生成最终的 RAS/CAS 信号。这是一个摘录,链接到参考示意图中的相关页面。

PET 2001-N 参考第 6 页

刷新由一个单独的计数器处理,每条地址线都连接到一个选择“真实”地址或刷新地址的多路复用器。

该逻辑的一部分似乎也为视频子系统生成计时。我确信它可以根据您的特定需求进行简化,但我认为类似的东西可能很有用:高频计数器、移位寄存器和多路复用器。

ps 我希望这在 DIP 中是可行的,而不是使用 FPGA 或现代 uC“作弊”。

虽然我完全理解您项目的精神和您使用非花哨部件的愿望,但如果我是您,我肯定会采用 FPGA 方式。

几个原因:

  1. 这是一个完美的学习机会。设计 DRAM 控制器不是一个“hello-world”项目,之后您可以自信地说您“可以”FPGA;
  2. 您可以从该内存中榨取所有性能,特别是如果它是较旧的 DRAM 芯片。您不仅拥有自制的基于 6502 的 PC,还可能拥有最快的基于 6502 的 PC;
  3. 调试问题或统计 CPU 发出的内存操作会容易得多。您可以在并行总线上使用逻辑分析仪,但这并不好玩(我的一个朋友做了一些类似的事情 - 他想编写一个 8088 的周期精确模拟,因此他需要收集有关内存访问和时序的统计数据模式。他使用原始芯片组(8288、8280、8237)并使用具有很多通道的逻辑分析仪,但根据他的经验我可以告诉你这一个拖累)。