PDA

Просмотр полной версии : DRAM контроллер для 4164



fromzero2infinity
25.08.2023, 18:35
Здрасьте друзья.
После столетнего перерыва вернулся к железякам поколдовать.
Захотелось чего-то большего и более современного, а ПИО более чем на 6 мегаГ не нашел, да и кучу регистров и логики нету сил паять, то закрутил я все это вокруг СПЛД Макс2.
Забегая вперед, все равно пришлось кучу проводов паять для трасиверов 3.3<->5В.

Запихнул в сплд логику и маленькое ПЗУ для кода (мапнул на 0-127 адреса).

И тут дай, думаю, ради интереса я СРАМ на ДРАМ поменяю. Нашел 41464. Так, что получилось вот такая схемка.

https://zx-pk.ru/attachment.php?attachmentid=79302&d=1692909591

Ну слепил все как смог.

https://zx-pk.ru/attachment.php?attachmentid=79300&d=1692909544

Написал простой счетчик, где переменная каждый раз читается из памяти, инкрементируется и сохраняется обратно в память.
Это, как бы, тест у меня такой для памяти.


P_OUT .equ 3h

.org 0h

ld sp, 0fff0h

; save initial counter value in RAM
ld hl, 3000h
ld (hl), 1h

main:
ld hl, 3000h
ld a, (hl)
out (P_OUT), a
inc a
ld (hl), a

ld de, 3FFFh ;Loads DE with 16383 ;MAX - 7FFFh
dly:
dec de ;Decrements DE
ld a, d ;Copies D into A
or e ;Bitwise OR of E with A (now, A = D | E)
jp nz, dly ;Jumps back to Inner: label if A is not zero

jp main

.END


Натужился, занизил 20 мегаГ до 6, что бы пока с ~WAIT не путаться и написал конроллер памяти. Вот FSM.

https://zx-pk.ru/attachment.php?attachmentid=79301&d=1692909563

, протестил и..... не работает.
Причем в тестах все круто выглядит и по таймингам и по форме.

https://zx-pk.ru/attachment.php?attachmentid=79306&d=1692973642

Тыкаюсь осцилом в RAS (красный) CAS (желтый) и чей-то вижу не то что-то. Похоже, вроде, но на инициализации (8 циклов CAS before RAS) RAS какой-то странный, а в M1 CAS кривится.
Подумал может горелые выходы, поменял рас и кас местами - картина тоже поменялась, значит сплд в норме. Может осцилограф кривой?

https://zx-pk.ru/attachment.php?attachmentid=79307&d=1692973642

Вот уже месяц с перерывами голову ломаю - не выходит каменный цветок. Не фурычит.

Подумал, может вообще все плохо, ан нет. Заменил для переменной память на регистр и все работает, считает.
Значится дело в контроллере.

Очень нужна помощь. На Вас, светлые головы нашего форума надеюсь и уповаю, ибо уже свои все мысли от напряги скисли. Если до ума доведу - сделаем это опенсорсным и подарим zx-pk и миру.

Вот тут сорсы для icarusa:
79310

Rio444
25.08.2023, 21:23
А что это у Вас на диаграмме сначала CAS опускается, потом RAS? Должно быть наоборот.
И пауза между ними на вид очень маленькая. За это время должен успеть смениться и защелкнуться Addr.
DRAM реально 100нс?
464 чаще всего медленнее.

UncleDim
25.08.2023, 21:28
начнем, пожалуй, с емкостей по питанию (схему, похоже, сглючивает при максимальном потреблении dram).

UncleDim
26.08.2023, 00:21
И пауза между ними на вид очень маленькая
к логике отдельные вопросы, да. но сначала симулятор с осциллографом надо к одной картинке привести)

- - - Добавлено - - -


Код:

Вот FSM
это читаемо. осциллограмма тоже сойдет. а вот остальное - давайте как-нибудь отдельным архивом/сторонним хостингом, не разглядеть ничего толком..

