Bagaimana saya bisa mengimplementasikan kontroler DRAM asinkron yang sangat sederhana?


9

Saya ingin tahu cara membuat DRAM asynchronous controller tanpa tulang. Saya memiliki beberapa modul 30-pin 1MB SIMM 70ns DRAM (1Mx9 with parity) yang ingin saya gunakan dalam proyek komputer retro homebrew. Sayangnya tidak ada datasheet untuk mereka, jadi saya sudah pergi dari Siemens HYM 91000S-70 dan "Memahami Operasi DRAM" oleh IBM.

Antarmuka dasar yang ingin saya gunakan adalah

  • / CS: dalam, pilih chip
  • R / W: dalam, baca / tidak tulis
  • RDY: out, HIGH ketika data siap
  • D: masuk / keluar, bus data 8-bit
  • A: in, bus alamat 20-bit

Refresh tampaknya cukup mudah dengan beberapa cara untuk memperbaikinya. Saya harus dapat melakukan refresh (interleaved) RAS-only refreshing (ROR) selama jam CPU RENDAH (di mana tidak ada akses memori dilakukan dalam chip khusus ini) menggunakan penghitung lama untuk pelacakan alamat baris. Saya percaya semua baris perlu di-refresh setidaknya setiap 64ms menurut JEDEC (512 per 8ms menurut datasheetm Seimens yaitu standar refresh of cycle / 15.6us), jadi ini seharusnya berfungsi dengan baik dan jika saya macet, saya akan posting pertanyaan lain. Saya lebih tertarik membaca dan menulis sederhana, benar, dan menentukan apa yang harus saya harapkan sejauh kecepatan.

Saya pertama-tama akan dengan cepat menggambarkan bagaimana saya pikir itu bekerja dan solusi potensial yang saya buat sejauh ini.

Pada dasarnya, Anda membagi alamat 20-bit menjadi dua, menggunakan satu setengah untuk kolom dan yang lainnya untuk baris. Anda strobe alamat baris, maka alamat kolom, jika / W adalah TINGGI ketika / CAS menjadi RENDAH maka itu adalah membaca, jika tidak itu adalah menulis. Jika itu adalah sebuah penulisan, data harus sudah ada di bus data pada saat itu. Setelah jangka waktu tertentu, jika sudah dibaca maka data tersedia atau jika ini adalah sebuah penulisan, data pasti telah ditulis. Maka / RAS dan / CAS harus dibawa TINGGI lagi dalam periode "precharge" kontra-intuitif bernama. Ini melengkapi siklus.

Jadi, pada dasarnya ini adalah transisi melalui beberapa negara dengan penundaan spesifik yang tidak seragam antara setiap transisi. Saya telah mencantumkannya sebagai "tabel" yang diindeks oleh durasi setiap fase transaksi secara berurutan:

  1. t (ASR) = 0ns
    • / RAS: H
    • /TUNAI
    • A0-9: RA
    • / W: H
  2. t (RAH) = 10ns
    • / RAS: L
    • /TUNAI
    • A0-9: RA
    • / W: H
  3. t (ASC) = 0ns
    • / RAS: L
    • /TUNAI
    • 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 (data tersedia)
  6. t (RP) = 40ns
    • / RAS: H
    • / CAS: L
    • A0-9: X
    • / W: X
  7. t (CP) = 10ns
    • / RAS: H
    • /TUNAI
    • A0-9: X
    • / W: X

Waktu yang saya maksudkan adalah dalam diagram berikut.

diagram waktu

(CA = alamat kolom, RA = alamat baris, X = tidak peduli)

Bahkan jika tidak persis seperti itu, itu adalah sesuatu seperti itu dan saya pikir solusi yang sama akan berhasil. Jadi saya telah menemukan beberapa ide sejauh ini tetapi saya pikir hanya yang terakhir yang memiliki potensi dan saya sedang mencari ide yang lebih baik. Saya mengabaikan menyegarkan, Halaman Cepat dan Pemeriksaan Paritas / Pembuatan di sini.

Solusi paling sederhana adalah dengan menggunakan penghitung dan ROM di mana keluaran penghitung adalah input alamat ROM dan setiap byte memiliki keluaran status yang sesuai untuk periode waktu yang sesuai dengan alamat tersebut. Ini tidak akan berhasil karena ROM lambat. Bahkan SRAM yang dimuat sebelumnya sepertinya akan terlalu lambat untuk sia-sia.

Gagasan kedua adalah menggunakan GAL16V8 atau sesuatu tapi saya tidak berpikir saya cukup mengerti mereka, programmer sangat mahal dan perangkat lunak pemrograman adalah sumber tertutup & Windows-hanya sejauh yang saya tahu.

