Çok basit bir asenkron DRAM denetleyicisini nasıl uygulayabilirim?


9

Çıplak kemik asenkron DRAM kontrolörünün nasıl inşa edileceğini bilmek istiyorum. Homebrew retro bilgisayar projesinde kullanmak istediğim bazı 30 pimli 1MB SIMM 70ns DRAM (eşlikli 1Mx9) modüllerim var. Ne yazık ki onlar için bir veri sayfası yok, bu yüzden IBM tarafından üretilen Siemens HYM 91000S-70 ve "DRAM Operasyonunu Anlamak" a gidiyorum .

Sonlandırmak istediğim temel arayüz

  • / CS: giriş, yonga seçimi
  • R / W: giriş, okuma / yazma
  • RDY: dışarı, veri hazır olduğunda YÜKSEK
  • D: giriş / çıkış, 8 bit veri yolu
  • A: içinde, 20 bit adres veriyolu

Yenileme, doğru yapmanın birkaç yolu ile oldukça basit görünüyor. Satır adresi izleme için herhangi bir eski sayacı kullanarak CPU saati DÜŞÜK (bu özel yongada bellek erişimi yapılmadığında) sırasında dağıtılmış (serpiştirilmiş) yalnızca RAS yenileme (ROR) yapabilmeliyim. Tüm satırların JEDEC'e göre (Seimens veri sayfasına göre 8ms'de 512 yani standart döngü / 15.6us'a göre) en azından her 64ms'de bir yenilenmesi gerektiğine inanıyorum, bu yüzden bu iyi çalışmalı ve sıkışırsam, gönderirim başka bir soru. Daha hızlı okuma ve yazma ile ilgileniyorum, hıza göre ne beklemem gerektiğine karar veriyorum.

Önce nasıl çalıştığını düşündüğümü ve şimdiye kadar ortaya koyduğum potansiyel çözümleri hızlı bir şekilde anlatacağım.

Temel olarak, sütun için bir yarısı ve diğeri için satır kullanarak 20 bitlik bir adresi ikiye böldünüz. / CAS DÜŞÜK olduğunda / W YÜKSEK ise satır adresini ve ardından sütun adresini çakarsınız, bu durumda bir okuma, aksi takdirde bir yazmadır. Bu bir yazma ise, verilerin o noktaya kadar veri yolunda olması gerekir. Bir süre sonra, eğer bir okuma ise, veriler kullanılabilir veya bir yazma ise, verilerin yazıldığından emin olabilirsiniz. Sonra sezgisel olarak adlandırılan "ön şarj" döneminde / RAS ve / CAS tekrar YÜKSEK getirilmelidir. Bu döngüyü tamamlar.

Yani, temel olarak, her geçiş arasında tekdüze olmayan belirli gecikmelerle birkaç durum boyunca bir geçiş. Ben sırayla işlemin her aşamasının süresine göre dizine "tablo" olarak listeledim:

  1. t (ASR) = 0ns
    • /DÖKÜNTÜ
    • /NAKİT
    • A0-9: RA
    • / W: H
  2. t (RAH) = 10ns
    • / RAS: L
    • /NAKİT
    • A0-9: RA
    • / W: H
  3. t (ASC) = 0ns
    • / RAS: L
    • /NAKİT
    • A0-9: CA
    • / W: H
  4. t (CAH) = 15ns
    • / RAS: L
    • / CAS: L
    • A0-9: CA
    • / W: H
  5. t (CAC) - t (CAH) =?
    • / RAS: L
    • / CAS: L
    • A0-9: X
    • / W: H (veriler mevcut)
  6. t (RP) = 40ns
    • /DÖKÜNTÜ
    • / CAS: L
    • A0-9: X
    • / W: X
  7. t (CP) = 10ns
    • /DÖKÜNTÜ
    • /NAKİT
    • A0-9: X
    • / W: X

Bahsettiğim zamanlar aşağıdaki diyagramda.

zamanlama diyagramı

(CA = sütun adresi, RA = satır adresi, X = umrumda değil)

Tam olarak böyle olmasa bile, böyle bir şey ve bence aynı tür bir çözüm işe yarayacak. Bu yüzden şimdiye kadar birkaç fikir buldum ama bence sadece sonuncusu potansiyel var ve daha iyi fikirler arıyorum. Ben burada serinletici, Hızlı Sayfa ve Parite Denetimi / Oluşturma görmezden geliyor.

En basit çözüm sadece bir sayaç ve sayaç çıkışının ROM adres girişi olduğu ve her baytın adresin karşılık geldiği zaman dilimi için uygun durum çıkışına sahip olduğu bir ROM kullanmaktır. ROM'lar yavaş olduğu için bu çalışmaz. Önceden yüklenmiş bir SRAM bile buna değmeyecek kadar yavaş olurdu.

İkinci fikir bir GAL16V8 falan kullanmaktı ama onları yeterince iyi anladığımı sanmıyorum, programcılar çok pahalı ve programlama yazılımı bildiğim kadarıyla kapalı kaynak ve Windows.

