Просмотр полной версии : PDP-11 на FPGA
Случайно нашлось увидеть (06.12.2017) - когда оно ко мне приехало :)
Набор для разработчика Cyclone+Cortex в моих щастливых руках :) Правда, когда я до него доберусь по плотному - пока не понятно - работа...
06.12.2017
Третий мой проект :)
Всякое, связанное с ним, буду выкладывать здесь: http://www.kpxx.ru/PDPonFPGA
Информация к размышлению для читающих эту тему.
Модуль процессора построен так, что я могу как генерировать реально существующие процессора (которы проходят или почти проходят тесты, созданные под эту модель) с учётом всех (или почти всех) их особенностей, так и собирать процессора с определёнными характеристиками.
То есть - есть некий набор характеристик. Были созданы описания реально существоваших моделей процессоров, в которых уже заданы эти характеристики. И когда генерируется прошивка - как параметр - идёт ссылка на какое-то описание процессора. Но никто не мешает насоздавать такие описания с любым уникальным набором характеристик. Типа - PDP-11/03 с FPP.
Тестирование.
Выставляю разные варианты процессора, синтезирую, заливаю прошивку и прогоняю некоторый (формальный) набор тестов, один из которых - зашитый в ОЗУ тест (из набора, но остальные нацелены на ДП), проверяющий работу таймера, эхо с консольного ввода и показ на регистре дисплея - условное название - тест 1000, а ещё один - тест памяти из ПЗУ - условное название - тест ZZ.
Объём теоретически доступной памяти - 512 кб, объём доступной реально памяти - зависит от процессора.
Варианты проца J11 с суффиксом wSOBBug - это попытка автора бороться за прохождения теста J11, в котором проверяется прилёт запроса на прерывание от консольного порта с задержкой на ожидание, сделанной весьма тупо (а ля SOB R0, .) - на быстром процессоре (типа FPGA-шной реализации) цикл заканчивает ДО того, как будет прерывание от терминал - и тест считает, что типа ошибка. В процах с суффиксом wSOBBug сделана искусственная задержка скорости выполнения команды SOB, что обеспечивает прохождения теста.
Тесты прошивки:
1. запустилась в ПЗУ
2. прошёл тест 1000
3. прошёл тест ZZ
4. загрузилась DOS-11, каталог успешно считан и показан
5. загрузилась RT11SB и прошла тест копирования RK и RL с проверкой
6. загрузилась RT11XM и прошла тест копирования RK и RL с проверкой
7. загрузилась RT11ZM и прошла тест копирования RK и RL с проверкой
8. загрузилась RSX-11M-Plus и прошла тест копирования RL с проверкой
Не все тесты сразу пришли в голову, поэтому не на всех процессорах пробовал запустить полный набор. Ну и на некоторых процах некоторые тесты в принципе не возможны :)
Суммарный лог (+ - тест пройден, x - тест не пройден, . - тест на данном процессоре не возможен, ? - данный тест на этом процессоре не запускался, в конце - как был определён процессор и мои примечания)
По мере прохождения тестов информация будет добавляться, в конце добавлю более подробный лог
ROM started
Test 1000 completed successfully
Test ZZ completed successfully
DOS-11 started
RT11SB started, test completed successfully
RT11XM started, test completed successfully
RT11ZM started, test completed successfully
RSX started, test completed successfully
PDP-11/03 +x+x+... -> 56kb LSI 11 or PDP 11/03 (Check Test 1000 for invalid ops)
PDP-11/04 +++++... -> 56kb PDP 11/15,20
PDP-11/05 +++++... -> 56kb PDP 11/15,20
PDP-11/10 +++++... -> 56kb PDP 11/15,20
PDP-11/15 +++++... -> 56kb PDP 11/15,20
PDP-11/20 +++++... -> 56kb PDP 11/15,20
SBC-11/21 ++???...
PDP-11/23 ++++++.. -> 512kb PDP-11/24
PDP-11/24 ++++++.. -> 512kb PDP-11/24
PDP-11/34 ++?++??. -> 248kb PDP-11/34
PDP-11/34a ++?++??. -> 248kb PDP-11/34
PDP-11/34c ++?++??. -> 248kb PDP-11/34
PDP-11/35 ++++x??.
PDP-11/40 ++++x??.
PDP-11/44 ++++++++ -> 512kb PDP11-44
PDP-11/45 +++++++x -> 248kb PDP-11/45,50,55 (RSX - not enough memory)
PDP-11/50 +++++++x -> 248kb PDP-11/45,50,55 (RSX - not enough memory)
PDP-11/55 +++++++x -> 248kb PDP-11/45,50,55 (RSX - not enough memory)
PDP-11/60 ++++xxxx
PDP-11/70 ++++++++ -> 512kb PDP-11/45,50,55
PDP-11/53_wSOBBug ++++????
PDP-11/53 ++++????
PDP-11/73_wSOBBug ++++++++ -> 512kb PDP-11/73A (SOB - 5 op/s)
PDP-11/73 ++++++++ -> 512kb PDP-11/73A (SOB - 101 op/s)
PDP-11/83_WSOBBug ++++++++ -> 512kb PDP-11/83
PDP-11/83 ++++++++ -> 512kb PDP-11/83
PDP-11/84_wSOBBug ++++++++ -> 512kb PDP-11/84
PDP-11/84 ++++++++ -> 512kb PDP-11/84
PDP-11/93_wSOBBug ++++++++ -> 512kb PDP-11/93
PDP-11/93 ++++++++ -> 512kb PDP-11/93
PDP-11/94_wSOBBug ++++++++ -> 512kb PDP-11/94
PDP-11/94 ++++++++ -> 512kb PDP-11/94
----------------------------------------------------------------------------------------------------------------------
Сегодня - первое проявление жизни PDP-11 на Циклоне :) Фото - завтра утром.
К сожалению, на моей DE-10 нет выхода на классический последовательный порт, но есть IrDA передатчик и приёмник. И я пока не понял, можно ли это считать COM через IrDA. У меня есть вроде бы что то похожее на IrDA, втыкающееся в COM порт, но я так же не уверен - можно ли это считать COM через IrDA. Пока друг дружку не видят.
К DE-10 можно подключить PS/2 клавиатуру и VGA монитор, но код, которые есть (по крайне мере, VGA-часть) - не совсем для моей платы - требуется допиливание.
Попробую завтра поковыряться...
В смысле нет COM? У этой платы хотя-бы два пина наружу торчат в виде PLS штырьков или еще как? Если да - то ничто не мешает их сделать RX и TX UART, а дальше хоть через max232 на реальный RS232, хоть через китай-свисток на USB-UART.
В смысле нет COM?
В смысле - готового нет. А сделать - да, никто не мешает.
Но учитывая наличия PS/2 и VGA - интересно задействовать и их - получается самодостаточное устройство
Пока плюнул на PS/2 и VGA. Подключил с гребёнки пару контактов к COM-USB, а к COM - эмулятор VT52 Патрона.
PDP-11 в FPGA загружается и начинает работать - биос работает, с консоли могу ввести прогу и запустить - работает. Регенерация памяти DRAM тоже вроде идёт без проблем - что записал в ОЗУ, то и читаю :)
Подключил к гребёнке плату для SD карт - и на этом завис. Синтезированный контроллер (RH) со стороны PDP откликается, начальный загрузчик пытается его шевелить - а в ответ - тишина. Автор предупредил, что его код работает только с SD картами. У меня вроде SD карта (2 гига, но microSD) и переходник, но... Чуть позже схожу куплю натуральную SD (тоже на 2 гига) - посмотрю, что будет...
MacBuster
18.03.2018, 12:49
Удаление в знак протеста против действий MM
скорость обмена
Правильно ли я понимаю, что - максимальная скорость обмена?
MacBuster
18.03.2018, 13:25
Удаление в знак протеста против действий MM
Ну, при всём богатстве выбора, SD карта только одна - 2 Гб и 2 класс
Лана, потопал забрать её
- - - Добавлено - - -
Похоже всё таки проблема в microSD карте. Купленную SD карту модуль по крайне мере видит (отладочные светодиоды)
- - - Добавлено - - -
ДА!!
Проблема в поддержке только SD карт.
Первая загрузка:
http://www.kpxx.ru/PDPonFPGA/Софт/RSX-11M-Plus/FirstBoot
- - - Добавлено - - -
Всякое, связанное с ним, буду выкладывать здесь: http://www.kpxx.ru/PDPonFPGA
Адрес так же в первом сообщении.
- - - Добавлено - - -
Блин, до боли знакомое моргание на передней панели :):):)
- - - Добавлено - - -
Запустил SYSGEN. Как закончится (включая загрузку, сохранение и первую загрузку сохранённой системы) - выложу текстовый лог - с самого начала - с первой загрузки системы на PDP-11(FPGA).
- - - Добавлено - - -
Кстати, интересный факт об этом проекте. Автор создал три процессора - один - центральный, второй будет собран, если использовать встроенный модуль терминала (если на плате есть VGA часть, как у меня), третий используется в адаптере Ethernet XU :)
- - - Добавлено - - -
Работает примерно в 5-9 раз медленней эмулятора simh на моём компе.
Листинг работы, включая SYSGEN
http://www.kpxx.ru//PDPonFPGA/Софт/RSX-11M-Plus/sysgen/01. Sysgen.txt
PDP-11/70, который я могу поднять одной рукой и поставить на стол :v2_finge: :v2_eek: :v2_laugh: :v2_laugh: :v2_laugh:
Я оооооочень сильный компьютерщик :v2_laugh: :v2_laugh: :v2_laugh:
Читаю про сигналы VGA. Приличный слов пока нет - доходит с трудом. А все эти микросекунды и пиксели надо ещё и на сигналы переложить.
Надеюсь, что всё таки въеду и будет у меня ещё и VT100|VT52 в FPGA :)
LeoN65816
20.03.2018, 07:31
Читаю про сигналы VGA. Приличный слов пока нет - доходит с трудом. А все эти микросекунды и пиксели надо ещё и на сигналы переложить.
Вот здесь (http://zx-pk.ru/threads/26944-mechta-agat-na-plis.html?p=906800&viewfull=1#post906800) пройди по ссылочке, качни VGA_Test1.zip, посмотри, так сказать, на примере. Обрати особое внимание на синхронность.
посмотри, так сказать, на примере
Спасибо. Но с этим примером (как и с тем, который есть от производителя) есть проблема - писал код не я (я его только адаптирую пока под DE10-Standard), написан он на VHDL и я пока толком не знаю ни VHDL (хотя тут уже кое что понимаю - всё таки перенести смог :) ), ни Verilog - и как назло оба примера - на Verilog. Но - два примера лучше, чем один - посмотрю и его, что бы вычленить принцип :)
LeoN65816
20.03.2018, 10:26
Verilog намно-о-о-о-го проще, чем VHDL. Очень похож на си, очень легко познается и дизайнится в нем, рекомендую.
Но - два примера лучше, чем один
три в таком случае -вообще замечательно
http://searle.hostei.com/grant/Multicomp/
очень хороший конструктор\пример. и модуль SBCTextDisplayRGB - практически терминал, причем настраиваемый в широких пределах.
zebest, спасибо. Интересный пример и главное - на VHDL. Хотя напрямую использовать не буду - у меня на плате продвинутый модуль DAC для VGA - интересно его использовать - в максимуме можно будет использовать до 24 бит на цвет. Присланный Вами вариант напоминает тот, что реализовал авто PDP2011, но у него 640x480. Сравнение позволит определить смысл всяких констант в тексте.
у меня на плате продвинутый модуль DAC для VGA
у продвинутого модуля DAC ну максимум пару сигналов добавляется, которые обычному модулю RGB+Sync особо не мешают.
Три. Clock, Blank_N (N - negative) и ещё какой то, которые вместе говорят - когда сигнал гасить, когда выдавать. Но основная проблема пока другая - плохое знание VHDL
- - - Добавлено - - -
LeoN65816, это я уже понял. Но пока у меня проект, который написан не мной - и переделывать его на Verilog буду (если буду), когда в проекте досконально разберусь и запущу оставшиеся два модуля - VGA (плюс модуль терминала с клавиатурой - но с ним проще - он построен на процессоре PDP-11 :) ), и адаптер Ethernet. Вот когда всё заработает (с минимальным моим воздействием) - тогда можно проект уродовать :)
Похоже, нашёл что то подходящее под мою плату: https://eewiki.net/pages/viewpage.action?pageId=15925278
На другой плате такой же встроенный DAC :)
Когда руки дойдут поковыряться - пока не знаю, в выходные скорее всего буду играться с УК-НЦ
- - - Добавлено - - -
Офигеть - информация со страницы: Создатель Scott Larson, отредактировано мар 07, 2018
Ну прям вовремя создал :)
Verilog намно-о-о-о-го проще, чем VHDL. Очень похож на си, очень легко познается и дизайнится в нем, рекомендую.
Прошу прощения за оффтоп, но вы немного погорячились в сравнении Verilog'a с VHDL. VHDL ни сколько не сложнее Verilog'a. Просто Verilog допускает, в отличии от VHDL, некоторые вольности, которые, кстати говоря, могут выйти боком разработчику. Например, если мне не изменяет память, можно записать в регистр сигнал другой разрядности и компилятор послушно откомпилирует проект и разработчик даже и не поймёт, что у него есть в проекте неточности. В VHDL откомпилировать такой файл невозможно, т.к. он строгий язык описания и приучает разработчика к строгости и порядку. Этим он напоминает язык Pascal.
Я изучил VHDL достаточно быстро, после чего начал осваивать Verilog, но недоучил :(, т.к. пропало желание и время.
Verilog намно-о-о-о-го проще, чем VHDL
VHDL ни сколько не сложнее Verilog'a
Как человек, знакомый с многими языками (обычными, не железячными) программирования (что то лучше, что то хуже) - могу сказать - у каждого языка есть свои плюсы и свои минусы. И - лёгкость или сложность изучения - не являются ни плюсами ни минусами. Для меня, по крайне мере. А *****код можно написать на любом языке. Из тех, которые мне знакомы - за другие не отвечу.
Полноценно руки не доходят, но потихоньку продолжаю доделки топ модуля для использования VGA выхода. Интересное наблюдение - реализация автора топ модулей для разных плат отличается разной степенью... готовности, что ли.. Где то есть отладочный код и сигналы для каких то устройств, где то нет.. У меня пока только одна плата, так что я делаю под неё, но попробую тщательней выделять зависимые часть
Планировал вчера повозиться с УК-НЦ, но из-за домашних дел - руки не дошли. Решил подождать, когда для него монитор (надеюсь, рабочий) приедет - а то надоело от ДВК открывать для подкрутки кадровой. Да и питание у него от разъёма - тоже не удобно.
Сегодня вожусь в текстами для FPGA - причёсывание и постепенное добавление кода для VGA в моём варианте платы.
Первое достаточно существенно вмешательство в текст - немного причесал в плане читабельности и упрощения переделки под другие платы. Успешно (правда, пока у меня критерий успешности - RSX загрузилась и работает :) )
Очередной затык. Пробую перевести скорость с 9600 на 19200 (изменение в одном месте) - и система встаёт по адресу 000000. Никаких признаков жизни. Даже встроенный биос ничего не выдаёт. Как будто до него дела не доходят. Чешу затылок. Думаю :)
- - - Добавлено - - -
Прикол за приколом :) Сделал 38400, после загрузки стоп по адресу 000002, нажал сброс - по 000000, ещё сброс - начал биос подавать признаки, ещё сброс - больше от биоса жизни, ещё сброс - начал грузиться и загрузился. Такое вчепетление, что где то какой то клок сбоит.
- - - Добавлено - - -
Остановил RSX, сброс - и всё, больше не грузится ни биос, ни, естественно, RSX. Лана, пока верну на 9600, пытать буду после того, как VGA и клаву PS/2 заведу. Может ещё и логика работы с DRAM подсбаивает. Это пока для меня тоже тёмный лес :)
Сегодня устраивался на новое место работы, редактировал исходники PDP-2011 и опять развлекался со скоростью работы порта :) Хрень какая то. После "прошивки" может сразу завестись, может после некоторого количества нажатий на ресет, может вообще не завестись...
В соседней теме домерились штангенциркулями...
Рождение
http://www.KpXX.Ru/PDPonFPGA/Железо/VGA/VGA birth.jpg
Ну, в общем, отладка FPGA не отличается от отладки драйвера WQ :) Изменили, подождали (только тут раза в четыре дольше), посмотрели, сказали - #$53^#$%^#$^ и снова тупо смотрим текст :))
отладка FPGA не отличается от отладки драйвера WQ
ну это при условии, что драйвер WQ не компилится от 40 минут до полутора часов. Иначе при каждом чихе материЦЦа приходится дольше.
Даже если компиляция занимает 10-15 мин - и то напрягает. Профи предлагают при отладке хотя бы SignalTap-ом пользоваЦЦа.
Компилился он за секунды, а вот перенос нового варианта системы с образа на CF - минуты 2-3
Проект на моём компе собирается от 10 до 20 минут, как правило - 12-15.
До SignalTap ещё не добрался, но вот когда начну код переделывать (ядро я не трогаю - только особенности под мою плату)... Тогда точно придётся осваивать. Да и вопросы у меня к ядру есть - почему то не всегда запускается, хотя вроде ничего серьёзного не делал...
- - - Добавлено - - -
О! Собрался :)
Наверное, ещё только пару раз сегодня вечером успею...
- - - Добавлено - - -
Хрен вам с маком....
Пока лучший вариант - ожил модуль видеотерминала, а PDP лежало и PDP работал - модуль видеотерминала лежал...
Проект на моём компе собирается от 10 до 20 минут, как правило - 12-15.
Ну я про Квартус и говорю.
перенос нового варианта системы с образа на CF
Эмм... а что так сурово? CF ? почемуу не SD ?
Это я про Квант и плату WQ - там CF
На FPGA - SD
Уууу.. Ошибку таки нашёл :) Собирается :)
- - - Добавлено - - -
В общем, надо внимательно смотреть на непривязанные выводы циклона
- - - Добавлено - - -
К сожалению, в поисках проблемы слегка перепахал работу с SDRAM, так что... VGA завелось, PDP нет :)
- - - Добавлено - - -
Но это восстановить было проще. Собирается
- - - Добавлено - - -
Неть... сегодня не судьба..
(тупо смотря в экран) Может, виноват оптимизатор Квартуса?...
К сожалению - или в нем нет условной компиляции или я про неё не знаю. А автор делал код так, что бы (видимо) оптимизатор выкидывал не используемые блоки - не нужен для нас, скажем, контроллер RK05 - ставим количество устройств в 0 - и всё - никаких следов RK05 в результате..
Пример - последнее, с чем воевал сегодня - kl0_force7bit : in integer range 0 to 1 := 0; (сброс или несброс старшего бита (кто то его у автора не поддерживал - вот он и добавил код)). Беру (почти (ключевое слово) не тронутый) авторский файл, в котором он выставлен в 1 - заливка запускается и RSX даже начинает грузиться, но - перед или во время стартовой надписи RSX-11 тра-ля-ля - виснет. Потому что до эмулятора VT52 Патрона доходит или сигнал BREAK серийного порта или Ctrl-S (кстати, только щас дошло - стоит попробовать Ctrl-Q). И прикол ещё в том - если нажать кнопку Reset для PDP - дальше всё тип том. А сразу после заливки - хрен вам.
Сейчас прошивка (вроде) заработал, после того как в код добавил сигналы для VGA (которые пока никак не используются, но инициализируются) - и всё заработало. Контрольная сборка - проверка - и если работоспособность повторяется - моя отправная точка. Дальше пойду мелкими шагами.
- - - Добавлено - - -
Ну, отправная точка есть. Фиксирую :)
- - - Добавлено - - -
Не дописал третий абзац. Добавка:
А ставлю kl0_force7bit => 0 - и останов по адресу 0. Без каких либо шевелений...
- - - Добавлено - - -
Блин, в отправной точке - kl0_force7bit => 1
- - - Добавлено - - -
Попробую выставить kl0_force7bit => 0
- - - Добавлено - - -
Прошло с kl0_force7bit => 0. Кое что ещё до этого подредактировал. Новая отправная точка. Зафиксировал.
Всего то 5 дней мата, переделки кода, выдирания волос и... ТА-ДА-ДА-ДАМ!!!!
http://www.KpXX.Ru/PDPonFPGA/Железо/VGA/VGA Ready.mp4
Как обычно, извиняюсь за большой размер, тряску телефона и телефонное качество :)
- - - Добавлено - - -
Следующий шаг (ну кроме причёски кода - это постоянно) - добавить XU. Китайская плата для выхода на витую пару Ethernet есть - остался только вопрос - подойдёт или нет. Но это уже не сегодня :) Вечерами на неделе и след выходные :) Посмотрим, сколько мата ЭТО будет стоить :)
- - - Добавлено - - -
БК-2011 с PDP-11/70 на борту :):):):)
ну полсе прически кода и ДО эзернету - сам то код увидеть можно будет?))
zebest - код основан на http://pdp2011.sytse.net/wordpress/
Пока вся переделка - под DE10-Standard. Само ядро автор достаточно хорошо сделал независимым от конкретной модели FPGA
Если у Вас тоже DE10-Standard - хоть щас :)
у автора же без VGA ? мне "хоть щас" исходник крайний интересует, я уж подо что нибудь его скомпилю :( Можно в архиве, не облизательно git
у автора же без VGA
Как раз от него у меня VGA и работает (и не сильно нравится, но это переделка будет точно не сейчас - сначала восстановлю полностью функционал)
Организация примерно такая - есть ядро PDP-11 плюс папка с top элементом под конкретную плату или даже несколько вариантов под одну плату. В ядре есть модуль VGA плюс модуль VT (модуль очень простого видеотерминала, если правильно помню, автор реализовал только CR и LF)
Так если нужен вариант не под DE10-Standard - можно забрать отсюда - http://pdp2011.sytse.net/wordpress/download/
Если же на плате полноценная микросхема DAC, а не DAC, собранный на резисторах - я подскажу, что сделать, что бы заработал VGA от автора. Если на резисторах - насколько я понимаю, ничего делать не придётся (но у меня только одна плата и проверить я не могу)
Сегодня ничего нового не делал - только код причёсывал :)
Теперь в моём распоряжении УК НЦ-2018. Тоже двухпроцессорная (PDP-11/70 как ЦП и PDP-11/20 как ПП). На ЦП 1920 килослов, на ПП пока не понял :) ПП пока рулит только VGA :)
Код более менее причесал.
Добавил второй порт терминала. Программа autoconfig-a в RSX его нашла :) Генерирую вторую системы на FPGA. Общался с SYSGEN-ом через VGA и PS/2 клавиатуру :)
- - - Добавлено - - -
КЦГД что ли попробовать сделать :)
- - - Добавлено - - -
Двухтерминальная RSX :)
КЦГД что ли попробовать сделать Не стоит. И вообще, все эти упражнения с VGA - это взгляд вслед уходящему поезду. Возьми в руки любую современную видюшку чуть поприличнее (не самый отстой). Сколько на ней портов VGA? Правильно, меньше единицы. То есть, единственный порт DVI на ней комбинированный: DVI-D (цифровой) и DVI-A (аналоговый, который, по сути, тот же VGA, только разъем другой). Обрати внимание: даже порт DVI всего один. Зато всяких HDMI или DP - по паре! Или глянь на телевизор (ЖКИ). В телевизорах постарше обязательно был порт VGA, чуть моложе - DVI, в новых же ни того, ни другого. Зато HDMI штуки три, не меньше.
Такими темпами лет через 10 монитор с VGA тоже станет раритетом. Это одна сторона проблемы. Вторая - это тот факт, что все нынешние мониторы - ЖКИ, OLED и т.п. имеют единственное правильное разрешение - их родное, количество физических пикселей их экранов по горизонтали и вертикали. То есть, конечно, если подать на монитор видеоданные с другим разрешением, моник это как-то преобразовывает, но результат преобразования смотрится, обычно, коряво - края букв и другие подобные элементы изображений всегда размазаны.
То есть проблем, собственно, две. Первая - обеспечить работу более-менее свежих устройств отображения видеоинформации - через что-то, вроде HDMI/DP, на худой конец DVI, это в дополнение к обычному VGA. И вторая - обеспечить более-менее приличную конвертацию разрешения наших ретро-устройств в современные разрешения мониторов.
Как их решать - тема отдельной дискуссии, но, по-любому, работы очень много.
Зато всяких HDMI или DP - по паре
На моей плате только разъем VGA. Для HDMI или DP нужны свободные пины - а их у меня всего 36 и некоторые уже заняты, так что по любому - ничего кроме VGA
Такими темпами лет через 10 монитор с VGA тоже станет раритетом
Я думаю, предсказывать - не интересное занятие. Уже сколько кричат, что все перейдут на SSD, а винчестеры вымрут как класс. Вот только проблемы - как оказалось три, а не две, как я думал - стоимость (ну ка посчитайте мне стоимость перевода моих порядка за 120 терабайт на SSD), деградация при записи и постепенный разряд ячеек (причём, чем старше - и с точки зрения года выпуска и с точки зрения интенсивности использования или чем выше температура - тем быстрее разряжается). Забыл, понимаешь ли, SSD с любимой порнушкой на подоконнике - вечером домой пришёл - а вся добытая тяжёлым трудом инфа пошла попи... в общем стерлась.
То есть проблем, собственно, две
Очень больших проблем, собственно, одна - есть софт, написанный под кучу древних видеоконтроллеров. И так же как с VGA мониторами (есть куча устройств, которые другое не поддерживают) - необходимость его поддержки. А значит - реализация соответствующих контроллеров. Я не знаю как там на дискретной и не очень логике, но на FPGA - не сложней бинома Архимеда.
Проблема менее масштабная (старые мониторы телевизоры пока ещё находятся без особого труда и за вменяемые деньги) - конвертация. Я не железячник - так флаг не мне в руки.
наших ретро-устройств
И самое главное - мне не обязательно аутентичное устройство - меня вполне устраивает вариант в FPGA - тем более, что это всё сильно напоминает микропрограммирование - а на нем и сама DEC не гнушалась делать устройства.
- - - Добавлено - - -
И ещё про конвертацию. Если делать FPGA аналог какого-то видеоконтроллера, то до конвертации аналогового сигнала в цифру, преобразование и конвертации цифры в аналог дело не дойдёт - будет преобразование (цифра в цифру) и в аналог. Что IMHO, значительно проще
Возьми в руки любую современную видюшку чуть поприличнее (не самый отстой). Сколько на ней портов VGA? Правильно, меньше единицы. То есть, единственный порт DVI на ней комбинированный: DVI-D (цифровой) и DVI-A (аналоговый, который, по сути, тот же VGA, только разъем другой).
Тут тоже тебя расстрою. В послендее время чисто DVI-D, без всякого аналогово сигнала. Нету там ничего комбинированого. Меняешь видюшку на современную - меняй и монитор :(
обычная 1050, VGA нет никакого, даже через переходник, ну если только через активный преобразователь HDMI2VGA
https://c.dns-shop.ru/thumb/st1/fit//wm/800/650/a5e9538f488f96f3c2aec24532aba977/a761aee3870259aefed9c627c2381aa3196b9e9f3c5a73f9f9 ceb3237d4eddf9.jpg
вторая - обеспечить более-менее приличную конвертацию разрешения наших ретро-устройств в современные разрешения мониторов.
На более менее приличных dev-board уже ставят HDMI, а там уже немного проще, программно-аппаратный апскалер, на входе сигналы VGA - на выходе чистый HDMI, особо парится не надо, все синтезируемое ретро-старье кажет в разрешении хоть 1920х1080
zebest, исходники с сайта PDP-2011 скачал?
скачал. еще полгода назад. я не такой фанат PDP, чтобы в там разобраться. Так что мимо, я уже говорил. Буду ждать, может когда нить добрые люди синтезируют ДВК-2
я не такой фанат PDP, чтобы в там разобраться
На самом деле, я в саму реализацию PDP-шных объектов и не совался. Да и не PDP-шником там для начала надо быть, а VHDL-ником.
А именно ДВК-2 нужен?
А именно ДВК-2 нужен?
ну я когда то на нем живом работал, с зелененьким монитором. вроде двойка была. а может и тройка? НостальжИ, т.с.
Конкретно ДВК, там, конечно нет, по умолчанию собирается PDP-11/70, хотя, что бы понастальгировать - вопрос в другом - что собираетесь делать? Программировать - без вопросов, играть в игрушки - если графическая - то облом - нужны модули конкретных графических адаптеров - тут модуля VGA не хватит от слова совсем, если же текстовая - без проблем.
И самое главное - есть по крайне мере один файл (или два), которые зависят от конкретной железки, куда собираетесь синтезированное заливать. Именно с ними, как я уже писал - я и возился - под свою железку.
Я думаю, предсказывать - не интересное занятие. Уже сколько кричат, что все перейдут на SSD, а винчестеры вымрут как класс.Уже вымирают. Вспомни 10 лет назад: каждые год-два емкость винчестеров удваивалась, старые сильно дешевели... Где это всё? Нет, и больше не будет. Более того, на то, что есть, цены растут. Это потому, что компьютер перестал быть продуктом массового потребления - сейчас он перешел в категорию "профессиональный инструмент". Тиражи падают, цены растут... Массовый потребитель перешел на андроиды, данные потихоньку переползают в облака, и все!..
Тут тоже тебя расстрою. В послендее время чисто DVI-D, без всякого аналогово сигнала. Нету там ничего комбинированого. Меняешь видюшку на современную - меняй и монитор Вот-вот, тем более. Впрочем, интеля в своих набортных видюхах, вроде-бы, еще делают порт VGA...
ну я когда то на нем живом работал, с зелененьким монитором. Скорее всего, ДВК-2 с классическим 15ИЭ-00-013 (более поздние были уже с монитором 6105, серенькие).
На моей плате только разъем VGA. Для HDMI или DP нужны свободные пины - а их у меня всего 36 и некоторые уже заняты Это я к тому, что КЦГД надо делать не в этом проекте и, скорее всего, на другом железе.
Впрочем, интеля в своих набортных видюхах, вроде-бы, еще делают порт VGA...
Как то тоже на последних материнках only DVI-D мне , по крайней мере, встречаеЦЦа, да и на предыдущих поколениях - то жи.
Я даже выкинул на ветер аж 100 рублей, кЕтайцы честно прислали типааа переходник DVI-D => VGA, но он ожидаемо не работал, что я с успехом а5 же лично для себя и доказал. Поэтому при крайней нужде пользуюсь преобразователем HDMI2VGA, более менее сносно работает
каждые год-два емкость винчестеров удваивалась
А что, придумали как писать не на атомах, а на элементарных частицах? Количество транзисторов и частоту процов тоже обещали удваивать вечно - но ограничения технологий никто не отменял. А пока - по надёжности винты ещё никто не обошёл - и смерть их будут предсказывать ещё долго
Более того, на то, что есть, цены растут
По тому, что я трачу на винту - не растут, а падают
КЦГД надо делать не в этом проекте
Мой проект, что хочу, то и делаю ;) А учитывая, как устроен КЦГД - большая часть кода для него уже есть.
скорее всего, на другом железе
Когда у меня будет железка с HDMI или DP - тогда и попробую
- - - Добавлено - - -
DNS
В продаже 568 моделей, с VGA разъёмом - 399
В ценовом диапазоне до 6000 рублей - 27 на 27
6001-8500 - 90 на 87
8501-11000 - 97 на 96
11001-15000 - 89 на 84
15001-20000 - 78 на 50
дороже 20000 - 186 на 54
AFZ, ты серьёзно собрался для ретрокомпьютера покупать монитор дороже 20к? Тогда тебе действительно есть почему волноваться.
А до 15 штук можно не париться и брать почти любой
Последнее, что осталось сделать в рамках исходного проекта - подцепить адаптер Ethernet.
К сожалению, из-за всего двух пар питания (одна +5В, вторая +3.3В), отсутствия проводов разветвителей и отсутствия (пока, по крайне мере) желания их делать - буду делать на хлебной доске :) Переподключил адаптер SD, проверил работоспособность.
Теперь - подключение Ethernet адаптера и описание его пинов для Циклона.
- - - Добавлено - - -
Провода развёл, сигналы расписал, синтез запустил.
CodeMaster
11.04.2018, 19:09
В продаже 568 моделей, с VGA разъёмом - 399
И это без учёта всяческих конвертеров видео на Али за копьё.
Ну, старая, добрая, непонятная ошибка, когда после загрузки кода запускается только VT, а основной проц стоит на 000000
- - - Добавлено - - -
И это без учёта всяческих конвертеров видео
У меня FPGA, на котором я могу собрать что угодно из ретро-компов и вывести на VGA - на фига мне конвертеры?
- - - Добавлено - - -
Вторая попытка :)
- - - Добавлено - - -
И снова жопель :) Лана, бум потихоньку двигаться :) Попытки три ещё сегодня успею сделать, может четыре :)
- - - Добавлено - - -
Помнится, когда я выход на сом делал где то примерно на тех же разъёмах - оно тоже сопротивлялось. Переставил выше. Синтез
- - - Добавлено - - -
Не знаю, почему так, не знаю, будет ли этот способ работать всегда - но вроде я нащупал - как обходить любимую ошибку. Почему то, если внешние пины напрямую подключать к синтезируемым компонентам (например, сейчас - к синтезируемому XU) - хороший шанс словить незапуск. Так же было при первых попытках подключить VGA. Описал сигналы, пины подключил к сигналам, а уже сигналы завёл на интерфейс компонента - и вуаля - мы снова щастливы, мы снова работаем. Правда, аутоконфиг RSX XU не нашёл. Фиг пока с ним. Запустил стандартный тест - полный SYSGEN. Чё получится - проверю утром - а щас - спатькать.
- - - Добавлено - - -
Адреса XU, по крайне мере, откликаются. Похоже завтра буду мучать модуль TCP/IP для RSX :)
Собрал систему с драйвером XE: (XU и XE - одно и тоже устройство для шин QBUS и UNIBUS соответственно, ЕМНИП). Система по крайне мере в онлайн его переводит. Дальше нужна поддержка со стороны системы - или DECNET или BQTCP-TCPIP. Вечером :)
TCP/IP - PDP ждёт тебя :) Нус, приступим :)
А ещё, млин!!!!! даже виртуальные провода нехило бы присоединять друг к дружке :)))))))
Запустил синтез :)
- - - Добавлено - - -
Сопротивляется.. может сетевуху не так подключил... может не знаю что..
- - - Добавлено - - -
В общем, пока сетевуха не завелась.. Как обычно - бум думать :)
У меня сетевой модуль - не тот, который был у автора. И похоже, нужно допиливание под мой....
Приведу в рабочее состояние, так что бы XE(XU) был синтезирован, подключен и система не вставала на 000000. Маленькими шажками
- - - Добавлено - - -
Хе. Похоже дочери буду передавать наследство компьютерщика. Победила на конференции для школьников и студентов, который проводил аэрокосмический, а в Артеке мучает программированием роботов и преподов :)
О! Синтез дал новый вариант ошибки - теперь вообще не запустилось и на индикаторе вообще тишина :):):)
Хм.. Похоже нашёл главную причину ошибки - Не Стартуем И На Индикаторе Все Нули. Автор сделал... как бы это помягче сказать... занимательно, что ли, генератор тактовой частоты для процессора - в качестве генератора выступает контроллер памяти (dram). В результате формально никаких ожиданий доступа к памяти :) Но иногда (похоже) контроллер памяти не заводится. А вот почему - херен его знать... Чего то похоже с таймингами работы его контроллера. Поставил на старте сигнал, который делает ДЛИННЫЙ РЕСЕТ, в 1. Синтез, который без этой установки давал Все Нули, с ней - завёл проц после загрузки вполне себе так ничего. Зырю дальше. Пока занят причёской кода - но косюсь и на контроллер Ethernet
Прикольно всё таки реализована в VHDL (язык) или Quartus-е (среда разработки) условная компиляция.
Если проводить аналог с классическими языками программирования - вызовы процедуры анализируются на предмет значений параметров и если какая то часть процедуры зависит от конкретного параметра, а с таким значением параметра ни одного вызовы процедуры нет - то эта часть кода просто не компилируется. Ну понятно, что это возможно, когда такой параметр всегда используется в вызовах в виде константы.
В классических языках программирования условная компиляция (по крайне мере то, что вспоминается) реализована совершенно отдельными конструкциями языка.
Плюсы такого подхода - синтезированное описание содержит только то, что в данном проекте используется. Минусы - нет понятия откомпилированных библиотечных модулей (или я пока про них не знаю) и синтезатор (язык не поворачивается назвать его компилятором) должен иметь доступ ко ВСЕМ ИСХОДНЫМ текстам.
Хотя есть ещё понятие IP cores - они слегка напоминают библиотечные модули, но пока мой опыт работы с ним говорит о том, что я от использования их на выходе получаю описание в VHDL (или Verilog), который потом опять же обрабатывается синтезатором
оффтоп. IP cores (подразумевается что корка уже написана, проверена и она считается "библиотечным элементом") "компилятся" один раз в проекте, заново собирается только ТОП проекта (синтез - это компиляция исходных файлов). но разводка по плисе все равно идет по всему проекту (это как линовка в Си). Плюс в том что синтез нужен только для изменяемой части проекта. Минус используется больше ресурсов. тк отсутствует оптимизация между корками (оптимизация осуществляется в пределах корки). но это тоже "плюс" - меньше глюков при глобальной оптимизации. тк обычно каждая корка отлажена и проверена.
AlexG, в этом проекте используется одна IP core - PLL, но с её использованием сделаны два clock.
Не совсем понял, что подразумевается под TOP проекта. В конфиге указан качестве TOP-а
set_global_assignment -name TOP_LEVEL_ENTITY PDP11
а такими операторами
set_global_assignment -name VHDL_FILE PDP11/cpu.vhd
есть ссылки ещё примерно на 27 файлов (включая PDP11.vhd в котором собственно код TOP элемента)
Плюс то, что сгенерировало добавление PLL
set_global_assignment -name QIP_FILE pll.qip
set_global_assignment -name SIP_FILE pll.sip
set_global_assignment -name QIP_FILE pll2.qip
set_global_assignment -name SIP_FILE pll2.sip
из них идёт ссылка на компонент pll_0002 - если я правильно понимаю, как раз такой "скомпилированный" библиотечный модуль, как я понимаю
И если я правильно понимаю, все эти примерно 27 файлов при синтезе полностью обрабатываются.
Где я ошибся в предположениях? :)
сорри - не силён в альтере. ксайлинк у меня. но принцип тот же. IP-корки это к примеру та же ПЛЛ, процессор, UART, SPI, контроллер SDRAM итд. под ТОПом подразумевается то что написано своими руками для "склейки" сих корок. Сии корки - это уже кем то написанные исходники, проверены, отлажены, оптимизированы. В ксайлинксе это (корки) "оформлено" как отдельный комплект исходников(отдельный проект). В Вашем случае судя (ИМХО) по всему корки не используются совсем. PLL-в общем смысле да, является коркой, но по сути это всего лишь "обёртка" аппаратного модуля плисы.
Посмотрел описание IP cores. Их аж три типа выделяют.
Получается, что у меня используется некоторое количество аппаратных core (типа разъёма PS/2 который для меня видится как два входных сигнала).
А PLL, похоже программная - синтезируется из ячеек - и сигнал на вход - клок от аппаратного генератора (опять один входной сигнал). Но не наверняка.
Ну а всё в .vhd в понимании xilink - похоже TOP.
Хотя в Altera TOP (ну по крайне мере в моём понимании) - это модуль, порты которого (по именам) привязываются в pin-ам кристалла, которые обычно именуют в понятном для человека виде (типа FB_VGA_RED, а не PIN_AK29), и для удобства выносят описание этих имён в отдельный файл.
Такой поход, кстати, позволил мне достаточно быстро перенести проект с одной платы для разрабов на другую. По сути до сих пор я трогаю только два файла - описание пинов и тот самый TOP
скюз ми - ни разу не видел аппаратных корок для ps/2 внутри плис альтера. вся логика плис делиться на плл, лут, тригера, блочную память (это типа джентльменский набор). При этом ПЛЛ это грубо говоря синтезатор частот. на вход поступает внешняя частота (в общем случае с генератора) - на выходе требуемая частота для работы "схемы" внутри плис. Это такой аппаратный модуль (чёрный ящик), который настраивается снаружи (заданием нужных сигналов на выводах этого ЧЯ). а корка облегчает сей процесс (там очень много различных параметров) те создаётся некий исходный текст в котором будут прописаны все параметры этого ЧЯ. Весь проект состоит в общем случае из hdl-описания(vhdl, verilog итд) и файлов ограничений (задание временных ограничений, назначение соответствия цепей внешним выводам, а также их типа ttl, cmos , lvd итд), .
пс: я под забыл которая плис у Вас используется? Я не совсем корректно применил понятие ТОП. ТОП - это модуль который больше нигде не используется (в других модулях).
не видел аппаратных корок
Я не совсем корректно выразился. Я не имел ввиду, что это внутри кристалла, я имел ввиду, что я PS/2 использую как что то готовое - без синтеза в тексте.
Посмотрел по описанию - вроде как есть и аппаратные PLL (в количестве шесть штук) - но аппаратный у меня или нет - на моём текущем уровне знаний даже гадать не буду :)
У меня вот эта модель -
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=1098&PartNo=2
но как выяснилось после того, я начал активно с ней играться - можно было вполне взять плату, лежащую в её основе -
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=1098&PartNo=2
потому как задействовать экран, USB для клавиатуры, SD карту и Ethernet адаптер (то есть сделать почти самодостаточную PDP-11) я смогу в несколько отдалённом будущем - когда скилы прокачаю :)
Чёт я сегодня в "ударе". Напрочь забыл по "SoC".
https://www.xilinx.com/content/dam/xilinx/imgs/block-diagrams/zynq-mp-core-dual.png
Там действительно есть аппаратные USB, EATHERNET итд. По сути это: "обычный" процессор с периферией + классическая плис = SoC (у самого лежит отладка на базе ZINC)
http://zedboard.org/product/zedboard
ПС обе Ваши ссылки одинаковые и "идут" на описание платы "VEEK-MT2S". так которая у вас плата ?
На SOC-е там действительно есть много чего интересного - но нужно писать модули общения между FPGA и SOC-ом (хотя там много чего сделано для упрощения - но - это мой следующий этап, пока я трогаю только FPGA)
Но кое что (типа PS/2 и выхода на VGA) подключено непосредственно к FPGA - поэтому с синтезированным PDP-11 я общаюсь через (PS/2) клавиатуру и картинку на мониторе, подключённым к VGA (и соответственно есть модули взаимодействия с ними). Сейчас кроме причёски кода косюсь на модуль работы с адаптером Ethernet (который внешний, как и SD карта, а не те, которые на SOC-е висят)
У меня именно VEEK-MT2S, но по сути это DE10-Standard:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=1081&PartNo=2
плюс ЖК экран. И если бы на момент покупки чуть больше ориентировался в платах - возможно взял бы и DE10-Standard - использование ЖК экрана (а он подключён к SOC) - возможно, в будущем, но не сейчас
Вчера было первое вмешательство в КОД авторы проекта. У меня размер SDRAM несколько больше, чем у автора и не нравится, что фактически всем управляет контроллер SDRAM. Поправил первое (правда, PDP-11/70 от этого ни холодно, ни жарко - 16 или 64 мегабайта доступно в принципе - но в купе со второй правкой это позволит мне использовать память в других компонентах) и смотрю на код, думая, как решить вторую проблему.
После правки RSX не отказалась работать :)
Вопрос на форуме программистов:
- ЭтаНуТипаУменяПробелПолом алсяЧеДелатьТо?
Ответ:
- Настоящие_программисты_про белы_не_используют
Фсё, заип.... замучался с авторским модулем DRAM, нашёл в инете, щас занят пристеплированием
- - - Добавлено - - -
Эт я погорячился... Знаниев пока не хватат. Пока оставлю, причешу всё, не трогая модуля DRAM
Фсё, заип.... замучался с авторским модулем DRAM, нашёл в инете, щас занят пристеплированием Эт я погорячился... Знаниев пока не хватат. Пока оставлю, причешу всё, не трогая модуля DRAM
не DRAM а SDRAM, был бы DRAM было бы все гораздо проще (там просто мультиплексированная шина)
не DRAM а SDRAM
Да, поправка, SDRAM. Замыленная голова уже была.
В принципе, в логике работы уже более менее разобрался, но прикол в том, тактовый генератор для проца в этом проекте реализован в модуле работы SDRAM. Поэтому - типа никаких ожиданий. А если присобачивать классический - надо в модуль проца вставлять ожидание чтения записи памяти. А модуль проца там ещё та загогулина - в нем разобраться - не один вечер.
Да, поправка, SDRAM. Замыленная голова уже была.
В принципе, в логике работы уже более менее разобрался, но прикол в том, тактовый генератор для проца в этом проекте реализован в модуле работы SDRAM. Поэтому - типа никаких ожиданий. А если присобачивать классический - надо в модуль проца вставлять ожидание чтения записи памяти. А модуль проца там ещё та загогулина - в нем разобраться - не один вечер.
На скоко я понял бывают схемы:
1) ассинхрононная без ожиданий (ну типа SRAM или мультипортовый SRAM);
2) синхронная без ожиданий (но тогда есть timeslots - скоординированный поочередный доступ);
3) ассинхронная с ожиданиями;
и SDRAM и DRAM требуют refresh-а а потому могут работать только по 2 и 3 варианту :(
Непонятность, вырезанная с корнем - нажатие на кнопку Reset сбрасывало ЦП, но почему то на этот сигнал не реагировал проц модуля VT - из за этого (но не понятно почему) часто зависала работа с клавиатурой. Сделал отдельный Reset для модуля VT - стало работать в этом плане стабильно.
Ещё одно ковыряние в проекте - и теперь (ТТТ) вроде как после сборки он начал запускаться (не возникает ошибки 000000) стабильнее. Запустил синтез для проверки - до этого попытка выставить скорость на последовательных портах в 38400 гарантированно приводило к этой ошибке. Ну-с, посмотрим, что будет в этот раз.
- - - Добавлено - - -
Ну надо же :)
- - - Добавлено - - -
Ну раз пошла такая пьянка - попробую ещё одно изменение, которое гарантированно вызывало 000000
- - - Добавлено - - -
Нее, этот фокус не прошёл... - подключить inout сигналы напрямую на top level пины - даже синтезатор ругаиЦЦа...
Почти вся работа с TOP модулем для DE10-Standard закончена.
Осталось только дождаться сетевого модуля и прикрутить-проверить его.
Много мистики - из разряда - две строчки переставляем местами - и опаньки - проблема в работе.
Похоже, зря грешил на модуль поддержки SDRAM. Для того, что бы понять - он или не он - приделал индикатор тактового сигнала (который для процов генирирует модуль SDRAM) - в общем, пока он у меня моргал всегда, не смотря ни на какие проблемы. И судя по тому, что проц из модуля VT работает вполне ничего себе (но у него своя сгенерённая память) - причина кроется где то в основном ЦП. Бум думать и смотреть. И ждать плату сетевухи :)
Поскольку идея о не запуске тактового генератора от модуля SDRAM провалилась (ну работает эта зараза всегда) - полез разбираться в модуль CPU
Как записать 16-ти битный вектор в восьмеричной нотации - 16o"165020"
Требуется компилятор, поддерживающий VHDL 2008
LeoN65816
01.05.2018, 23:48
Как записать 16-ти битный вектор в восьмеричной нотации - 16o"165020"
16'o165020, не?
16'o165020
Я немного про другое. Каждая восьмеричная цифра - это три бита, так что 165020 - это 18 бит. Если проц (как PDP-11) 16-ти битный - то, скажем в 16-ти битный регистр о"165020" - не запишутся (в то время как четыре шестнадцатеричные цифры дадут 16 бит). Автор PDP-2011 использовал из за этого шестнадцатеричные константы - что для истинных пидипишников - не комильфо :) Я долго использовал такой вариант - '1'&"65020" - что то же не очень. А сегодня наткнулся на такой вариант - 16o"165020".
И кстати - 16o'165020 (или 16o'165020') - у меня дали ошибки при компиляции - нужны именно двойные кавычки - строка, а не один символ в данном случае
Добавил кнопку Continue (Продолжить) - продолжить работать после команды HALT. RSX-11M-Plus штатно продолжила работу.
Добавляю кнопку Step (Шаг) - в зависимости от положения переключателей (на плате 10 штук, начинаю задействовать) - хочу получить выполнение или по одной команде за раз (вторая цель) или кнопка буде выступать в роли тактового генератора для процессора.
Дальний прицел - добавить управляющий процессор (УП) (что то типа схемы УК-НЦ, управляющей процессор будет играть роль, похожую на роль ПП).
Итого в полном наборе на плате будет 4 процессора - УП, ЦП, VT и XU(XE) :) Если не добавлю что то ещё :)
- - - Добавлено - - -
Блин, переключатели с дребезгом, в отличии от кнопок... Значит надо будет добавить и защиту от дребезга. Потом. Пока добьюсь работы в принципе. После сброса, например :)
- - - Добавлено - - -
Ну, как бы первая цель достигнута (надо ещё привязать ручной тактовый генератор к тактовому - если по хорошему). Можно даже посчитать количество тактов для команд :)
Добавляю кнопку Step (Шаг) - в зависимости от положения переключателей (на плате 10 штук, начинаю задействовать) - хочу получить выполнение или по одной команде за раз (вторая цель) или кнопка буде выступать в роли тактового генератора для процессора.А сделать микро-ODT, как в Э-60 не выйдет? ДВК-шная Shadow-ODT, конечно, посложнее будет...
А так же избавиться от дребезга :) Ну и в целом - ручной тактовый генератор нужен будет, думаю, достаточно редко. Шаговое выполнение команд, скорей всего, пригодится больше :)
- - - Добавлено - - -
А сделать микро-ODT, как в Э-60 не выйдет?
Пока не рискну - тут потребуется бОльшее вмешательство в модуль cpu - а я его только ещё в порядок (в плане читабельности) начал приводить. Сделать УП (по принципу УК-НЦ) мне кажется - несколько проще. А на выходе будет похожий результат.
- - - Добавлено - - -
А сделать микро-ODT
Или оно там висит как ПЗУ где то на странице ввода вывода? (у автора, кстати, есть второй вариант начального ПЗУ - там сделан что то типа нано-ODT)
Продолжаю борьбу с ошибкой 000000. Вывел на светодиоды сигнал - cpu в останове - получил от процессора, что таки да, он выполнил команду HALT.
Пришла пара сетевых модулей. Тех, которые использовал автор PDP-2011. Щаз попробуем :)
- - - Добавлено - - -
Пока результат - АфотХрен
- - - Добавлено - - -
Посмотрел отладочный вывод - модуль работы с Ethernet модулем плату вроде как опознал. Похоже, дело не в нем, а в софте. Копаю.
Или оно там висит как ПЗУ где то на странице ввода вывода? (у автора, кстати, есть второй вариант начального ПЗУ - там сделан что то типа нано-ODT) Нет, оно сделано в виде микропрограммы, когда исполняется команда (приходит сигнал) HALT, запускается микропрограмма, которая и исполняет действия упрощенной ODT.
Сигнал HALT проверяется после окончания исполнения каждой команды и не проверяется перед началом исполнения следующей. Поэтому, если продолжить исполнение программы командой P, а HALT при этом постоянно активен активен, получится пошаговое исполнение программы. Естественно, сама микро-ODT ничего не изменяет в программно-доступном оборудовании, если ее не попросишь это сделать.
Про HALT-mode ДВК рассказать?
Про HALT-mode ДВК рассказать
Спасибо, пока нет :) Основной принцип работы HALT я понимаю, тонкости понадобятся, когда буду пробовать реализовать - но для начало надо опыта поднабраться :)
В некоторой растерянности.
В проекте PDP-2011 вроде как синтезируется XE устройство. В доках BQTCP/IP упоминается оно же. А не работает. Причём то, что видно по логам и по тексту драйвера XEDRV (набор команд) - оно как бы разное - то, что ожидает XEDRV и то, что ожидает синтезированный XE. При этом взаимодействие синтезированного XE с модулем Ethernet - вроде как без проблем - ошибок не выдаёт, MAC адрес считывает..
Продолжаю копать...
- - - Добавлено - - -
Хотя нет, похоже я что то не так понял. Это не команда со стороны PDP, это что то другое. Продолжаю копать исходники
Склоняюсь к тому, что это мой косяк. Что бы разобраться с ошибкой 000000, тронул модули UNIBUS и CPU, а оно (из за ошибки 000000) - дело тонкое. Попробую использовать оригинальные UNIBUS и CPU.
Не прошло и трёх лет, как на сайте PDP-2011 новый пост :) http://pdp2011.sytse.net
Оригинальные модули - та же проблема.
Зато нашёл и устранил "почти мелкое" дрожание пикселей в буквах. Думал - из за конвертирования 640х480 в 1920х1080, оказалось - из за двух разные пиксельклоков (у автора платы с простым модулем VGA, у меня несколько более навороченный - переборщил с пиксельклоками :) )
Вчера под вечер налетел на то, что программирова..... ээээ... синтез железки в FPGA подчиняется тем же правилам, что и сборка в реале и что оно имеет (в некоторых случаях) существенное отличие от классического программирования :) Образно говоря - при программировании, если два или больше нечта (модуля, потока, процессора, компьютера) пишут что то в переменную (фактически - ячейку памяти) - это ВСЕГДА последовательный процесс, даже если программеру кажется, что параллельный :) А в железе это может быть (попытка, успешная или нет) и параллельный процесс. Ну а фактически я, по привычке программиста, попытался подать сигнал с двух выходов на один вход. Конечно, Квартис сказал - чё?.... :) Я сначала вообще не допёр - про что это, почему синтез не может провести :) Потом уже, едучи в трамвае и размышляя... Осенило :)
Да, да, знаю, если ОК - такой фокус провернуть можно :)
- - - Добавлено - - -
Не вчера, позавчера :):)
У меня получается такой список - 55-65, 68-73, 76-79, 115-119
120 грохнуть
Создал новую тему Эмуляция КЦГД, КСМ, КГД (вопросы и проблемы)... (http://zx-pk.ru/threads/29190-emulyatsiya-ktsgd-ksm-kgd-(voprosy-i-problemy).html) Arseny
Достаточно давно впилил в код FPGA ручной тактовый генератор, за вчера и сегодня добавил кнопку покомандного выполнения программы, а так же отображения состояния внутреннего автомата процессора. Всё для ненаглядной ошибки 000000. Сижу, изображаю из себя тактовый генератор :)
MacBuster
25.05.2018, 21:22
Удаление в знак протеста против действий MM
Можно морзянку заодно подучить
Там кнопки сильно неудобные. Зато их четыре :)
Делаю всякий отладочный вывод. Всё больше прихожу к выводу, что в схеме УК-НЦ ЦП-ПП заложено много ценного :) В принципе, как и в схеме VAX-консольный процессор :)
- - - Добавлено - - -
Arseny, спасибо!
Надоело пальцем жать, сделал тактовый генератор на 0.2 Гц. Похоже, слишком медленный :) Но прикольно наблюдать работу state аппарата :)
- - - Добавлено - - -
Посмотрел на работу с таким тактовым генератором, посмотрел на листинг ПЗУ. Вывод, который надо было давно сделать - ПЗУ автора совсем без ОЗУ не работают. Хотя бы в адресах 0-776 ОЗУ должно быть. Ок, попробую сделать небольшое ОЗУ в самом FPGA - заодно некоторые моменты отладить
- - - Добавлено - - -
Ковыряюсь в исходниках, краем глаза смотря на работу PDP с медленным генератором :) Вспомнилось из Понедельника - ... дошёл до буквы "и" в слове "передовую" :) Оно уже напечатало, что откликается адрес 177776 и что это psw :) Но скоро придётся прервать титанический труд - почти готова новая прошивка :)
дошёл до буквы "и" в слове "передовую"- ...я уже букву "К" нарисовал.
...
- Газета называется "За передовую магию". Покажи мне там хоть одну букву "К"!
:)
AFZ, а ты думаешь, ник - откуда ;)
Продолжаю пытаться отделить модуль ОЗУ, что бы он тоже был как устройство на шине uni(q)bus.. Частично уже что то есть. Самое главное - после того, как процессор перестал тактироваться от DRAM он запускается ВСЕГДА :) ТТТ, по крайне мере пока вылета на ошибку 000000 не было :)
Прикольно работает первая версия :) Читаешь, скажем, ячейку 0, а там... 0 (а не 123456, которые в коде), второй раз читаешь - и вот они - заветные 123456 :) Чуть чуть не синхронно - и труляля :)
Ну понятно, почему автор не хочет дизайн работы с памятью переделывать... Блин..
Муха-бляха! Кааааааак же не хватает последовательного выполнения операторов!! Единственный способ, который пока знаю - state machine + clock...
Первый синтез ОЗУ (пока синхронный, но выдаёт сигнал типа ACK, что память выдала данные на шину), который работает...
Так естественно, если клоки разные, ACK обязателен.
Так естественно, если клоки разные, ACK обязателен
В исходном дизайне проц тактируется от (sdram) памяти, поэтому никаких подтверждений - когда процу надо - память готова. К сожалению, мы живём не в идеальном мире и есть задержки и время смены сигнала - я подозреваю, что поэтому часто получаю нестартующий результат синтеза. Моя первая цель - сделать работающими независимо проц и sdram память - поэтому и нужно подтверждение. Пока у меня дизайн на синтезированной памяти и без задержек - теперь буду пробовать добавить (искусственные) задержки. Отработаю дизайн и синтез - буду подключать реальную память.
Второй результат - в такую синтезированную память можно дизайном загнать любое содержимое - например - тесты или сделать её как ПЗУ. Автор это дело использует для проверок, модуля видеотерминала и сетевухи. Проблема в том, что он расписывает содержимое памяти а) в виде двух блоков - отдельно чётные, отдельно нечётные байты и б) в шестнадцатеричном виде - делая загон содержимого памяти трудным (он листинг специально написанной прогой обрабатывает) и нечитабельным для труПиДиПишника. Я сделал так, что бы это были 16-ти битные слова и в восьмеричной кодировке - правильно сгенерированный листинг MACRO-11 будет достаточно слегка подрихтовать FAR-ом - и он будет читабельным
Сделал с задержкой. State machine наше всё для последовательного выполнения... Плюс clock, есссвенно :)
Пока не получается выставлять готовность памяти только по фронту такта, по спаду - Квартус сопротивляиица, а у меня не хватает знаний-идей, как преодолеть...
- - - Добавлено - - -
Поставил 50 МГц процу, 140 МГц памяти (пока синтезированной). Буду посмотреть, что на выходе - минут через 20-30 :)
- - - Добавлено - - -
Глюкает на 140 :) Попробую 100
- - - Добавлено - - -
На 100 вроде работает :) Но по хорошему - надо тест загонять :)
А ещё надо научиться делать буфер.. Куда сохранять прочитанное (или записываемое) на время действия сигнала - хочу читать - со стороны проца.. ну или там dma
Попробовал - АфДруГ - подцепить SDRAM :) В общем - единицы с шины данных я читать умею :) Не больше и не меньше :)
Продолжаю трах... пытаться связать проц и SDRAM
Нуу... просто разглядывание написанного ничего не даёт. В код автора попалась директива - как сохранить сигнал от исчезновения или переименования в процесс оптимизации. Учусь пользоваться Signal Tap-ом :)
Прикольная штуччччка :) Умеет группировать сигналы и показывать в шестнадцатеричном виде :) Посмотрел на прерывание по вектору 4 :)
- - - Добавлено - - -
Ура! Не только в шестнадцатеричном - но и в восьмеричном тоже :)
- - - Добавлено - - -
Плюс этой платы - не нужен осциллограф или логический анализатор
Минус этой платы - на синтез уходит минут 30-40
Плюс этой платы - при написании кода надо думать
Минус этой платы - при написании кода надо думать "параллельно"
(почесал нос) когда придумаю ещё - напишу
- - - Добавлено - - -
Правило номер 0.
Внутри FPGA двунаправленных сигналов нет. Они есть только снаружи. Поэтому - на входе разделять, на выходе соединять, внутри - только однонаправленные.
Ндя... с синтезированной памятью я крепко лопухнулся :) Оказывается, что бы синтезатор мог использовать встроенные блоки памяти (и не использовать логические элементы) - надо или делать строго так как надо или использовать IP Core :) Ну попробовал я сделать память на 32 Кб - квартус отказался - типа - нету у тебя столько LE. Попробовал 16 Кб (сильно удивившись от предыдущего) - он пыхтел всю ночь (порядка 7 часов), пытаясь распихать.. И мне надоело - как говорится - если всё сломал - пора читать инструкцию :) Пробую свой первый дизайн (не SDRAM) перевести на блоки памяти :)
Млин... чем больше читаю, тем больше нихера не понятно. Это я про process.. Придётся сделать специально проект для изучения process..
Придётся сделать специально проект для изучения process..Когда окончательно озвереешь от FPGA, достань из кладовки ту самую платку с SFM32F407 и запусти на ней пример от Чана, а то я близок к завершению своего макета. У Чана пример сделан для STM32F100, да еще и не доведен до конца (и еще он на CooCox'е), надо бы все это аккуратно спортить под Кейл и под F407. :)
достань из кладовки ту самую платку с SFM32F407
Не поверишь - на столе лежит :) Вместе с жк-экранчиком :) И есть один нюанс - много кода от Gotek-а должно подойти :) Я сначала пробовал Gotek-овский проект загнать в Keil, но чего-то он слишком много мата вывалил и тогда я раскрутил скрипты, которыми автор Gotek-а собирает, даже пробовал свой код писать туда :) В общем, не то, чтобы проект активно развивался, но он отнюдь и не заброшен. Даже кака никака макетка для Кванта приобретена :)
Когда окончательно озвереешь от FPGA
На самом деле, не всё так плохо - только надо бы всё таки найти хороший учебник. А то пока больше методом ненаучного тыка. Хотя он приводит к железобетонной, отлитой из гранита памяти :)
- - - Добавлено - - -
достань из кладовки
Гы :) Вторая её сестра действительно в кладовке лежит :) Со всяким барахлом для прототипирования - типа хлебных досок :)
Сброс, тактовый генератор (Полноскоростной и 0.5Гц-овый и переключение между ними) в совокупности работали не правильно.
Поправил.
Вроде теперь без проблем запускается как при прошивке, так и при сбросе, как при начальном режиме Полноскоростной, так и при 0.5Гц-овый.
За исключением переключения с полной скорости в 0.5 Гц-овый режим (дребезг переключателей) и режим Выполнить Одну Команду и Ждать - но это не сейчас, как-нибудь.
Теперь учусь в Signal Tap ставить триггер запуска. Вроде на первый взгляд все ок, но при запуске пишет - пре-триггерный захват.. Из за этого не могу увидеть, что происходит сразу после сброса (как при прошивке, так и при нажатии кнопки Reset).
Продолжаю чесать репу...
Ну.. На быстром (50 МГц) клоке триггер запуска срабатывает. А если поставить медленный (0.5 Гц) - жилище северо-американского коренного жителя. В принципе - уже неплохо - когда буду опять пробовать память подключать - меня больше скоростной режим и интересует. На крайняк (что бы увидеть, чего творится) - можно будет специализированную микро-пзу-ху залепить.
Прикольный момент.
У автора модуль процессора выставляет адрес чтения инструкции из памяти и только на следующем клоке - сигнал чтения. Но модуль типа-ПЗУ выдаёт данные уже на первом клоке. Неправильные (установлен 15 бит). И только на втором клоке (когда прилетает сигнал чтения) - данные становятся правильные. Уже даже любопытно - какого??
Какого какого. Типа - UNIBUS и QBUS - шины с ОК плюс оригинальный дизайн автора. Почикать надо :)
Вроде почти всё, плюющее свои данные на шину данных при выданном адресе, но ещё не выданном сигнале чтения - почикал. Если только в не задействованных модулях ещё остался код.
Но, %ц%ко, ПЗУ-уха так и бросает. Может, Signal Tap из за того же клока, что и проц - не ловит не большую задержку в выдаче сигнала чтения?..
- - - Добавлено - - -
Щас забабахаю ему ешё 100MHz-овый клок...
Кстати, похоже сообразил, что не так с 0.5Hz-овым клоком. Но позже попробую
Надоело трахаться с месивом из клоков. Переделал. Опорный клок используется для signal tap, он же генерирует клок для процессора - 50MHz и 0.5Hz в зависимости от режима, он же моргает светодиодом раз в секунду.
Фигасе.. Даже переключение частоты на ходу заработало и плевало оно теперь на дребезг :)
Продолжаю отлаживать клоки и связку с Signal Tap.
На шинах опять пакостит ПЗУ - вылезают его (???) сигналы до сигнала запроса на чтение.
- - - Добавлено - - -
Хотя может я и зря бочку качу на ПЗУ, может это модуль UNIBUS - он у автора тааак своеобразно реализован.. Что если захочешь добавить свой контроллер - не из числа реализованных - мат будет пятиэтажный. Как только отработаю работу с памятью (как синтезированной, так и SDRAM) - будет большая разборка с UNIBUS
Для копающихся в VHDL - информация к размышлению :) Да, в принципе банально, но вдруг кому пригодиться.
Как уменьшить количество описываемых сигналов в компонентах и соединениях? Объединять сигналы. Пример:
Описываем:
-- (Signals To the bus) physical signals driven -out- to the bus by cpu or busmaster peripherals
type BusSignalsTo is
record
Addr : std_logic_vector(21 downto 0); -- physical address
ctrlDataIn : std_logic; -- if '1', this is an input cycle
ctrlDataOut : std_logic; -- if '1', this is an output cycle
ctrlDataOutB : std_logic; -- if '1', the curr out cycle is for a byte
DataOut : std_logic_vector(15 downto 0); -- data out from cpu or busmaster peripherals
end record BusSignalsTo;
-- (Signals From the bus) physical signals driven -in- from the bus by cpu or busmaster peripherals
type BusSignalsFrom is
record
AddrMatch : std_logic; -- '1' if the address is recognized
DataReady : std_logic;
DataIn : std_logic_vector(15 downto 0); -- data input to cpu or busmaster peripherals
end record BusSignalsFrom;
type Signals is
record
sTo : BusSignalsTo;
sFrom : BusSignalsFrom;
end record Signals;
Используем:
component unibus is
port(
-- bus interface
BusOut : out BusSignalsTo
; BusIn : in BusSignalsFrom
...
signal Slot0 : Signals;
...
pdp11: unibus port map (
BusOut => Slot0.sTo
, BusIn => Slot0.sFrom
Итог - по две строчки (вместо восьми) в компоненте и отображении портов компонента на сигналы. На ЛЮБОМ количестве сигналов.
Почему две? Потому что, сцу... плохая собака - в описании типа (в нашем случае - записи) нельзя указать тип (in, out или ещё какой) поля. Только в описании сущностей - что в них входит, а что выходит. Поэтом приходится комбинировать в два типа - один - входные сигналы, другой - выходные.
Самое главное - при правильном подходе не подсоединишь не то не туда и не забудешь подсоединить.
Вся моя возня примерно уже с месяц как c исходниками проекта всё больше убеждает меня в том, что все проблемы с ошибкой 000000 и ей подобными - это результат, мягко говоря, неудачного решения автора работы с SDRAM. За последние два дня УЖ КАК Я ТОЛЬКО НЕ ИЗДЕВАЛСЯ над исходниками - особенно последние сутки - запускается и откликается.
К сожалению, полностью проверить синтез (ака загрузить RSX) не могу - модуля памяти пока нет. Идёт глубокая переработка того, как отдельные модули взаимодействуют друг с другом - и результат будет - ДА ДА ДА! - больше похож не PDP, чем у автора. Не то, как работает модуль процессора - там всё достаточно неплохо - а именно взаимодействие - типа - как сигналы передаются и обрабатываются, если процессор полез в память или обратился к контроллеру DB.
Пока достаточно простая часть - фактически - редактирование текста - ничего нового не добавляется, ничего старого не удаляется. Но текст становится проще для понимания.
Почему не работает?
Почему почему. Потому что кто-то взял и забыл включить синтез системного (177560-177566) терминала :)
MacBuster
17.06.2018, 17:32
Удаление в знак протеста против действий MM
Уф... сдвинулся с мёртвой точки (читай - разобрался в очередной VHDL-ной хрени). Более менее понял, как использовать RECORD :) И оно не работало (см предыдущее моё сообщение) не только потому, что системный терминал отсутствовал, оно ещё не работало потому, что я не правильно делал :) Ещё не совсем полностью работает - но по крайне мере не встаёт как вкопанное :)
- - - Добавлено - - -
А вот очередное изменение показал, что я иду в правильно направлении - ожидаемое заработало полностью. Двигаюсь дальше :)
- - - Добавлено - - -
Круть! Заработал тот вариант, на котором я прервался. В общем, сигналы надо правильно соединять даже виртуальные :)
Продолжаю объединять сигналы и редактировать исходники. Из первоначального шага (попытка правильно подключить SDRAM) пока в синтезируемом PDP нет оперативки, так что вся проверка - что оно откликается на команды подключённого ПЗУ. Пока, если делать аккуратно, всё идёт нормально - PDP включается :) Но редактировать ещё прилично...
Старинный FPGA с механической прошивкой :)
http://www.KpXX.Ru/Феликс
Уф... Война с сериал-портами :) То, как сделано у автора плюс - ну вылетело у меня из головы, что в VHDL - это не операторы присваивания, а соединения и у них есть направление сигнала... В общем, то в одном месте пытался соединить rx с rx, tx с tx, то в другом :) В очередной раз - рисуем на бумажке - вход выход - пишем код :) Переделал :) Заработало :) Теперь делаю более простой вариант переключения - кто у меня системный терминал - COM порт PC или модуль VT в FPGA :)
Сделай и тот, и другой, один 177560, второй 176570 и меняй у них адреса, это изменить один бит.
Поздравляю, ты тоже сейчас думаешь как программист, а не как железячник ;)
В синтезируемом PDP есть 4 модуля KL-11 (так что вопрос не в - сделай тот и другой ;) у автора сделано достаточное количество)
Их нужно
а) правильно соединить с выходным серийным портом и портом синтезируемого VT
б) параметризовать эти СОЕДИНЕНИЯ
Основная война у меня - пункт а :)
- - - Добавлено - - -
Могу сказать образней.
Перед тобой стоит PDP, откуда выходят два кабеля - в два терминала :)
Нужно поменять их подключение.
Ты предлагаешь мне добраться до плат контроллеров и поменять адреса на них :)
Я хочу - просто переткнуть провода :)
Но это я уже научился делать (и не втыкая провод не в то гнездо) :):)
Теперь моя задача - сделать переключатели, которыми я мог бы выбирать - в какой порт воткнут терминал.
В общем, такой переключатель я "спаял", но опять провода перепутал :):)
Уф... Вроде сделал типа простого мультиплексора. С утра правда успел проверить только, что на нулевом канале с PC и на первом канале с VT всё работает. Вечером проверю, если РС сидит на первом канале, а VT на нулевом - тоже всё работает :) Но почти уверен :) В коде переключение выглядит так
portForFPGA <= 0; -- PC подключен на PDP к KL11-0
portForVT <= 1; -- VT подключен на PDP к KL11-1
или
portForFPGA <= 1; -- PC подключен на PDP к KL11-1
portForVT <= 0; -- VT подключен на PDP к порту KL11-0
Уф... Вроде убедил синтезатор сделать так, как Я хочу, а не так, как ЕМУ хочется :) В попытках убедить код немного поменялся, теперь выглядит так:
type SerialPortOnDevice is (PDPSerialPort0, PDPSerialPort1, PDPSerialPort2, PDPSerialPort3, XUSerialPort);
-- FPGA port connection
constant FPGAPortForSerial : SerialPortOnDevice := PDPSerialPort0;
-- for vt
constant VTPortForSerial : SerialPortOnDevice := PDPSerialPort1;
Так же исправил неточность с XU (но учитывая, что до его проверки я не дошёл - пока это никак не сказалось бы
Похоже, с серийниками разобрался :) Ещё немного знаний о электронике - науке о контактах и соединениях :)
Причесал код (после безумных разборок с серийными портами).
Собрал один вариант соединений (системный терминал - к PC, доп терминал - к VT) - работает.
Поменял код (системный терминал - к VT, доп терминал - к PC), поставил синтезироваться. Проверять буду утром :)
Если всё нормально - продолжу причёсывать код в плане интерфейсов (переделка под RECORD)
Блямбус... Только разобрался с одним... и влетел в другое... Кабы раньше то подумать.... Короче, скорее всего застрял надолго - буду учиться работать с памятью. Собственно, с этой темы и начались большие переделки PDP-2011.
Пока на генерируемой в FPGA. Надеюсь, надыбленное пригодится с SDRAM.
Ушёл надолго - вернусь не скоро :) Ну то есть перодически буду сюда пописать об неудачах (много) и успехах (мало) :))
Посмотрел, подумал - откатил изменения, пока занят более простыми правками кода.
Сейчас под раздачу попали модули MMU и Unibus - объединяю сигналы в них (а также в тех модулях, которые ими пользуются)
Пока ТТТ :)
Хм.. Перепахал прилично, но синтезируемое пока держится :)
Занят интеграцией сигнала типа DataReady (пока от памяти) с процессором и Bus Master Device-ами (пока это RK, RL, RH и XU, причём контроллер RH, зараза, ещё и напрямую (в варианте RH70) общается с памятью).
Для проверки интеграции с процессором есть хороший подопытный контроллер - терминал VT (у него, в редакции автора, внутри своя PDP и синтезируемая память :) ) По аналогичному устроен и XU, но его работоспособность заметить сложней :)
Ну, подцепил блок памяти. Пока ещё не совсем правильно (бита готовности нет), но - работает :)
Двигаемся дальше :)
Хм.. К основному PDP что ли подцепить... :)
Почесав всё почесуемое, до чего смогли дотянутся руки, решил всё таки добавить к основной PDP память (пока генерируемую в FPGA), так как это позволит проводить более глубокое тестирование того, что успел наворотить.
В общем, за остаток вечера и утро, успел добавить модуль памяти, прописать (пока) код для чтения, сгенерировать и проверить, что а) синтез приводит к работающему устройству (да, и основной проц и проц в VT запустились и работают) и что попытка чтения не приводит к эксцессам. Вестимо, что проверить - а действительно ли оно читается или модуль озу только делает вид - пока (до реализации записи) не представляется возможным.
Вечером попробую добить запись и протестировать уже более плотно. После того, как память заработает - можно будет грузить RT и тесты, например, с RK
С утра точно читалось не то - с сонных глаз перепутал вход и выход :) Пытался с входа читать :)
Блин.. Что то не даётся никак память. Придётся лезть Signal Tap-ом.. А с ним каждая попытка - это час
А без памяти не проверишь - чего там я ещё успел наворотить...
Не прошло и полгода (а если точнее - чуть-чуть меньше четырёх месяцев, как узнал про очередной полезный стрУмент - RTL Viewer
Теперь можно увидеть микросхемы синтезированной PDP :)
Я конечно понимаю что альтера "наше всё", но всё ж предложу почитать (и посмотреть мультики)
https://www.xilinx.com/products/design-tools/ultrafast.html
ug949.pdf что то типа "торы" для разработчика. (правда это уже левел 80 экспиренса нужно)
И может быть "открою глаза" на то что есть "чипскоп" это типа очень умного осцилографа/логического анализатора содержимого плисы. У альтеры есть аналогичный инструмент. (да и симулятор ModelSim тож полезен).
Сорри, если это уже известно. :)
ПС: жарко, путаю слова...
Йа Йа натюрлих. Он самый :v2_dizzy_botan:
Ну им то я уже достаточно давно пользую. Бесит только необходимость перекомпиляции...
Я конечно понимаю что альтера "наше всё",
Просто она, а точнее - Cyclone мне первый под руку подвернулся :) И пока оно мне нужно только под один конкретный проект - я его пытаюсь допились, я на нём и учусь. Из за нехватки времени, так же потому как я так лучше запоминаю - методом - Аффтар, убейся ап стенку :) Когда очередной кусок осваиваю - в учебники заглядываю :)
Никак руки до симулятора толком не дойдут :)
Но сильнее всего тормозит (хотя и учит) - стиль написания кода автора. Уже не раз налетал - пока аккуратно текст не отформатирую - ничё не понятно :)
В общем, по мере свободного времени движусь вперёд :)
Просто мысли вслух. ИМХО. Без желания поучать.
Ну как бы в общем случае:
1) Весь дизайн разбивают на блоки
2) Описывают как и что они должны делать
3) пишутся блоки - как бы отдельным проектом
4) пишется тестбенч для отдельного блока
5) в симуляторе проверяется "как работает" блок при подачи "нужных сигналов" - должен выполняться пункт 2 - "компиляция" достаточно быстро проходит и все нужные сигналы видны.
6) апосля соединяются блоки в один общий дизайн
7) повторяем 4 и 5 для 6 пункта
Общая мысль: пока не будет выполнены первые стадии разработки - не зачем "лезть осциллографом" в заведомо не работающую плису.
Грубо говоря можно нарисовать проект , который заведомо по ресурсам не лезет в плису или не выполняются временные ограничения, вот такой проект даже и не стоит имплементировать и грузить в плис.
Удачи.
ПС: к примеру если времянки не укладываются - то процесс имплементации может идти "сутки", а если времянки укладываются в ограничения - то за "пять минут".
ПСПС: в пользу альтеры - она в бытности быстрее синтезировала и имплементировала проекты, чем ксайлинкс (по крайней мере то что я встречал). но это не значит что альтера лучше чем ксайлинкс. они оба достаточно "кривые".
Просто мысли вслух. ИМХО. Без желания поучать.
Я программист ;) Так что все 7 пунктов мне знакомы - пусть и из другой области.
Проблема в том, что я имею то, что у программистов называется легаси код - проект УЖЕ есть и с моими (даже текущими знаниями) - мне пока проще его править (возвращаясь на шаг назад, если очередное изменения не взлетело и пытаясь понять - где я накосячил :) )
зачем "лезть осциллографом" в заведомо не работающую плису.
Не совсем правы - уже пару раз он мне показал - где косяк :) Но в целом я согласен - если всё уже соединено и не понятно, какой блок косячит - сигнал тап тяжело использовать :)
к примеру если времянки не укладываются
А у автора временные ограничения не описаны от слова совсем :) Это то, что мне предстоит освоить (но после того, как выправленный мной проект заработает, в первую очередь - с SDRAM) - а то прикольно наблюдать за модулем VGA :) Иногда чётко буквы рисует, иногда буквы - как жиробасики :)
но это не значит что альтера лучше чем ксайлинкс. они оба достаточно "кривые".
Скорей, не сами камни, а софт :) Точнее говоря, как мне кажется на примере квартуса - его оптимизирующая часть :) Но здесь тоже есть нюанс - дерьмо на входе, дерьмо на выходе :)
https://www.youtube.com/watch?v=ZEl11MGn2mU
А вот с времянками лучше сразу "бороться" - половину граблей можно убрать одним чёхом.
иначе получается что:
"Маяк то потухнет - то погаснет" (с) из загадки.
"Но здесь тоже есть нюанс - дерьмо на входе, дерьмо на выходе"
Ксайлинкс более "жёсткий" то что проходит на альтере здесь в принципе отваливается сразу.
У него тактовый генератор для процессора выдаёт модуль работы с SDRAM. Там такооооой маяк получился - и оно прилетело мне тогда, когда я только начинал с VHDL и FPGA :) После того, как (пока) убрал SDRAM - даже с моими кривыми ручками постабильней синтезируемость стала :)
AlexG, добрый вечер.
Я так понимаю, что с VHDL и FPGA не первый день знакомы? :)
Можете вкратце, на пальцах или простом примере, объяснить про времянку - пример (всё таки пример :) ), когда нужна и как задаётся. Самый простой - я пока всё равно с ней колдовать не буду, но чутьё подсказывает - есть сценарии (тот же контроллер VGA) - когда нужна будет :) Когда доберусь - будет стартовой точкой понимания :)
Вчера вечером психанул.. ну, в хорошем смысле этого слова :) Была массовая замена семейств сигналов на записи - из тех, которые я уже описал :) ПиДиПяха стойко выдержала - синтез работоспособен :) Осталось только для BusMaster устройств сделать аналогичную замену. Фактически - редакционные изменения :) Должно тоже пройти - БестПроблем
Мне до гуру как удаву до аляски пешком.:)
Основная деятельность "С". в плисах я изучаю systemverilog на xilinx под vivado.
Рядом есть коллеги у которых плисы это основное.
если очень кратко:
1) тактовая в плисе должна быть одна (для простых схем)
2) любую схему можно представить как: входной сигнал - триггер - комбинаторная логика - триггер - выходной сигнал
3) пункт 2 можно комбинировать как в "длину" так и в "параллель"
4) главный принцип: за один период тактовой сигнал с выхода первого триггера должен успеть попасть на вход второго триггера
5) для очень простых схем достаточно указать параметры тактового сигнала (частота и скважность)
6) тактовые сигналы должны приходить на спец. вывод(-ы) плис
7) есть ещё понятия " клоковый домен (CDC, Clock Domain Cross)", асинхронные входные сигналы и др. ещё более высокие материи
пс: у плисы обычно надо задавать тип входа/выхода (ттл, кмоп3.3 кмоп1.8 итд).
не соблюдения 4 пункта приводит к тому что любое минимальное изменение схемы, температуры воздуха, напряжения питания - приводит к полной глючности проекта.
1) тактовая в плисе должна быть одна (для простых схем)
Я так понимаю - это про входной задающий генератор. У Циклона их можно сделать не то три, не то четыре, но у меня используется один - 50 МГц.
Или это про внутренние тактовики? У меня задающий через PLL размножается - 27 с чем то там (VGA 640х480), 100 (генерируемая в FPGA память) и 300 (Signal Tap). Из 300 кодом делается или 0.5 Гц - для меееееедленной работы процессора, что бы можно было наблюдать (отладка) или 50 МГц - штатная работа.
главный принцип: за один период тактовой сигнал с выхода первого триггера должен успеть попасть на вход второго триггера
Правильно ли я понял, что речь идет о триггерах из пункта 2?
Про седьмой знаю, но пока не использую - с учётом того, что внешний у меня задающий генератор один - вроде как получается один клоковый домен
Вход или выход и его тип задаётся (по крайне мере в случае Quartus-а) в описании проекта. Поскольку это описание делалось в тот момент, когда знания были минимальны - использовал спец утилиту, которая сгенерировала это описание. Ну и с внешним миром, если синтез прошёл удачно и я не напутал входы-выходы - устройство общается вроде без проблем :)
Я так понимаю, что в более сложных (чем в пункте 5) схем - надо указывать - за какое время сигнал должен (см пункт 20 с входного триггера достичь выходного?
в меру своих знаний:
входная 50мгц, идёт на pll на выходе 27, 100, 300
а 0.5 и 50мгц формируется на триггерах ?
так вот по феншую так не делают. Принято что все тактовые частоты формируются только на pll и dcm и др. но не на триггерах.
0.5 гц я б по пробывал бы сделать из 50мгц путём выделения одного импульса из миллиона.
пункт 2 - да - он "свят"
п7 это как раз когда в схеме несколько тактовых и не кратных меж собой 50 и 27
п5 это больше ко входным/выходным сигналам, которые тоже выдаются с привязкой к тактовой частоте.
пс: какие книжки с картинками листались ? (чтоб не повторяться) я у своих спрашиваю что не ясно..
входная 50мгц, идёт на pll на выходе 27, 100, 300
а 0.5 и 50мгц формируется на триггерах ?
Посмотрел. На одном PLL из 50 делается 100 и 300, на другом PLL (из той же 50) делается 25.155 (VGA) (когда пробовал сделать на одной PLL - частоту точно нельзя было выставить для всех)
На триггерах делается тактовая для всех модулей в синтезируемой PDP (0.5 и 50 - что используют модули, определяется переключателем на плате)
Ещё на триггере сделана 0.5 Гц (отдельная от PDP) - которой (раз в секунду) моргает светодиод
Если тактовая PDP 0.5 Гц - для SignalTap используется 3 Гц, сделанная на триггерах
Если тактовая PDP 50 МГц - для SignalTap используется 300 МГц, сделанная на PLL
100 МГц - это задел для SDRAM, пока не используется
так вот по феншую так не делают. Принято что все тактовые частоты формируются только на pll и dcm и др. но не на триггерах.
0.5 гц я б по пробывал бы сделать из 50мгц путём выделения одного импульса из миллиона.
На PLL не даёт, максимально, что умеет - ЕМНИП, 1 МГЦ
п7 это как раз когда в схеме несколько тактовых и не кратных меж собой 50 и 27
Те, которые на входе или и те, которые синтезируются? Причину появления понятия clock domain и работу с ними я вроде себе представляю - борьба с иголками
п5 это больше ко входным/выходным сигналам, которые тоже выдаются с привязкой к тактовой частоте.
Входные-выходные - для модуля или вообще наружу?
пс: какие книжки с картинками листались ? (чтоб не повторяться) я у своих спрашиваю что не ясно..
Хе... Толком пока никакие - в основном по принципе - во что упираюсь - начинаю искать в инете и листать книжки, которые попадаются там. Ну и примерно по тому же принципу - доки от ALter-ы :)
Можно я попробую парой строк кода проиллюстрировать тезисы AlexG про распределение клоков?
Было годно для симуляции, но катастрофически и непредсказуемо рушится при синтезе, как только дизайн становится сложнее :
reg [3:0] clock_div;
always @(posedge mclk) clock_div <= clock_div + 1;
wire evil_derived_clock_div16 = clock_div[3];
wire evil_derived_clock_div8 = clock_div[2];
..
always @(posedge evil_derived_clock_div16) begin
// то, что будет тактировано этим клоком разойдется по фазе с mclk и с evil_derived_clock_div8
end
always @(posedge evil_derived_clock_div8) begin
// то, что будет тактировано этим клоком разойдется по фазе с mclk и с evil_derived_clock_div16
end
Стало хорошо, годно для синтеза и устойчиво к попаданию мюонов потому, что теперь все регистры тактируется одним клоком. При синтезе достаточно только убедиться, что сигналы clock enable стабилизируются к приходу очередного фронта mclk. Это и человеку просто сделать, и Квартусу понятно, что надо оптимизировать.
reg [3:0] clock_div;
always @(posedge mclk) clock_div <= clock_div + 1;
wire clock_enable_div16 = ~|clock_div; // держится один такт пока все разряды == 0
wire clock_enable_div8 = ~|clock_div[2:0]; // держится один такт, пока 0000 или 1000
...
always @(posedge mclk)
if (clock_enable_div16) begin
// все записи во все регистры тактируются одним клоком mclk, но разрешены только раз за 16 тактов
end
always @(posedge mclk)
if (clock_enable_div8) begin
// все записи во все регистры татируются одним клоком mclk, но разрешены только раз за 8 тактов
end
Йа йа натюрлих. Плисе плохеет, если обычный сигнал превращать в тактовый. см. первый пример.
на десерт:
https://electronix.ru/forum/index.php?showtopic=20307
Нуу.. насколько я себе представляю, evil_derived_clock_div16 и clock_enable_div16 (как и вторая пара) ведут себя по разному, точнее, ээ.. скважность разная - термин правильно вспомнил? :)
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_______________----------------________________----
-______________________________--__________________
Если я правильно понял мысль - тактовый клок и синтезируемый клок не должны одновременно меняться по разному - то есть если тактовый идёт из 0 в 1, то синтезируемый или стоит или тоже идёт из 0 в 1 и наоборот - да?
Кстати, насколько я понял код на Verilog (PDP-2011 на VHDL) - есть тоже момент, когда они в противофазе.
Поясняю, почему так понял (начало картинки - mclk = 0, reg = 15, ++ - переход в фазе, !! - переход в противофазе)
++!!
_-_-_
-____
_--__
Или я опять не допонял? :)
- - - Добавлено - - -
Плисе плохеет, если обычный сигнал превращать в тактовый
Ну, автор PDP-2011 этим несколько страдает....
на десерт:
https://electronix.ru/forum/index.php?showtopic=20307
Аха, спасибо.
- - - Добавлено - - -
Плисе плохеет
Чёт мне кажется, что не ПЛИС-е... Кстати, не ПЛИС-е, а ППВМ-у ;) Так вот, не ППВМ (ака FPGA), а синтезатору :)
Hunta, я чего-то плохо паршу эти картинки, но кажется правильно. Суть в том, что clock enable держится только один такт из многих (один из 16, например, или один из 100 миллионов, если мы из 50МГц получаем 0.5Гц). Все остальные такты просто проносятся мимо. Эффективная тактовая и периодичность получаются те же самые, что и при деленном клоке.
(Это к тому же удобный механизм, если надо разнести несколько устройств во времени. Например, первая фаза на div == 0, вторая фаза на div == 1 итд).
VHDL или Verilog значения в этом вопросе не имеет, они транслируются в одно и то же. Но вот если автор оригинального проекта страдал использованием деленных клоков, то это проблема, с которой надо разбираться. Все это почти механически исправляется добавлением "if (ce)" во все тактируемые процессы.
- - - Добавлено - - -
Еще добавлю, потому что жто очевидно, но может быть не сразу бросается в глаза. Если clk_enable ошибочно сделать не "div == 0", а просто использовать clk_div[3], то получится эффективное деление всего лишь на 2. Будет работать пачка из 8 mclk, затем 8 пропусков итд.
Если в качестве условия использовать LFSR вместо константы, то можно сделать spread spectrum clock для уменьшения помех и требовательности к энергопотреблению. Что в проекте PDP-11 на FPGA, уверен, очень востребовано =)
Hunta, я чего-то плохо паршу эти картинки
Делается просто - копируешь эти строчки в notepad, а в notepad-е ставишь шрифт покрупнее :)
Вот нарисовать их было сложнее - запарился считать такты :)
VHDL или Verilog значения в этом вопросе не имеет
Это я знаю, я больше про то, что Verilog мне надо было ещё въехать - в отличи от VHDL, который уже более менее неплохо читаю :)
Если clk_enable ошибочно сделать не "div == 0", а просто использовать clk_div[3], то получится эффективное деление всего лишь на 2
Не совсем понял, но (как понял) у нас будет восемь клоков держаться флаг в 1 и в это время схема будет реагировать на все mclk, а потом (флаг в 0) - восемь клоков тупо ждать, так что эффективное деление будет да - на 2.
Если в качестве условия использовать LFSR вместо константы
За LFSR пришлось лезть в инет (такое сокращение было не знакомо), но думаю, это может пригодиться после того, как я всё таки добьюсь цели номер 2 (работа SDRAM) и начну выжимать из железки все соки :)
у нас будет восемь клоков держаться флаг в 1 и в это время схема будет реагировать на все mclk, а потом (флаг в 0) - восемь клоков тупо ждать, так что эффективное деление будет да - на 2
Все правильно.
Вот нарисовать их было сложнее - запарился считать такты
Честно говоря, при всей полезности умственной гимнастики, для таких вещей все-таки стоит разобраться с симуляцией. Сделать маленький набросок, где без особой драмы можно будет написать ту или иную конструкцию и быстро посмотреть, что из нее получается.
при всей полезности умственной гимнастики
стоит разобраться с симуляцией
Из опыта - это приводит к тому (по крайне мере в программировании), что начинаешь писать НЕБРЕЖНО (а чё, под дебаггером проверим и сделаем как надо), что в конечном итоге приводит к большему времени на написание кода. Да, периодически возникает мысля - надо бы с симулятором разобраться, но пока хватало тупого рассматривания кода и периодически - Signal Tap-а :)
Вопрос. Если скважность у клока, скажем 50 МГц, два - то понятно, сколько времени будет держаться высокий уровень и что на него успеют среагировать все, кто надо :) Но если у него высокий уровень будет держаться не 20 наносекунд, а 6,666666 нс (если мы его получили из 300 МГц) - успеют ли на него среагировать все, кто надо? Поэтому или придётся понижать тактовую или добавлять внутренний триггер, который будет держаться дольше, да? Или есть альтернативы?
И вроде как в PLL можно задать скважность, да? То есть если мы делаем на PLL, то проблему предыдущего вопроса снимаем? И она актуально только на ручных клоках?
Отвечаю на вопрос, как я его понял. При клоке 300 МГц и clock enable равномерно пропускающим один клок из 6, мы получаем эффективную тактовую частоту 50МГц. Если вся логика завязана на один и тот же фронт клока, вся комбинаторика должна устаканиваться за один период 50 МГц, или 20нс.
Cкважность собственно клока имеет значение только при передаче сигналов от процессов на posedge к процессам на negedge, или наоборот. При записи на negedge вся комбинаторика должна будет успеть успокоиться со времени posedge и это время будет зависеть от скважности клока.
Э.. не совсем то имел ввиду.. Что то типа
base_addr_match <= '1' when (base_addr(21 downto 15) = FromBus.Addr(21 downto 15)) and (clk = '1') else '0';
...
process(clk)
begin
if rising_edge(clk) then
if (base_addr_match = '1') then
...
base_addr_match будет в 1, пока совпадает адрес устройства с адресом на шине и высокий уровень clk
Логика в процесс должна успеть отработать, пока base_addr_match будет в 1.
Одно дело, когда base_addr_match будет в 1 - 20 нс, другое дело, когда - 6.666 нс. Технически, во втором случае внутренности process-а могут не успеть среагировать. Я понимаю, что пример кривой и так делать не надо, но это попытка объяснить :)
- - - Добавлено - - -
комбинаторика должна устаканиваться за один период 50 МГц, или 20нс.
То есть у них есть время до следующего клока 1?
- - - Добавлено - - -
Попробовал переделать клок процессора :) До переделки синтезировалось от 25 до 35 минут, после переделки - чувствую, минут 55 будет пахать :)
- - - Добавлено - - -
Ню... на частоте 50 МГц не запустилось, на частоте 0.5 Гц начало кода в ПЗУ начало отрабатывать, а потом встало. Скорее всего по вектору 4
Щас посмотрим, где оно сломалось
- - - Добавлено - - -
Пока выбирало команды из ПЗУ, всё нормально. Потом полезло через регистры в ПЗУ и в какой то момент - УПС...
- - - Добавлено - - -
Вырубил синтез ОЗУ (у меня впечатление, что иногда ОЗУ откликается, когда не надо), посмотрим, что получится...
base_addr_match будет в 1, пока совпадает адрес устройства с адресом на шине и высокий уровень clk
base_addr_match <= '1' when (base_addr(21 downto 15) = FromBus.Addr(21 downto 15)) and (clk = '1') else '0';
Так делать не надо, я даже подозреваю, что где-то в варнингах Квартуса есть на этот счет замечание. Дело в том, что в этом случае условие if (base_addr_match = '1') в процессе rising_edge(clk) никогда не выполнится. Вот почему: clk становится входом комбинаторной схемы, которая имеет задержку. В то же время выход этой схемы является входом enable регистров, которые должны записываться в процессе rising_edge(clk). clk приходит всюду напрямую, равномерно, с минимальным разбросом. Таким образом, в момент rising_edge(clk) на проводе base_addr_match всегда будет установившееся значение выражения при clk = 0.
Можно представить себе такой наклонный желоб, по которому катятся шарики. В желобе с некоторым интервалом расположены ворота, которые открываются периодически, причем все они дергаются одной веревочкой. Комбинаторика — это неровности в желобе, которые заставляют шарики катиться неравномерно. Ворота с веревкой это клоки. В исправной машине к моменту открытия всех ворот все шарики будут лежать ровно и ждать ворот. Если к моменту открытия ворот какие-то шарики еще в движении, значит клок слишком быстрый для этой машины, надо дергать веревочку реже.
Как я и написал, я знаю, что это неправильно :) Просто пытаюсь объяснить, что я имел ввиду раньше.
По быстрому прошерстил код автора - вроде у него ничего похожего нет.
Второй абзац можно было не писать - я и так понимаю, что все элементы в схеме вносят задержки, которые зависят от а) (постоянная задержка) самого элемента и б) (случайная задержка) фазы Луны, когда этот элемент был изготовлен :):)
Интересно.. Без ОЗУ синтез за 22 минуты...
- - - Добавлено - - -
Ну... без ОЗУ истчо интересней... Время Signal Tap :)
Рассматривал под микроскопом процесс общения с ROM. Интересные процессы происходят - даже как то не задумывался о задержках :) Программист, чули :)
(заинтересованно-озадаченно почёсывая разное) Дааа... главное - уметь думать в возможностях и особенностях FPGA.. Этак я на партийно-правильном клоке заставлю работать.. Вечером ещё буду смотреть на результат в Signal Tap-e.. Занимательно получается :)
Резиновая женщина, да? ;)
http://www.KpXX.Ru/PDPonFPGA/Железо/Схема
Продолжаю процесс редактирования..
Это Множество Мандельброта.:v2_dizzy_botan:
На этой ветке просто было несколько раз - типа эмуляторы и FPGA - это резиновые женщины, которые труПиДиПи-шники не юзают.
И если ты хочешь FPGA - типа проще эмулятор юзать.
Ну вот им доказательство, что FPGA - это железячней некуда :) И с ним тоже паять придётся :)
Ну, а лично моё мнение насчёт тех, кто от FPGA возбуждается - они просто НЕ СМОГЛИ :) "Лиса и Виноград" :)
Ну, а лично моё мнение насчёт тех, кто от FPGA возбуждается - они просто НЕ СМОГЛИ :) "Лиса и Виноград" :)
Много хороших и сильных людей, имеющих богатый многолетний опыт программирования не смогли в HDL :)
Причем, чем богаче и круче опыт - тем сложнее СМОЧЬ :)
=)
Субъективно по картинкам кажется, что как-то не очень хорошо с модульностью. На одном уровне иерархии не должно быть столько мочалы.
Причем, чем богаче и круче опыт - тем сложнее СМОЧЬ
Я бы сказал - тем, как правило, сложнее СМОЧЬ. У меня достаточно многолетний и богатый опыт программирования, но это не мешает мне СМОЧЬ :)
Причём, судя по моему опыту разборок, в первую очередь или из-за качества учебника или из-за того, что он написан желеязчником, для которого - параллельное выполнение операторов или последовательное выполнение операторов означает вполне определённую вещь, которая (СЮРПРИЗ!) - совсем не то, что подумает про этой дело программист :)
- - - Добавлено - - -
Субъективно по картинкам кажется, что как-то не очень хорошо с модульностью
Автор разбил достаточно просто проект на модули - вот процессор (один модуль), вот ДП (второй модуль), вот контроллер RK, вот контроллер RL, вот контроллер KL ну и т.д.
И всё это объединяется (СЮРПРИЗ) модулем Unibus, внутри которого (СЮРПРИЗ) создаются экземпляры этих модулей. И если хочешь что то добавить (например, ещё один контроллер RK) (убрать проще - об это автор (СЮРПРИЗ) позаботился) - придётся попыхтеть. Ну или скажем создать несколько (разных) PDP-11 (внутри кристалла) и связать их - тоже придётся попотеть :)
Может быть в VHDL модулем что-то другое называется, но мне так не очевидно. Что не так в том, что процессор это модуль, контроллер диска это модуль итд? Или речь о том, что модули внутри себя такие поросшие, типа весь процессор это один единственный модулище?
С терминами надо как нть разобраться, но когда я пишу модуль - в одном файле пишется Entity (например, Entity cpu, это интерфейс) и Architecture Implementation (Architecture Implementation cpu - реализация интерфейса). Из другого модуля ссылка будет как - Сomponent (Сomponent cpu, дублирует описание в Entity)
И типа да - процессор (и все остальное) - это такие (почти) самодостаточные модулищща
Ну пока они работают то и ладно, пусть они внутри себя будут сколь угодно сложны. Главное, чтобы на уровне, на котором с ним приходится общаться, все было относительно читаемо. То есть вот вариант на картинке "PDP%20on%20FPGA%2002.jpg" по-моему прекрасный, все хорошо. А вот "PDP%20on%20FPGA%2003.jpg" выглядит кромешно. Что это?
Это меня и привлекло - что оно работает и главное - процессор полный, то есть реализовано или всё или почти-почти всё :) Так что RSX-11M-Plus загрузилась без жужжжания :)
выглядит кромешно. Что это?
Ну так это он самый и есть :) Модулищще CPU :)
- - - Добавлено - - -
Я последовательно увеличивал картинку :) Сначала сам PDP (без внешнего обвеса), потом место с процом, потом проц (Великий и Ужастный) целиком, потом внутренности :) Жалко не знаю как снять всю картинку целиком в один файл) :)
- - - Добавлено - - -
Кстати, всякие зелёные прямоугольники - это эти самые модули и есть :)
у ксайлинкса есть экспорт в пдф сей картины. правая кнопа мыши.
ксайлинкса есть экспорт в пдф сей картины. правая кнопа мыши
Сейчас идёт синтез, как закончится (эта заразка не даёт работать с просмотрщиком во время синтеза) - я покопаюсь, может, тоже есть чёньт похожее
- - - Добавлено - - -
Спасибо за подсказку - есть экспорт в pdf, но через меню.
Выложил там же pdf-ник, для тех кому любопытно. Но увы, макс увеличение у pdf - 6400 процентов. И естественно, в pdf компоненты развернуть нельзя..
Развернут процессор :)
- - - Добавлено - - -
Цель:
http://www.KpXX.Ru/PDPonFPGA/Железо/PDP-11(74)
- - - Добавлено - - -
:):):)
Стало любопытно, заглянул в свой vm1: https://imgur.com/a/KOLtOXH
Дизайн у меня прилежно списан с Симидзу-сенсея (POP-11).
А исходники POP-11 сейчас где то доступны?
Занимательно выглядят эти схемы :)
А исходники POP-11 сейчас где то доступны?
http://www.telegraphics.com.au/pdp11/shimizu-lab.dt.u-tokai.ac.jp/
Исходники на SFL красивые, но результат трансляции в Верилог хоть святых выноси. Поэтому я вм1 писал вручную.
Это Zzzzz не спроста... (с) ВинниПух
Z-состояние надо предавать анафеме по жизненно.
- - - Добавлено - - -
Оригинальный сайт тоже доступен токмо надо через прокси в японию ползать.
Ну, как я понимаю - только на внешних пинах...
Пробую повторить синтезируемую память на массиве... Как известно, PDP может писать отдельные байты (хотя читает всегда целиком слово)... Встал в тупик. Если делать два массива (чётный и нечётный байты), то синтез использует блоки памяти. А если пытаться сделать массив из 16-ти битный слов.. то пока оно делает регистры... Ж...
Если делать два массива (чётный и нечётный байты), то синтез использует блоки памяти. А если пытаться сделать массив из 16-ти битный слов.. то пока оно делает регистры
Может быть поможет глава из гандбука: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/qts/qts_qii5v1.pdf страница 12-9, глава "Inferring RAM functions from HDL Code"?
Кстати еще, в Квартусе есть возможность генерировать сорец по шаблону (Edit->Insert template). Шаблоны подогнаны под то, что он хорошо понимает. Конечные автоматы, все виды памяти и тд.
Из достижений.
Пока плюнул на более правильный вариант (использование ip core) для памяти, сделал память на массивах (байтовых), которые синтезатор успешно распознал. Так что у меня теперь есть (вроде работающих) 256 кб памяти. Буду проверять - чего там я ещё наворотил с проектом. Цель - заставить весь этот бардак взлететь (ака - загрузить RSX+). Поскольку все изменения аккуратно сохранялись - я могу возвращаться (при необходимости) назад, когда всё заработает, что бы понять - что сломал :)
- - - Добавлено - - -
(Edit->Insert template).
Э.. не вижу такого пункта в меню.
Встал в тупик. Если делать два массива (чётный и нечётный байты), то синтез использует блоки памяти.
Запись байта ведется по двум условиям- наличие сигнала WTBT, и выбор чет/нечет по нулевому адресу шины. Сигнал WTBT дают байтовые команды (с лидирующей единицей вначале), а выбор чет/нечет с ноль/единицей в конце адреса.
Запись байта ведется по двум условиям- наличие сигнала WTBT, и выбор чет/нечет по нулевому адресу. Сигнал WTBT дают байтовые команды (с лидирующей единицей вначале), а выбор чет/нечет с ноль/единицей в конце адреса.
Это про FPGA, да?
Это про FPGA, да?
Про PDP11. Как там в FPGA реализуется, Вам виднее.
У меня было про FPGA. Как оно в PDP - я и сам знаю.
Э.. не вижу такого пункта в меню.
А он есть. Даже если в гугле написать "quartus edit insert template", появляются скриншоты этого диалога.
Для байтового доступа в altsyncram можно сгенерировать вход bytemask для 16-битного ОЗУ. Его получить можно из WTBT и младшего бита адреса. У SDRAM-а будет похоже.
А он есть.
Уточнение - он есть, если ты находишься в редактировании файла.
го получить можно из WTBT и младшего бита адреса
Ещё раз. Сигналы PDP я знаю. Проблема не в них. Проблема в том, что при попытке использовать массив из 16-ти битных слов синтез приводит к регистрам, а не к использованию блоков памяти. Сгенерить 400 слов на регистрах можно, сгенерить 16 килослов уже проблема
Не надо так кипятиться. Был вопрос про синтез BRAM. Я сказал, что его можно синтезировать с bytemask-ом.
Посмотрел код, который предлагается в шаблонах. Ничего для меня нового (кроме многобайтовых слов - но это я уже в книжке сегодня увидел, так что можно сказать - тоже ничего нового). Ни один из примеров не показывает, как использовать память, описание которой через IP..
Кроме того, как авторский вариант, так и вариант в шаблоне мне не очень нравится - сложно через код прошить содержимое - придётся прошивать по байтно - и сразу не видно, что делает код. А смотря на словное восьмеричное представление - я уже в значительной степени понимаю - и что делает код и как при необходимости без перекомпиляции его поправить
Примеры показывают как описывать память, которая Квартусу понятна. Это не гарантирует то, что она станет мегафункцией. Дальше работают алгоритмы оптимизации и они уже решают запихивать в BRAM или в регистры. На ход их работы можно влиять через global assignmentы. Не подскажу, как заставить инферрить ОЗУ там, где оно не инферрится, но может быть в нужную сторону поиск направит если скажу наоборот, как запретить: "set_instance_assignment -name MAX_RAM_BLOCKS_M4K 1 -to *". Звездочка тут имя инстанса. Если знать имя инстанса своего ОЗУ, то можно намекнуть сколько штук M4K не жалко на него выделить.
Это я недавно разбирался, почему инферрилась здоровенная ОЗУ из на первый взгляд безобидной маленькой таблички.
Уф.... Подведя итоги :) Промежуточные :)
Двухбайтовые слова массива я теперь умею отправлять в блоки памяти. К сожалению - или удобная инициализация или работа с байтами. Одновременно пока - не получается. Поэтому - в баню.
Наконец то (YES!!!!) я разобрался, как работать с блоком памяти, которые сгенерировала мегафункция. Пока не проверил работу записи в байтовом режиме, но хоть что то. До сих пор получал - ноль на чтение, после записи всё равно ноль на чтение :) А теперь хоть и пишется и читается после этого записанное :) Сильно не оптимально, зато работает - а с этим проще работается :) Отдельное спасибо AlexG и svofski за тыканье носом в то, что сигнал(ы) не устанавливается(устанавли аются) моментально. Да, теоретически я это знал и до этого. Но, видимо, пока сам крепко не влетишь... В общем, ещё раз спасибо :) Что ещё долго доходило - нужные сигналы для памяти должны быть выставлены ДО очередного клока, а не во время. Ну, тут помогли тыканье носом и Сигнал Тап - в конце концов правильная мысль продралась в голову :) Теперь можно сгенерировать, скажем, 256 кб памяти и начать проверять остальные мои изменения, в первую очередь процессор и ДП - RT-11 c SJ, XM и ZM мониторами в этом поможет. Пока не научусь работать с SDRAM.
SDRAM - тут пока ничего нового - даже не пробовал сделать, потому что более простой случай (блоки памяти) не работали. Скорее всего буду делать в параллель - проверку изменений и попытку заставить работать SDRAM.
Уф.. :) Утопал спать :)
Немного переделал модуль работы с BRAM - вынес из процесса всё, что можно "просчитать" снаружи. В процессе осталось - реакция на сигналы запросов чтения и записи и сигналы подтверждения.
Попробовал увеличить размер блока памяти до 256 кб - с пульта - вроде работает. Пока лучше проверить не могу - из за изменения протокола работы с памятью (он, кстати, стал ближе к протоколу unibus) нужно доделать (буквально 3-4 строчки) остальные модули - пока на новом работают только процессор, память и интерфейс терминала. Вечером.
Из за предыдущего пункта - скорее всего до SDRAM сегодня не доберусь
Вчера - переделал клоки (вместо планировавшегося) - перевёл основные на PLL, ручной только - 0.5 (CPU), и 4 (Signal Tap) Гц и секундный тик светодиодом. После некоторого количества танцев вокруг - заработало.
Сегодня займусь SDRAM.
После этого доделаю всё, что ещё не успел, на новый вариант протокола общения по шинам. Проц, память и терминальные порты - уже на нём. В принципе - не сильно много работы. Если, конечно, я опять КакуНибудь глупость не сотворю :)
После этого - или попробую поразгонять проц и памяти (BRAM и SDRAM) или допилю DMA устройства на предмет подключения к шине (под мой вариант). А может это будет сначала в процессе допиливания устройств на новый протокол - а тесты после этого. Как рука зачешется :)
Ну и продолжается форматирование текста, а так же переименовывание сигналов (пытаюсь подобрать такие имена, что бы были говорящие). На русский их переделать, что ли? :)
Похоже, накосячил где то при редактировании mmu - на модулях памяти до 256 кб не проявляется, расцвело пышным цветом на 4 мб :)
Сегодня вечером буду выверять - процесс знакомый :)
Главное - проц работоспособен (он ещё в vt и xu, и в vt точно всё работает (в пределах 11/20, который там используется))
Надо почитать про 11/20 (который был первым), что то у меня сложилось впечатление, что он был... немножко другой. Но не факт - хорошая вероятность того, что я не так понял
А вот не факт, что это у меня косяк...
Time Quest - слово недели :)
SDRAM начинает оживать :) Попробовал записать слово (123 по адресу 1000) - повис :) После сброса из ячейки 1000 прочиталось 100 :) Если сравнить с BRAM - когда у меня не помню сколько - чего бы не писал - читалось строго 0 - прогресс - не прошло и двух дней :)
К сожалению, приходится помечать сигналы для Signal Tap - а это лишние регистры, ALM и скорость синтеза...
- - - Добавлено - - -
В фоне крутится прошивка на частоте 0.5 Гц, уже дошла до буквы К в словах За Передовую Магию :) Тьфу, до цифры 0 слове 000106 :)
- - - Добавлено - - -
О! Второй ноль нарисовала :)
- - - Добавлено - - -
Для проверки контроллеров RK11, RL11 и DB - придётся присоединить три считывателя SD
О! Третий ноль и синтез закончился :)
- - - Добавлено - - -
YES!! Попробую программу запихать c пульта :)
- - - Добавлено - - -
А вот хрен :) Не успела записать - программа прохерена :) Лана, буду смотреть на диаграмму :)
- - - Добавлено - - -
Или регенерация не работает..
Hunta, а какой SDRAM, на какой частоте, какой контроллер, что делает TimeQuest?
DE10-Standard - всё на ней. Контроллер синтезируется в FPGA - частота - теоретически задаю сам (практически - есть максимальная - но до неё не скоро)
Time Quest - программа анализа всяких временных параметров при синтезе
У этого контроллера есть имя?
У частоты есть абсолютное значение? Как оно соотносится с частотой процессора?
Какие именно ограничения ты задаешь в TimeQuest-е и как оцениваешь результат наложения ограничений? Этот пункт мне особенно интересен, потому что я так и не разобрался с чем его едят.
Ещё раз повторяю.
Плата DE10-Standard (альтеровская, ныне интеловская)
На плате распаян кристалл Циклона и кристалл SDRAM. Они между собой соединены. Всё. Никакого внешнего контроллера нет. Что внутри FPGA насинтезируешь - то и будешь использовать :) Похожее я делал BRAM - только там не надо думать о регенерации. :)
Код контроллера не мой. Точнее говоря - у меня их два - найденный на просторах и от автора PDP-2011. Попробовал поиграться с найденным. Частично рабочий, но похоже проблема в регенарации.
Time Quest только начинаю изучать. Идея у него достаточно простая - подсказать, какие допустимы задержки - а он тебе подскажет - иде у тебя косяки
Что внутри FPGA насинтезируешь - то и будешь использовать
Вот именно это я и спрашиваю, что именно ты там синтезируешь? И какой клок на него подаешь. SDRAM можно тыщей разных способов завести.
Покажу личным примером пример понятного ответа на свои вопросы:
Контроллер SDRAM такой (https://github.com/svofski/vector06c-lesshadoks/blob/master/quartus/src/sdram/SDRAM_Controller.v). Он поддерживает чтение-запись только одного слова, без бурста, без кеширования. Оригинал имел внутреннюю регенерацию, я его переделал под внешнюю.
Частота тактирования контроллера и SDRAM 96 МГц, это частота системы * 4.
Идея у него достаточно простая
Досюда и я разобрался, у меня дальше проблемы :)
что именно ты там синтезируешь?
Контроллер SDRAM :) Который будет работать в PDP-2011.
И какой клок на него подаешь
Пока 100. У автора PDP-2011 был 140
можно тыщей разных способов завести.
У меня пока два - и оба не мои :) Хотя в одном я хорошо разобрался :)
Он поддерживает чтение-запись только одного слова, без бурста, без кеширования. Оригинал имел внутреннюю регенерацию
Почти то же самое, только можно читать и один байт. Кэширование я сделаю на BRAM. Регенерация так и будет внутренней, хотя, возможно, будут подсказки от проца.
у меня дальше проблемы
У меня сегодня первый день - так что ни проблем, ни (пока) особого понимания, как правильно использовать, но идею я понял, остальное дело техники и времени :)
Теперь понятно.
Если вдруг случится желание документировать свое освоение TimeQuest-а, было бы интересно почитать.
Я периодически сюда пописываю :) А сейчас читаю вот это:
http://caxapa.ru/thumbs/442268/TimeQuest_for_dummies.pdf
Вопрос к знатокам :)
Есть ... хм... сигнал, который используется как флажок (то есть или 0 или 1).
Есть ли какой то эзотерический смысл описывает его как signal (и постоянно писать = '0' или = '1')?
Или всё таки никакой разницы (кроме уменьшения набиваемых символов в прошивке) не будет, если его описать (как это принято у программистов) как boolean.
Если предположить, что наружу из кристаллы он не выводится или остальные состояния signal них...фиг не нужны?
- - - Добавлено - - -
Посмотрел по синтезу на тестовых кусках кода - вроде результат одинаковый...
Повоевал с клоками... Что то мне не нравится, что у меня (или у PLL) получается на выходе PLL. Вроде ставлю скважность 50, а Signal Tap показывает всякую хрень со скважностью. Или может он врёт... Пока не понял. А осциллографа посмотреть - нету. В общем, пока плюнул и сделал клоки кодом. По крайне мере со скважностью и фазой всё нормально. Или мне опять Signal Tap врёт :)
Сегодняшний вечер посвящён борьбе в BRAM (в проекте их штук). Стоит только на секунду отвернутся - хлоп - и синтезатор вместо BRAM собирает на регистрах. А опыт показывает, что попытка собрать RAM на регистрах (помимо улетающих LE) приводит чаще всего к нестартующему синтезу.
В общем, аккуратно вычистил, что бы все блоки стали BRAM (кроме основной оперативки - чего то я опять напортачил и синтез вообще не пойми чего с ней делает - в регистрах столько не уместишь и блоков памяти тоже как то маловато используется - ну и PDP гутарит - нет у тебя оперативки - но этим я займусь позже). Запустил синтез проверить.
И кстати - ещё наблюдение - когда с BRAM всё тип-топ - синтез идёт всего минут 15 :) А я только к 30-ти привык... :)
Пока как то так :)
С Time Quest пока разбираюсь. То есть я понимаю, когда показатели плохие - но что с этим делать - пока опыта не хватает :)
Из переменных новостей.
Продолжается война с клоками. Помимо моих кривых (пока) ручек, оказалось, что и у автора с клоками полный атас. Прошерстил его привязки к клокам. Как ни странно, но после этого синтез заработал сразу (ну из тех модулей, которые я пока проверить могу). Но война с клоками продолжается.
Из хороших новостей.
Автор весьма "элегантно" делал память (и ROM и RAM) с предустановленным содержимым (типа загрузочных ПЗУ у PDP и ОЗУ с firmware у VT и XU) - собственно чего и была моя первая войнушка с попыткой описать 16-битный ROM/RAM с байтовым доступом и отображением на BRAM - я хотел описать и содержимое. В виде слов, а в не в виде двух байтовых блоков с непойми с чем в них для tru PDP-шника. Был бы 16-ти битный массив - я мог бы и "читать" его и подправлять быстро.
Ну.. тогда счёт был 1:1 - описать 16-ти битное отображение на BRAM - да, байтовый доступ - хрен. Или чего то наподобие (давно было, надо старые версии смотреть - что бы точнее сказать) с результатом - нэ взлэтэло.
Плюнул тогда - мне проблем и с клоками хватает.
Сегодня я зашёл с другой стороны.
Через мегафункцию можно не только описать блок памяти в BRAM, но и указать инициализирующий файл. Попробовал. Пока не всё получилось, но - главное - 16-ти битная память (ROM или RAM), байтовый доступ и инициализирующий файл в виде (та-да-да-дам!) 16-ти битных восьмеричных слов. С возможностью указания - из какого файла грузить :)
Осталось заставить её работать :) Опять гнусные клоки выползли :)
Но главное - в сигнал тапе видно, что читаются правильные слова :)
Потом слегка подрихтую сгенерённое мегафункцией, что бы можно было через параметр указать - тип памяти, размер и ини-файл. И тогда будет проще проводить внутреннее тестирование :) А то у меня сейчас главный тестировщик - VT - если он не завёлся - крупно накосячил :)
Вчера был первый почти успешный вариант дизайна :):) То есть проц с ПЗУ стартует и даже общается с консолью, хотя и с некоторыми глюками.
Значительная часть проблем - из за особенностей дизайна проца от автора. Чего стоит, например, вариант, когда, прочитав первое слово команды (которая, скажем, косвенно через регистр читает ячейку из ПЗУ), проц, не снимая никаких сигналов, просто выставляет новый адрес и ждёт ответа :)
Пока не хочу трогать дизайн проца и пытаюсь обрабатывать в модуле ПЗУ и такой вариант. В целом - оно как бы неплохо, потому что позволяет быстрее читать или писать :) Но нужно очень точно выдерживать порядок приёмы и выдачи сигналов.
Я таки её достал :) Первый вариант, который работает - и пока не к чему придраться :)
Делалось с прицелом, что все устройства на шине могут работать с разной тактовой частотой. Сейчас у проца 25 МГц, ROM - 50 МГц.
Теперь буду пробовать гонять в разных вариантах :)
Переделал :) На выходе тоже рабочий вариант :)
Пробую увеличить тактовую памяти - до 100 МГц
Сегодня с VHDL не работал :) Сегодня работал с листингами MACRO-11 - поскольку из них делается прошивка для ROM и RAM :) Рисовал скрипт, который из листинга делает MIF файл. Пока ещё в процесс :)
А почему не из OBJ/LDA/SAV? Я бы делал из LDA.
А почему не из OBJ/LDA/SAV?
А зачем? Есть исходники, транслируем - извлекаем из листинга. С остальными возни больше.
А зачем? Есть исходники, транслируем - извлекаем из листинга. С остальными возни больше.
С остальным возни в разы меньше. В том же объектном модуле все коды уже лежат готовыми кусками - собираем их в буфер, кое-где подправляем относительные адреса на основании RLD-записей, и готово. Я в свое время за пару часов написал программку, делающую бинарник из объектyого модуля формата RT-11, просто почитав книжку File Formats из комплекта документации по rt11. А из бинарника получается MIF одной командой srec_cat.
Как раз делал терминал VT52 для этого самого pdp2011, взамен авторского убожества blockramxx.
С остальным возни в разы меньше.
У меня большой опыт парсинга текстовых файлов и всё, что нужно - powershell. Плюс при парсинге листинга я могу в mif вставить исходник - что позволяет мелкий ремонт делать прямо в mif-е. Попробуйте тоже самое сделать с двоичными файлами.
В том же объектном модуле все коды уже лежат готовыми кусками - собираем их в буфер, кое-где подправляем относительные адреса на основании RLD-записей, и готово.В LDA-файле еще лучше. Те же готовые куски, только адреса там уже исправлены на абсолютные. Записи там всего двух типов: (1) данные и (2) конец программы, там же пусковой адрес. А если программа расположена компактно, то еще проще взять .SAV-файл, ему просто обрезать незначащие начало и конец, тут и программу обработки-преобразования сочинять не надо.
Плюс при парсинге листинга я могу в mif вставить исходник - что позволяет мелкий ремонт делать прямо в mif-е. С этим, конечно, не поспоришь. С одной стороны. С другой - а на фига править прямо в mif-е, если есть эмулятор? Поправил исходник, запустил в эмуляторе батник... Отставить! .COM-файл, потом в винде из полученного бинарника батником делаем mif и вперед!
С другой - а на фига править прямо в mif-е, если есть эмулятор?
Потому что
Поправил исходник, запустил в эмуляторе батник... Отставить! .COM-файл, потом в винде из полученного бинарника батником делаем mif и вперед!
куча лишних телодвижений. И плюс достаточно хорошее знание команд PDP-11, что бы сыграть роль MACRO-11 :)
Но для меня главное, что глядя в один (готовый) файл - можно видеть - и что располагается по каким адресам и что оно там делает :)
Я, конечно, в начале работы над FPGA запускаю несколько FAR-ов и даже могу расположить 4 из окна на мониторе, чтобы видеть всё и не переключаться между окнами, но когда одно-два окна, в которые надо смотреть - оно удобнее :)
Hunta,
Выложите исходники. У меня похожая плата - DE10-nano. На ней нет SDRAM, но у меня модулем она подключена. Опыт работы с SDRAM у меня большой. Можно будет совместно развивать.
Saar, как такового - готового проекта нет. Основное, что я сделал - оторвал тактовый генератор процессора от того, что выдаёт SDRAM (или SRAM, если на плате нет SDRAM) в проц. Ну и плюс сильно недоделанный сигнал типа Ready, поступающий от всего (ну или должный поступать от всего в идеале) на шине при обращении проца.
Я пока больше развлекаюсь с попыткой подстроится под особенности работы проца с памятью (но чувствую - надо сделать нормально эту работу), а так же с BRAM и занесением инфы в неё из прошивки - в режиме - а ещё я так vhdl учу, потому как пока в голове не отложилось - что насинтезируется железного из моих описаний...
Ну и пока у меня таймаут из-за других дел.. Недели две уже как...
После долгого перерыва опять вернулся к FPGA. Точнее, к скрипту, который переделывает листинг в MIF файл. Добил до вариант, прогон которого уже позволяет (правда, пока ещё делается некоторое количество правок руками как в исходном листинге, так и в MIF файле) получившийся результат использовать в синтезе. Как выглядит:
-- begin_signature
-- m9312l
-- end_signature
WIDTH=16;
DEPTH=256;
ADDRESS_RADIX=UNS;
DATA_RADIX=OCT;
CONTENT BEGIN
0 : 165000; -- 165000 165000 data0: .word data0 ; test data structures
1 : 165000; -- 165002 165000 .word data0 ;
2 : 100000; -- 165004 000 200 data1: .byte 000, 200 ;
3 : 177777; -- 165006 177777 data2: .word 177777 ;
4 : 165006; -- 165010 165006 .word data2 ;
5 : 165006; -- 165012 165006 .word data2 ;
6 : 000500; -- 165014 000500 .word memloc+0 ;
7 : 000501; -- 165016 000501 .word memloc+1 ;
-- ; .=base+20
-- DIAG: ; PRIMARY DIAGNOSTIC ENTRY POINT
8 : 005003; -- 165020 005003 T1: clr r3 ; R3=000000 C=0
9 : 005203; -- 165022 005203 inc r3 ; R3=000001 C=0
10 : 005103; -- 165024 005103 com r3 ; R3=177776 C=1
11 : 006203; -- 165026 006203 asr r3 ; R3=177777 C=0
12 : 006303; -- 165030 006303 asl r3 ; R3=177776 C=1
13 : 006003; -- 165032 006003 ror r3 ; R3=177777 C=0
14 : 005703; -- 165034 005703 tst r3 ; R3=177777 C=0
15 : 005403; -- 165036 005403 neg r3 ; R3=000001 C=1
16 : 005303; -- 165040 005303 dec r3 ; R3=000000 C=1
17 : 005603; -- 165042 005603 sbc r3 ; R3=177777 C=1
18 : 006103; -- 165044 006103 rol r3 ; R3=177777 C=1
19 : 005503; -- 165046 005503 adc r3 ; R3=000000 C=1
20 : 000303; -- 165050 000303 swab r3 ; R3=000000 C=0
21 : 001377; -- 165052 001377 bne . ; br . if FAIL
22 : 012702; -- 165054 012702 T2: mov #data0,r2 ; R2=165000
23 : 165000; -- 165000
--здесь текст вырезал, особого смысле полностью приводит не вижу - всё вырезанное примерно такое же...
250 : 014304; -- 165764 014304 T8D: mov -(r3),r4 ; memory FAIL, put bad data to R4
251 : 010300; -- 165766 010300 mov r3,r0 ; put bad addr to R0
252 : 005006; -- 165770 005006 clr sp ; zap SP
253 : 000000; -- 165772 000000 halt ; and DIE
254 : 040460; -- 165774 060 101 verson: .ascii "0A" ; version ID
255 : 123162; -- 165776 123162 crc16: .word <123162> ; CRC-16 will go here
END;
Работа над ним продолжается :)
Перодически, по мере свободного времени, продолжаю копаться в PDP-11 на FPGA. Вчера случайно забабахал в модуль проца предвыборку слова из следующего адреса. Но поскольку случайно - оно как бэ не совсем работает. То есть на однословных командах (не переходах) просто Зупер, но поскольку получилось случайно - в целом проц не работает :)
ROM BRAM сейчас работает 200 МГц тактовой, но каждый цикл чтения - три такта. В планах - поднять до 400 МГц и/или сделать работу однотактовой.
Ну и проц всё таки вернуть в рабочий вид :)
Случайно научился задержки выдачи сигнала по полтакта, то есть типа - данные выдаются по фронту, готовность - по (следующему) срезу, а на следующем фронте - сигнал готовности без задержки относительно фронта клока. Может, где и описан - но я ж книжек не читаю, метод обучения - исключительно битьём головой об стол :):) В общем, когда видишь готовый результат - ЭХ, КАК ЖЕ Я РАНЬШЕ ТО НЕ ДОДУМАЛСЯ!!! :):)
- - - Добавлено - - -
В целом, сейчас воюю с заставлением проца работать с BROM, которая работает на произвольной частоте :) В силу своеобразного дизайна проца... Тяжело идёт :) Но резать проц по крупному ишо не готов :) Надо мышление натренировать на железячное :)
- - - Добавлено - - -
А, да, предвыборку пришлось покоцать. Рано исчо с этим воевать :)
Случайно научился задержки выдачи сигнала по полтакта, то есть типа - данные выдаются по фронту, готовность - по (следующему) срезу, а на следующем фронте - сигнал готовности без задержки относительно фронта клока. Может, где и описан - но я ж книжек не читаю, метод обучения - исключительно битьём головой об стол :):) В общем, когда видишь готовый результат - ЭХ, КАК ЖЕ Я РАНЬШЕ ТО НЕ ДОДУМАЛСЯ!!! :):)
эх не понял ниче, но чувствую что там чтото интересное... может какой кусочек кода небольшой чтоб понять как обычно делают и как по новому можна делать?
кусочек кода небольшой
Ок, вечером.
entity SysROM is
port
(
BaseAddr : in std_logic_vector((bus_addr_width-1) downto 0)
; FromBus : in typeFromBus18
; ToBus : out typeToBus
; mem_clk : in std_logic
);
end SysROM;
architecture implementation of SysROM is
component ROM
PORT
(
address : IN STD_LOGIC_VECTOR ((addr_width-1) DOWNTO 0);
clock : IN STD_LOGIC := '1';
rden : IN STD_LOGIC := '1';
q : OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
);
end component;
begin
sdram: ROM
port map
(
address => RomCurrAddr((addr_width-1) downto 0)
, clock => mem_clk
, rden => isReadEnable
, q => Data
);
isAddrMatch <= (BaseAddr((bus_addr_width-1) downto addr_width) = FromBus.Addr((bus_addr_width-1) downto addr_width)) and FromBus.Common.isAddrReady;
isDataReady <= isAddrMatch
and FromBus.Common.isGetData
and (CurrAddr = FromBus.Addr)
and (CurrMemState = memIdle);
ToBus.isAddrMatch <= isAddrMatch;
ToBus.Data <= Data when isDataReady else
(others => '0');
ToBus.DataReady <= '1' when isDataReady else
'0';
process(mem_clk)
begin
if rising_edge(mem_clk) then
case CurrMemState is
when memIdle =>
if isAddrMatch
and FromBus.Common.isGetData
and (CurrAddr /= FromBus.Addr) then
RomCurrAddr <= FromBus.Addr;
isReadEnable <= '1';
NextMemState <= memLoadAddr;
else
isReadEnable <= '0';
end if;
when memLoadAddr =>
CurrAddr <= RomCurrAddr;
NextMemState <= memWaitRead;
when memWaitRead =>
isReadEnable <= '0';
NextMemState <= memDataReady;
when memDataReady =>
NextMemState <= memIdle;
when others =>
isReadEnable <= '0';
NextMemState <= memIdle;
end case;
end if;
end process;
process(mem_clk)
begin
if falling_edge(mem_clk) then
CurrMemState <= NextMemState;
end if;
end process;
end implementation;
Задача - ToBus.DataReady должен быть выставлен после того, как ToBus.Data устаканились.
Можно, конечно, на следующем rising_edge(mem_clk), но это потеря такта :) Интересней - на falling_edge(mem_clk).
Но снимать его надо без задержки - на rising_edge(mem_clk)
Сначала делаем state машину с кучей действий для каждого state, а потом выдавливаем это всё в параллельное выполнения.
И хрен кто разберёт, КАК ЭТО все РАБОТАЕТ???? :D
После длительной неработоспособности проца (где то недели три, как я его "разобрал" - попытка реализовать протокол, похожий на протокол обмена по МПИ) сегодня прошёл первый запуск с работоспособностью пульта :)
Теперь посмотрю, что будет, если менять тактовую проца и ПЗУ пульта - одна из целей - добиться работоспособности на любой (ну в пределах работы внутренности - вряд ли заведу проц или ПЗУ на гигагерце) комбинации скоростей. Сейчас у меня на выбор 25, 50, 100, 200 и 400 МГц
Попытка повысить клок проца с 25 до 50 МГц прошла успешно.
Попытка повысить скорость памяти с 50 до 100 МГц - сбой внутреннего обработчика состояний. Так же проц перестал работать на клоке 1 Гц. Буду разбираться, но позже.
Надо же. Проц и на 100 МГц завёлся :) Раньше максимум на 50-ти :)
Сколько получалось у автора - не совсем понятно, там клок от памяти шёл.
Но пока у меня медленно получается по скорострельности в инструкция (около трех миллионов) - надо дорабатывать работу памяти (что бы можно было повысить скорость) и процессора с шиной
Пользуюсь тем, что синтез идёт приличное время (сейчас, видимо из за top элемента - минут 35, буду с этим разбираться, но потом) - иногда вношу изменения даже с работы :)
Сейчас отрабатываю работу с BRAM памятью пословно и побайтно (собственно, само по себе это проблем не вызывает) плюс смотрю - удастся ли прикрутить её инициализацию. Собственно, если синтез ROM - то вопросов вообще нет - PDP не читает с шины байты, а вот если RAM...
Значительно чаще синтез стал проходить успешно, но, видимо, где то возросли задержки и пришлось снизить скорость до 50 МГц. Пошёл второй подход к Timing Analyzer - буду потихоньку учиться добавлять временные констрейнты.
Внутри синтезированного ядра решил отказаться от подхода QBUS - слишком много тратится клоков на отработку протокола, пусть и без фаз - выдача адреса-выдача данных - учитывая, что шины адреса и данных - раздельные. Но надо будет реализовать модуль работы с QBUS, подключенной снаружи - 36 контактов на гребёнке вроде должно хватить для подключения внешний плат. Но это - не ближайшее будущее :)
Время только катастрофически не хватает...
Как это не странно, но Квартус не отказался инициализировать RAM массив из двух-байтовых слов (слова описаны как двухбайтовый массив, то есть получаем двухмерный массив) mif файлом, в котором использовались 16-ти битные слова, не байты (то есть, например 012737, а не 025, 337). Одной проблемой меньше :)
- - - Добавлено - - -
В общем, делать RAM и загонять туда тестовую (или не тестовую) прошивку, полученную из листинга, теперь нет особых проблем. А когда допилю скрипт - и вообще mif файл будет делаться мухой.
Немного ускорил работа процессора с шиной (вместо четырёх тактов стало три), к чему стремиться - ещё есть. Пока на этом остановлюсь, займусь восстановлением работоспобности модуля видеотерминала. Времени, как обычно, кот наплакал, так что - урывками и пользуюсь тем, что синтез идёт в лучшем случае минут 15, если не свезёт (как с попыткой сделать два такта) - то и под час - так что в параллель с основной работой. Чего сломал в модуле VT, пока не понял, так что, скорее всего начну с доделки скрипта генерации mif из листинга - что бы проще было загонять тестовый код в память. Ну и может сигналТуп что подскажет..
не ПДП-11 конечно, но где то рядом. Значительнее ранее
Увы, удалить попозже не представляеЦЦа возможным. лесники запретили .
https://www.youtube.com/watch?v=iymD9eysqXo
Ну, что такое PDP-1 - я знаю. Где то даже наталкивался на ссылки - реализации разных PDP на FPGA. Когда доведу до ума PDP-2011 - может, другие поковыряю..
Увы, удалить попозже не представляеЦЦа возможным. лесники запретили .
Эту фразу чет не понял...
Korchagin
22.12.2018, 11:17
Hunta, а в Вашей переработанной реализации уже сделана внешняя шина или планируется к реализации?
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot