我想知道如何构建一个简单的异步DRAM控制器。我有一些30针1MB SIMM 70ns DRAM(带奇偶校验的1Mx9)模块,我想在自制的复古计算机项目中使用。不幸的是,没有适用于他们的数据表,因此我一直在研究IBM 的Siemens HYM 91000S-70和“了解DRAM操作”。
我想要结束的基本界面是
- / CS:输入,片选
- 读/写:读,不写
- RDY:数据准备就绪时,输出为高
- D:输入/输出,8位数据总线
- 答:在20位地址总线中
刷新似乎很简单,有几种方法可以解决问题。我应该能够使用任何旧计数器进行行地址跟踪,在CPU时钟低(在该特定芯片中不进行内存访问)的情况下,进行分布式(交织)纯RAS刷新(ROR)。我相信根据JEDEC的要求,至少每64ms刷新所有行(根据Seimens数据表每8ms刷新512,即标准的周期刷新为15.6us),所以这应该工作正常,如果遇到问题,我将发布另一个问题。我对获得简单,正确的阅读和确定以及确定我应该达到的速度更感兴趣。
首先,我将快速描述一下我认为它是如何工作的以及到目前为止我提出的潜在解决方案。
基本上,您将20位地址分成两半,其中一半用于列,另一半用于行。您先选通行地址,然后选列地址,如果/ CAS变为低电平时/ W为高电平,则为读操作,否则为写操作。如果是写操作,则此时数据必须已经在数据总线上。一段时间后,如果是读操作,则表明数据可用,或者如果是写操作,则表明数据已被写入。然后,需要在与直觉相反的“预充电”期间将/ RAS和/ CAS重新设置为高电平。这样就完成了循环。
因此,基本上,这是一个跨越多个状态的过渡,每个过渡之间存在特定的特定延迟。我将其列为“表”,该表按事务的每个阶段的持续时间进行索引:
- t(ASR)= 0 ns
- / RAS:H
- / CAS:H
- A0-9:RA
- / W:高
- t(RAH)= 10 ns
- / RAS:L
- / CAS:H
- A0-9:RA
- / W:高
- t(ASC)= 0纳秒
- / RAS:L
- / CAS:H
- A0-9:CA
- / W:高
- t(CAH)= 15 ns
- / RAS:L
- / CAS:L
- A0-9:CA
- / W:高
- t(CAC)-t(CAH)=?
- / RAS:L
- / CAS:L
- A0-9:X
- / W:H(可用数据)
- t(RP)= 40ns
- / RAS:H
- / CAS:L
- A0-9:X
- / W:X
- t(CP)= 10 ns
- / RAS:H
- / CAS: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测试。