Ide terakhir saya adalah satu-satunya yang saya pikir mungkin benar-benar berfungsi. Keluarga logika 74ACT memiliki penundaan propagasi rendah dan menerima frekuensi clock tinggi. Saya pikir membaca dan menulis dapat dilakukan dengan beberapa register geser CD74ACT164E dan SN74ACT573N .

Pada dasarnya, setiap kondisi unik mendapatkan kaitnya sendiri yang diprogram secara statis menggunakan rel 5V dan GND. Setiap output register geser pergi ke satu latch / pin OE. Jika saya mengerti benar lembar data, penundaan antara masing-masing negara hanya bisa 1 / SCLK tapi itu jauh lebih baik daripada solusi PROM atau 74HC.

Jadi, apakah pendekatan terakhir mungkin berhasil? Apakah ada cara yang lebih cepat, lebih kecil atau umumnya lebih baik untuk melakukan ini? Saya pikir saya melihat bahwa IBM PC / XT menggunakan 7400 chip untuk sesuatu yang berhubungan dengan DRAM tetapi saya hanya melihat foto papan atas, jadi saya tidak yakin bagaimana cara kerjanya.

ps Saya ingin ini bisa dilakukan di DIP dan tidak "menipu" menggunakan FPGA atau UC modern.

pps Mungkin menggunakan gerbang tunda langsung dengan pendekatan latch yang sama adalah ide yang lebih baik. Saya menyadari kedua register geser dan gerbang langsung / metode penundaan propagasi akan bervariasi dengan suhu tetapi saya menerimanya.

Bagi siapa pun yang menemukan ini di masa depan, diskusi antara Bil Herd dan André Fachat ini mencakup beberapa desain yang disebutkan dalam utas ini dan membahas masalah lain termasuk pengujian DRAM.


1
CPU mana yang digunakan komputer retro Anda?
Anonim

6502, memori akan disimpan dengan jelas.
Anthony

Apakah mungkin untuk tidak menciptakan sepeda untuk Anda, apakah sudah ada desain yang menggunakan DRAM? Saya tidak akrab dengan keluarga mesin ini, tetapi C64 harus cocok. Namun pada awalnya menggunakan 6567 "VIC" chip untuk mengontrol RAM. Tapi sekali lagi, saya yakin sejak saat itu ada proyek yang berkaitan dengan apa yang ingin Anda lakukan.
Anonim

3
Saran yang sedikit melengkung: Z80 memiliki cukup kontroler DRAM bawaan untuk menangani logika penyegaran. (Anda masih membutuhkan multiplexer alamat)
Brian Drummond

3
@BrianDrummond Tolong, jangan rekomendasikan pergi ke sisi gelap. Tidak ada yang baik bisa keluar dari itu.
pipa

Jawaban:


6

Ada skema lengkap untuk IBM PC / XT dalam manual referensi teknis IBM Personal Computer XT (Apendiks D), yang mungkin dapat Anda temukan secara online.

Masalahnya di sini adalah, mengingat garis strobo yang diaktifkan pada memori membaca atau menulis, Anda ingin menghasilkan RAS, CAS dan jalur kontrol (sebut saja MUX) untuk multiplexer alamat. Untuk kesederhanaan, saya akan menganggap tidak realistis bahwa strobo, RAS, dan CAS semuanya aktif-tinggi.

Melihat skematik PC / XT dan skema dari beberapa komputer lain saat ini, saya melihat tiga strategi dasar, yang kira-kira sebagai berikut:

  • Gunakan strobo untuk RAS. Gunakan garis penundaan (bagian yang outputnya merupakan versi waktu tunda inputnya) pada RAS untuk menghasilkan MUX, dan gunakan garis penundaan lain untuk menghasilkan versi RAS yang lebih baru, yang digunakan untuk CAS. Strategi ini digunakan oleh PC / XT dan TRS-80 Model II.

    Contoh bagian tunda (modern) adalah Maxim DS1100.

  • Gunakan strobo untuk RAS dan tunda untuk MUX dan CAS, tetapi lakukan ini menggunakan register geser berkecepatan tinggi alih-alih jalur tunda. Strategi ini digunakan oleh TRS-80 Model I dan Apple II.

  • Gunakan IC khusus. Ini adalah strategi Commodore 64.


Rupanya saya baru menemukan XT TR tanpa Lampiran D kemarin. Saya sudah mendapatkannya sekarang, ini bagus. Saya tidak tahu IC garis penundaan ini ada dan bertanya-tanya bagaimana mereka menangani suhu. Terima kasih telah menyebutkan contoh modern. +1 untuk beberapa solusi juga.
Anthony

5

Pertanyaan Anda cukup rumit sehingga saya bahkan tidak yakin apa masalah Anda yang sebenarnya, tapi saya akan coba!

Desain DRAM berbasis 6502 "terbersih" yang dapat saya temukan adalah dari Commodore PET 2001-N . Ini memiliki 6502 berjalan pada 1 MHz, tetapi logika DRAM clock pada 16 MHz, kemungkinan untuk menghasilkan semua timing.

