Як я можу реалізувати дуже простий асинхронний контролер DRAM?


9

Я хотів би знати, як створити асинхронний контролер DRAM з голих кісток. У мене є 30-контактний модуль 1 МБ SIMM 70ns DRAM (1Mx9 з паритетом), який я хотів би використовувати в проекті ретро-комп’ютера на домашньому боці. На жаль, для них немає даних, тому я переходив від Siemens HYM 91000S-70 та "Розуміння операцій з DRAM" від IBM.

Основний інтерфейс, який я хотів би закінчити, - це

  • / CS: в, вибір чіпа
  • R / W: в, читати / не писати
  • RDY: вихід, ВИСОКИЙ, коли дані готові
  • D: вхід / вихід, 8-бітна шина даних
  • A: в, 20-бітна адресна шина

Оновлення здається досить прямим з кількома способами виправити це. Я повинен мати можливість робити розподілене (перемежоване) оновлення лише для RAS (ROR) під час тактового процесора НИСКО (де доступ до пам'яті не робиться в даному чіпі), використовуючи будь-який старий лічильник для відстеження адреси рядків. Я вважаю, що всі рядки потрібно оновлювати щонайменше кожні 64 м згідно JEDEC (512 за 8 мс згідно з таблицею даних Seimens, тобто стандартним оновленням циклу / 15,6us), тому це має спрацювати нормально, і якщо я застряг, я просто опублікую інше питання. Мені більше цікаво читати і писати прості, правильні та визначати, що я повинен очікувати у швидкості.

Я спочатку швидко опишу, як я вважаю, що це працює, та потенційні рішення, які я придумав до цього часу.

В основному ви розділите 20-бітну адресу навпіл, використовуючи одну половину для стовпця, а іншу для рядка. Ви накреслите адресу рядка, потім адресу стовпця, якщо / W - ВИСОК, коли / CAS переходить вниз, то це зчитування, інакше це запис. Якщо це запис, дані повинні вже бути на шині даних до цього моменту. Через певний проміжок часу, якщо це зчитування, то дані доступні або якщо це запис, то дані обов'язково були записані. Тоді / RAS та / CAS потрібно знову підняти ВИСОКУ в періоді контр-інтуїтивно названого «підзарядки». Це завершує цикл.

Отже, в основному це перехід через кілька станів з нерівномірними специфічними затримками між кожним переходом. Я перерахував це як "таблицю", індексовану тривалістю кожної фази транзакції, щоб:

  1. t (ASR) = 0ns
    • / РАН: Н
    • / CAS: H
    • A0-9: RA
    • / Ш: Н
  2. t (RAH) = 10ns
    • / РАН: Л
    • / CAS: H
    • A0-9: RA
    • / Ш: Н
  3. t (ASC) = 0ns
    • / РАН: Л
    • / CAS: H
    • A0-9: CA
    • / Ш: Н
  4. t (CAH) = 15ns
    • / РАН: Л
    • / CAS: L
    • A0-9: CA
    • / Ш: Н
  5. t (CAC) - t (CAH) =?
    • / РАН: Л
    • / CAS: L
    • A0-9: X
    • / Вт: H (дані доступні)
  6. t (RP) = 40ns
    • / РАН: Н
    • / CAS: L
    • A0-9: X
    • / Вт: X
  7. t (CP) = 10ns
    • / РАН: Н
    • / CAS: H
    • A0-9: X
    • / Вт: X

Часи, про які я згадуюсь, наведені на наступній схемі.

діаграма часу

(CA = адреса стовпця, RA = адреса рядка, X = все одно)

Навіть якщо це не зовсім так, це щось подібне, і я думаю, що таке ж рішення спрацює. Тому я придумав кілька ідей поки що, але думаю, що лише останні мають потенціал, і я шукаю кращих ідей. Я ігнорую оновлення, швидку перевірку сторінок та паритетів / генерування тут.

Найпростішим рішенням є просто використання лічильника та ПЗУ, де вихідний лічильник є входом адреси 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 Можливо, використання затримки воріт безпосередньо з тим же підходом засувки є кращою ідеєю. Я усвідомлюю, що і регістр зсуву, і затримка прямих воріт / розповсюдження залежать від температури, але я приймаю це.

Для тих, хто виявить це в майбутньому, ця дискусія між Білом Гердом та Андре Фачат охоплює декілька згаданих у цій темі конструкцій та обговорює інші проблеми, включаючи тестування DRAM.


1
Який процесор використовуватиме ваш ретро-комп’ютер?
Анонім

6502, пам'ять буде накопичена очевидно.
Ентоні

Чи можна не вигадувати велосипед для вас, чи є вже доступні конструкції з використанням DRAM? Я не знайомий з цим сімейством машин, але C64 повинен бути хорошим. Однак він спочатку використовує 6567 мікросхему "VIC" для управління оперативною пам'яттю. Але знову ж таки, я впевнений, що з тих пір були проекти, пов'язані з тим, що ти хочеш робити.
Анонім

3
Трохи викривлене припущення: у Z80 було достатньо вбудованого DRAM-контролера, який керував логікою оновлення. (Вам все-таки потрібен мультиплексор адреси)
Брайан Драммонд

3
@BrianDrummond Будь ласка, не рекомендую переходити до темної сторони. Нічого хорошого з цього не виходить.
труба

Відповіді:


6

У технічному довіднику 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.

  • Використовуйте власні ІМС. Це стратегія Commodore 64.


Мабуть, я лише вчора знайшов XT TR без додатка D. У мене це зараз, це чудово. Я не знав, що ці ІС лінії затримки існують, і мені було цікаво, як вони мають справу з температурою. Дякую, що згадали про сучасний приклад. +1 також для кількох рішень.
Ентоні

5

Ваше запитання досить складне, що я навіть не впевнений, у чому полягає ваша реальна проблема, але я спробую!

"Найчистіша" конструкція DRAM на основі 6502, яку я міг знайти, - від Commodore PET 2001-N . Він має 6502, що працює на частоті 1 МГц, але логіка DRAM працює на частоті 16 МГц, ймовірно, генерує всі таймінги.

Я не проаналізував деталі, але, здається, основна дія відбувається з 4-розрядним лічильником 74191, підключеним до регістра зсуву 74164. Це виводить 8 окремих ліній, що переходять у 74157 MUX, який управляється лінією R / W. Вихід від MUX перетворюється на 7474 триггер і деяку дискретну логіку для генерації кінцевих сигналів RAS / CAS. Ось уривок, який посилається на відповідну сторінку в довідковій схемі.

ПЕТ 2001-N довідкова сторінка 6

Оновлення обробляється окремим лічильником, і кожен рядок адреси підключається до мультиплексора, який вибирає або "реальну" адресу, або адресу оновлення.

Частини цієї логіки також, здається, генерують таймінги для відеосистеми. Я впевнений, що це може бути спрощено для ваших конкретних потреб, але я думаю, що щось подібне може бути корисним: лічильник високої частоти, регістр зсуву та мультиплексори.


Це те, про що я думав, але я був досить тупий, щоб мозковий штурм здійснив кілька засувок замість MUX або двох. Час 16 МГц мене відкинув, хоча тому, що а) це набагато вище, ніж тактова частота процесора, яку я щойно знайшов дивним, але це має сенс і б) Фази можуть бути мінімум ~ 62ns плюс затримки розповсюдження, які я вважав повільними, але тепер я дивіться це в тому ж порядку, що і IBM PC / XT.
Ентоні