HardWareMan
26.08.2023, 07:35
А что это у Вас на диаграмме сначала CAS опускается, потом RAS? Должно быть наоборот.
Нет. Вы диаграму FSM посмотрите: он 8 циклов CAS_before_RAS формирует для ввода матрицу в эксплуатацию после подачи питания. Это лишнее, но ему так захотелось, оно не будет мешать.

- - - Добавлено - - -


DRAM реально 100нс?
464 чаще всего медленнее.
Обычно в букваре на главной дают tCAS, который 120нс/100нс/80нс/60нс. Но основной тайминг для простой DRAM это tRAS и он обычно от 1,5 tCAS до 2.2 tCAS. Например вот:
https://i.ibb.co.com/YQpmNnp/image.png
И расшифровка таймингов:
https://i.ibb.co.com/tMGP0DB/image.png

UncleDim
26.08.2023, 10:23
HardWareMan, тут претензии к tRCD и к переключению адресов

HardWareMan
26.08.2023, 11:53
HardWareMan, тут претензии к tRCD и к переключению адресов
Если смотреть его симуляцию, то там вообще ничего не выдерживается.
https://i.ibb.co.com/2h15ZhY/image.png
В наших компьютерах одновременная смена адреса на RAS у наших компьютеров опирается на инерцию КПшек и ёмкость шины, которой тут нет от слова совсем. И то часто ставился конденсатор для затягивания фронта. Переключать же адрес на CAS это, конечно, пять. Единственный ЛК, который пытался в правильный тайминг, это 86РК, который использовал регистр сдвига. И даже у него были проблемы (но там связано конкретно с ИР1, они решались заменой на ИР9, вроде).

fromzero2infinity
26.08.2023, 20:10
<q> начнем, пожалуй, с емкостей по питанию (схему, похоже, сглючивает при максимальном потреблении dram).</q>
Поставил в питание рядом с памятью 0.1 uF.

Да. Но это инит. Если посмотреть в датаШИТ стр. 5, то
An initial 100 u (~RAS inactive) is REQUIRED after power-up,
followed by any 8 ~RAS cycles.

Как только взлечу, попробую это байду убрать. А вдруг и взаправду необязательно. Сразу половина мульплексоров освободится.

Да. уменя 100 ns uPD41464C-10. Row access Time (max) 100 ns

Все тайминги держатся строго по спецификации и даже чутка поболее. А може я чего не догоняю.
Ну вот, например для M1 у меня tRAS = 240 ns (зависит от mreq), t RP = 120 при требуемом 90, t RC = 360 при 200 по специи.

Единственно пока, что не бьется это, как вы справедливо ткнули меня носом - t RCD.

В свое оправдание скажу только, то что по спецификации
t ASR = 0
t RAH = 10
t ASC = 0
t CAH = 15

tRCD min = 20

Что и привело к ложному пути.
Сейчас посмотрел еще раз и вижу - t AR = t RAH + t ASC + t CAH,
что дает 65 = 10 + 0 + 15, что явно неверно. Получается на переключения адресов надо еще 35 ns, которых нету у меня

https://zx-pk.ru/attachment.php?attachmentid=79322&d=1693069794

Да, добавлю еще, что сигналы от процессора в симуляции брались из таблички на последних страницах, например везде пишется, что проц выставляет адрес по негативному фронту Т1.
Но если посмотреть в AC characteristics column Z8400 и на Fure 5. Instruction Opcode Fetch, то там видим 6, TdCr(A), что и дает мой первый адресс 90 ns после позитивного фронта T1 и так далее

https://zx-pk.ru/attachment.php?attachmentid=79323&d=1693071360
https://zx-pk.ru/attachment.php?attachmentid=79324&d=1693071368


UPD.
Быстро получилось исправить. Сейчас такой вот t RCD
Еще смущает Row addr вместе с RAS, но в шите говориться, что t ASR = 0.
Да t ASC тоже = 0. Чего-то запутался. Получается можно вместе с CAS и RAS адресы выставлять..... хз

https://zx-pk.ru/attachment.php?attachmentid=79325&d=1693072565