Saya belum menganalisis detailnya, tetapi tindakan utama tampaknya terjadi dengan penghitung 4-bit 74191 yang terhubung dengan register geser 74164. Ini menghasilkan 8 baris terpisah menjadi 74157 MUX yang dikendalikan oleh garis R / W. Output dari MUX masuk ke dalam 7474 flip-flop dan beberapa logika diskrit untuk menghasilkan sinyal RAS / CAS akhir. Berikut adalah kutipan yang menghubungkan ke halaman yang relevan dalam skema referensi.

Referensi PET 2001-N halaman 6

Refresh ditangani dengan penghitung terpisah, dan setiap baris alamat dihubungkan ke multiplexer yang memilih alamat "asli" atau alamat penyegaran.

Bagian-bagian dari logika ini juga tampaknya menghasilkan timing untuk subsistem video. Saya yakin ini dapat disederhanakan untuk kebutuhan khusus Anda, tetapi saya pikir sesuatu yang serupa dapat berguna: penghitung frekuensi tinggi, register geser, dan multiplexer.


Ini adalah apa yang saya pikirkan tetapi saya cukup bodoh untuk melakukan brainstorming banyak kait daripada MUX atau dua. The 16Mhz clock thre off meskipun karena a) itu jauh lebih tinggi dari jam CPU yang saya baru saja menemukan aneh tapi masuk akal dan b) Fase bisa menjadi minimum ~ 62ns ditambah penundaan propagasi yang saya pikir lambat tapi sekarang saya lihat itu dalam urutan yang sama dengan IBM PC / XT.
Anthony

Apple II sangat mirip, menggunakan jam video 14,318 MHz untuk menentukan waktu dan berbagi memori antara CPU dan video pada setengah siklus alternatif tanpa pertengkaran. Bahkan tidak perlu penghitung penyegaran yang terpisah, karena aktivitas penyegaran video berfungsi untuk menjaga memori tetap segar.
Dave Tweed

-2

ps Saya ingin ini bisa dilakukan di DIP dan tidak "menipu" menggunakan FPGA atau UC modern.

Sementara saya benar-benar memahami semangat proyek Anda dan keinginan Anda untuk menggunakan bagian-bagian yang tidak mewah, saya pasti akan menggunakan cara FPGA jika saya adalah Anda .

Beberapa alasan:

  1. Ini adalah kesempatan belajar yang sempurna. Merancang pengontrol DRAM bukanlah proyek "hello-world" dan setelah itu Anda dapat dengan yakin mengatakan Anda "dapat melakukan" FPGA;
  2. Anda dapat menekan setiap bit kinerja dari memori ini, terutama jika itu adalah chip DRAM yang lebih lama. Tidak hanya Anda akan memiliki PC berbasis 6502 rumahan, Anda juga mungkin memiliki PC berbasis 6502 tercepat ;
  3. Jauh lebih mudah untuk men-debug masalah atau membuat statistik operasi memori yang dikeluarkan CPU Anda. Anda dapat menggunakan penganalisis logika pada bus paralel, tetapi itu tidak pernah menyenangkan (seorang teman saya melakukan sesuatu di sepanjang garis ini - dia ingin menulis simulasi siklus-tepat 8088 dan untuk alasan itu dia perlu mengumpulkan statistik tentang akses memori dan pengaturan waktu Dia menggunakan set chip asli (8288, 8280, 8237) dan menggunakan penganalisis logika dengan banyak saluran, tetapi dari pengalamannya saya dapat memberitahu Anda itu adalah hambatan).

2
Saya tidak yakin bagaimana ini merupakan jawaban dan bukan komentar. 1) Dia tidak mengatakan bahwa dia ingin belajar FPGA. 2) DRAM dari 80ies sudah cukup lambat untuk logika diskrit. 3) Debugging mungkin sulit. Mengapa tidak menerapkan semuanya dalam FPGA, atau bahkan hanya dalam perangkat lunak? Mengapa bahkan menggunakan RAM sama sekali ... :)
pipa

1
@pipes: Ya, persis. Saya tidak ingin menghabiskan waktu mempelajari FPGA saat ini. Saya sudah cukup puas dengan proyek analog kedua yang tidak terkait. FPGA dan PLD pada umumnya merasa seperti mereka baru saja mengganggu pada titik ini meskipun suatu hari nanti saya akan belajar bagaimana menggunakannya.
Anthony

1
@pipe: Papan rewiring seringkali sulit, memakan waktu, dan membuat frustrasi, terutama jika seseorang tidak terlalu ahli dalam hal itu. Menggunakan beberapa PLD yang cukup sederhana (mis. 22V10) untuk beberapa bagian desain akan memudahkan untuk mengubah hal-hal.
supercat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.