Son fikrim aslında işe yarayabileceğini düşündüğüm tek şey. 74ACT mantık ailesi düşük yayılma gecikmelerine sahiptir ve yüksek saat frekanslarını kabul eder. Okuma ve yazma bazı CD74ACT164E shift register ve SN74ACT573N ile yapılabilir düşünüyorum .

Temel olarak, her benzersiz durum 5V ve GND rayları kullanılarak statik olarak programlanmış kendi mandalını alır. Her kaydırma yazmacı çıkışı bir mandalın / OE pinine gider. Veri sayfalarını doğru anlarsam, her durum arasındaki gecikme sadece 1 / SCLK olabilir, ancak bu bir PROM veya 74HC çözümünden çok daha iyidir.

Peki, son yaklaşımın işe yaraması muhtemel mi? Bunu yapmanın daha hızlı, daha küçük veya daha iyi bir yolu var mı? IBM PC / XT'nin DRAM ile ilgili bir şey için 7400 yonga kullandığını gördüm, ancak sadece üst düzey fotoğraflar gördüm, bu yüzden nasıl çalıştığından emin değilim.

ps Bunu DIP yapılabilir ve bir FPGA veya modern uC kullanarak "hile" değil istiyorum.

pps Belki kapı gecikmesini aynı mandal yaklaşımıyla doğrudan kullanmak daha iyi bir fikirdir. Hem kaydırma yazmacı hem de doğrudan kapı / yayılma gecikme yöntemlerinin sıcaklığa göre değişeceğini biliyorum ama bunu kabul ediyorum.

Gelecekte bunu bulan herkes için Bil Herd ve André Fachat arasındaki bu tartışma , bu konuda adı geçen tasarımlardan birkaçını kapsar ve DRAM testi de dahil olmak üzere diğer sorunları tartışır.


1
Retro bilgisayarınız hangi CPU'yu kullanacak?
İsimsiz

6502, bellek açıkça banka olacak.
Anthony

Sizin için bisiklet icat etmemek mümkün mü, DRAM kullanan zaten mevcut tasarımlar var mı? Bu makine ailesine aşina değilim, ancak C64 iyi bir eşleşme olmalı. Ancak orijinal olarak RAM'i kontrol etmek için 6567 "VIC" yongasını kullanıyor. Ama yine de, eminim o zamandan beri yapmak istediklerinizle ilgili projeler vardı.
İsimsiz

3
Biraz çarpık bir öneri: Z80'de yenileme mantığını işlemek için yeterli DRAM denetleyicisi vardı. (Yine de adres çoklayıcısına ihtiyacınız var)
Brian Drummond

3
@BrianDrummond Lütfen, karanlık tarafa gitmenizi önermeyin. Bundan iyi bir şey çıkamaz.
boru

Yanıtlar:


6

IBM Kişisel Bilgisayar XT teknik başvuru kılavuzunda (Ek D), IBM PC / XT için çevrimiçi olarak bulabileceğiniz tam şemalar bulunmaktadır.

Buradaki sorun, bir bellek okuma veya yazma üzerine etkinleştirilen bir flaş hattı verildiğinde, adres çoklayıcı için RAS, CAS ve bir kontrol hattı (MUX olarak adlandırın) oluşturmak istediğinizdir. Basitlik için, gerçekçi olmayan bir şekilde stroboskop, RAS ve CAS'ın aktif-yüksek olduğunu varsayacağım.

Bu süre zarfında diğer bazı bilgisayarlardan PC / XT şemasına ve şemalarına baktığımda, kabaca aşağıdaki olan üç temel strateji görüyorum:

  • Strobu RAS için kullanın. MUX oluşturmak için RAS üzerinde bir gecikme satırı (çıkışı girdisinin zaman gecikmeli bir versiyonu olan bir parça) kullanın ve CAS için kullanılan daha sonraki bir RAS sürümünü oluşturmak için başka bir gecikme satırı kullanın. Bu strateji PC / XT ve TRS-80 Model II tarafından kullanılır.

    Örnek (modern) gecikme hattı kısmı Maxim DS1100'dür.

  • Strobu RAS için kullanın ve MUX ve CAS için geciktirin, ancak bunu gecikme hattı yerine yüksek hızlı bir kaydırma yazmacı kullanarak yapın. Bu strateji TRS-80 Model I ve Apple II tarafından kullanılmaktadır.

  • Özel IC'ler kullanın. Bu Commodore 64'ün stratejisidir.


Görünüşe göre, dün Ek D olmadan sadece bir XT TR buldum. Şimdi anladım, bu harika. Bu gecikme hattı IC'lerinin var olduğunu bilmiyordum ve sıcaklıkla nasıl başa çıktıklarını merak ediyordum. Modern örnekten bahsettiğiniz için teşekkür ederiz. Birden fazla çözüm için +1.
Anthony

5

Sorunuz, asıl probleminizin ne olduğundan bile emin olamayacağım kadar karmaşık, ama deneyeceğim!