Нашел еще косяк. Не в контроллере.
assign rom_en_n = (!mreq_n) ? (cpu_address_bus[15:13] == 3'b000) ? 1'b0 : 1'b1
: 1'b1;
//assign dram_en_n = !rom_en_n; !!! НЕ ПРАВИЛЬНО
assign dram_en_n = (!mreq_n) ? (cpu_address_bus[15:13] == 3'b000) ? 1'b1 : 1'b0
: 1'b1;

Теперь осцилогамма выглядит нормально, хотя и звенит чутка.
https://zx-pk.ru/attachment.php?attachmentid=79326&d=1693075154

Все равно пока не взлетает.

UncleDim
27.08.2023, 00:51
followed by any 8 ~RAS cycles.
ANY. Означает, что /cas дергать не обязательно. это может быть обычный цикл чтения, или записи, или цикл регенерации "ras only"
короче - заработает и без инита рано или поздно

осцилогамма выглядит нормально
в ините - не выглядит. с чего ras такой короткий?

В свое оправдание скажу только, то что по спецификации
t ASR = 0
t RAH = 10
0, а не "ну может чуть больше нуля", ставьте адрес строки заранее хотя бы за такт (а проще его всегда там держать, когда цикл неактивен)

- - - Добавлено - - -


Но если посмотреть в AC characteristics column Z8400 и на Fure 5.
это потом. в первую очередь на реальный проц осциллом надо смотреть, чтоб не блуждать

- - - Добавлено - - -


Поставил в питание рядом с памятью 0.1 uF.
ставьте еще. рядом с каждым корпусом, который питается хотя бы через +одно от источника разъемное соединение

fromzero2infinity
29.08.2023, 21:08
Продолжение на след. странице форума...

fromzero2infinity
03.09.2023, 04:16
Дисклеймер: пока не заработало.

Ну вот, джентельмены. Осознал, что я тупее компилятора. А еще - даже если симуляция работает и показывает правильно, в железяке не факт, что тоже самое будет. Мистика. Но это не главное. Итак.
Переделал машину состояний и убрал все latches, что, в свою очередь убрало все гонки сигналов.

Разделил стейт машину на 2е. Так легче дизайнить, что и позволило создать приличный FSM.

Общий вид:
https://zx-pk.ru/attachment.php?attachmentid=79438&d=1693703213

По частям. Первая - инит, вторая общий цикл:

https://zx-pk.ru/attachment.php?attachmentid=79441&d=1693703245

https://zx-pk.ru/attachment.php?attachmentid=79443&d=1693703265

Итак.
Вот симуляция инициализации
https://zx-pk.ru/attachment.php?attachmentid=79440&d=1693703234

А вот осцил (красный - RAS, желтый - cpu clk). Я теперь крутой. наконец настроил утилиты и могу видеть все на компе.
https://zx-pk.ru/attachment.php?attachmentid=79439&d=1693703222

Один в один.
Класс.

M1 - Fetch
https://zx-pk.ru/attachment.php?attachmentid=79447&d=1693758323

Read
https://zx-pk.ru/attachment.php?attachmentid=79448&d=1693758336

Write
https://zx-pk.ru/attachment.php?attachmentid=79449&d=1693758349

Вот что вижу на осцилографе (RAS red, CAS yel)
https://zx-pk.ru/attachment.php?attachmentid=79450&d=1693761287

По таймингу вроде все нормально, как и задумано - 40 ns между ними. Но не пойму, что с фронтами и PK-PK/ Там 10 вольт что ль!!?? Входная емкость у этой DRAM просто неимоверная похоже.

Но....
Теперь обращение к DRAM вроде номуль . Raddr-> RAS->Caddr->CAS. А все равно не взлетает.


Даже и не знаю теперь чего не нравится. Входная емкость (что вообще для меня убрать это рокет сайнс). Снизить частоту котроллера с 50 до 25 МГц?


З.Ы. : Так и не понял. Вроде загружаю нормальные картинки, а при просмотре форума какая-то муть с низким разрешением видится.

Nesser
23.10.2024, 18:52
так и чем эпопея закончилась? :)