Apple II дуже схожий, використовуючи 14,318 МГц відео-годинник для синхронізації та обміну пам'яттю між процесором та відео на альтернативних півциклах безперервно. Навіть не потрібен окремий лічильник оновлення, оскільки активність оновлення відео служить для збереження пам'яті.
Трейд Дейва

-2

ps Я хотів би, щоб це можна зробити в DIP і не "обманювати" за допомогою FPGA або сучасного UC.

У той час як я повністю зрозуміти дух вашого проекту і вашого бажання використовувати не-орнаментальні деталі, я б точно піти FPGA шлях , якщо я вам .

Кілька причин:

  1. Це ідеальна можливість навчання. Розробка контролера DRAM - це не проект "привіт-світ", і після цього ви можете впевнено сказати, що "можете зробити" FPGA;
  2. Ви можете вичавити з цієї пам'яті кожен шматочок продуктивності, особливо якщо це старший чіп DRAM. Ви не тільки матимете свій домашній ПК на базі 6502, можливо, у вас найшвидший ПК на базі 6502;
  3. Налагодити помилки або зробити статистику операцій із пам'яттю, яку видав ваш процесор, може бути набагато простіше. Ви можете використовувати логічні аналізатори на паралельних шинах, але це ніколи не цікаво (мій друг робить щось за цими напрямками - він хоче написати точно циклічне моделювання 8088, і саме тому йому потрібно зібрати статистику щодо доступу до пам'яті та часу візерунки. Він використовує оригінальний набір мікросхем (8288, 8280, 8237) і використовує логічний аналізатор з великою кількістю каналів, але зі свого досвіду я можу сказати вам , що це перетягнути).

2
Я не впевнений, як це відповідь замість коментаря. 1) Він не каже, що хоче вчитися FPGA. 2) DRAM з 80-х вже досить повільні для дискретної логіки. 3) Налагодження може бути важким. Чому б не реалізувати все в FPGA або навіть просто в програмному забезпеченні? Навіщо взагалі використовувати оперативну пам’ять ... :)
труба

1
@pipes: Так, точно. На даний момент я не хочу витрачати час на вивчення FPGA. Мені вже вистачило на моїй тарілці другого незв'язаного аналогового проекту. FPGA та PLD взагалі відчувають, що вони просто перешкоджають цьому моменту, хоча я одного дня навчусь ними користуватися.
Антоній

1
@pipe: Перемотування дощок часто буває складно, забирає багато часу і засмучує, особливо якщо хтось не дуже досвідчений у цьому. Використання досить простих PLD-дисків (наприклад, 22V10) для деяких частин конструкції полегшить налаштування речей.
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.