Bulabildiğim "en temiz" 6502 tabanlı DRAM tasarımı Commodore PET 2001-N'den . 1 MHz'de çalışan bir 6502'ye sahiptir, ancak DRAM mantığı 16 MHz'de saatlidir ve muhtemelen tüm zamanlamaları oluşturur.

Ayrıntıları analiz etmedim, ancak ana eylem, 74164 vardiya kaydına bağlı 74191 4 bitlik bir sayaçla gerçekleşiyor gibi görünüyor. Bu, R / W hattı tarafından kontrol edilen 74157 MUX'a giden 8 ayrı hat çıkışı sağlar. MUX çıktısı, son RAS / CAS sinyallerini üretmek için bir 7474 flip-flop ve bazı ayrık mantığa girer. İşte referans şemasındaki ilgili sayfaya bağlantı veren bir alıntı.

PET 2001-N referans sayfası 6

Yenileme ayrı bir sayaçla işlenir ve her adres satırı, "gerçek" adresi veya yenileme adresini seçen bir çoklayıcıya bağlanır.

Bu mantığın bazı bölümleri de video alt sistemi için zamanlamalar oluşturuyor gibi görünüyor. Özel ihtiyaçlarınız için basitleştirilebileceğinden eminim, ancak benzer bir şeyin yararlı olabileceğini düşünüyorum: Yüksek frekanslı bir sayaç, vardiya kaydı ve çoklayıcılar.


Ben de böyle düşünüyordum ama MUX ya da iki yerine birden fazla mandal beyin fırtınası yapacak kadar aptaldım. 16Mhz saat beni kapattı çünkü a) garip bulduğum CPU saatinden çok daha yüksek ama mantıklı ve b) Fazlar en az ~ 62ns artı yavaş olduğunu düşündüğüm yayılım gecikmeleri olabilir ama şimdi ben IBM IBM / XT ile aynı sırada olduğunu görün.
Anthony

Apple II, çekişme olmadan alternatif yarım döngülerde CPU ve video arasında zamanlama ve bellek paylaşımı için 14.318 MHz video saatini kullanarak çok benzer. Ayrı bir yenileme sayacı bile gerekmez, çünkü video yenileme etkinliği belleği de yenilemeye yarar.
Dave Tweed

-2

ps Bunu DIP yapılabilir ve bir FPGA veya modern uC kullanarak "hile" değil istiyorum.

Tamamen projeniz ve non-fantezi parçalarını kullanmak için arzu ruhunu anlamakla birlikte, kesinlikle FPGA yol gider senin yerinde olsaydım .

Birkaç neden:

  1. Mükemmel bir öğrenme fırsatıdır. Bir DRAM denetleyicisi tasarlamak bir "merhaba dünya" projesi değildir ve bundan sonra FPGA'yı "yapabileceğinizi" güvenle söyleyebilirsiniz;
  2. Özellikle eski bir DRAM yongasıysa, her bellek performansını bu bellekten sıkıştırabilirsiniz. Sadece evinizdeki 6502 tabanlı PC'nize sahip olmakla kalmaz, aynı zamanda en hızlı 6502 tabanlı PC'niz de olabilir;
  3. CPU'nuzun verdiği bellek işlemleriyle ilgili sorunları ayıklamak veya istatistik yapmak çok daha kolay olabilir. Paralel veriyollarında mantık analizörleri kullanabilirsiniz, ancak asla eğlenceli değildir (bir arkadaşım bu hatlar boyunca bir şeyler yapar - 8088'lik bir döngü kesin simülasyonu yazmak istiyor ve bu nedenle bellek erişimi ve zamanlama hakkındaki istatistikleri toplaması gerekiyor. kalıpları. o orjinal yonga seti (8288, 8280, 8237) kullanan ve kanallar bir sürü bir mantık analizörü kullanır ama onun deneyimlerinden ben söyleyebilirim olan ) bir sürükle.

2
Bunun bir yorum yerine nasıl bir cevap olduğundan emin değilim. 1) FPGA'ları öğrenmek istediğini söylemiyor. 2) 80'lerden DRAM'lar ayrık mantık için yeterince yavaştır. 3) Hata ayıklama zor olabilir. Neden her şeyi FPGA'da, hatta sadece yazılımda uygulamıyorsunuz? Neden hatta tümden RAM kullanmak ... :)
boru

1
@pipes: Evet, kesinlikle. Şu anda FPGA'ları öğrenmek için zaman harcamak istemiyorum. İkinci bir ilgisiz analog projeyle plakamda yeterince var. FPGA'lar ve PLD'ler, bir gün onları nasıl kullanacağımı öğrensem de, bu noktada yol aldıklarını düşünüyorlar.
Anthony

1
@pipe: Levhaları yeniden kablolamak, özellikle de özellikle yetenekli değilse, genellikle zor, zaman alıcı ve sinir bozucudur. Tasarımın bazı bölümleri için oldukça basit bazı PLD'lerin (örn. 22V10) kullanılması, bazı şeylerin düzeltilmesini kolaylaştıracaktır.
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.