но это не значит, что их нет, под ретро проект можно и достать ЭЛТ любой диагонали, было бы хотение! ;-)
или как на чертеже от @Manwe сразу нужного размера матрицу лепить к проекту - вот это вообще "под ключ" )
Вид для печати
но это не значит, что их нет, под ретро проект можно и достать ЭЛТ любой диагонали, было бы хотение! ;-)
или как на чертеже от @Manwe сразу нужного размера матрицу лепить к проекту - вот это вообще "под ключ" )
Ну вот так всегда - придет поручик и опошлит все мероприятие :)
Да, на VGA почти нигде не заведено I2C на FPGA, там же согласователь уровней надо ставить для гарантии.
На HDMI повеселее, на Reverse-U16 вроде бы I2C заведено.
- - - Добавлено - - -
Да, это уже следующий уровень. Ессно, никто не критикует и не настаивает, просто для понимания как оно в норме должно бы быть.
Зашел на hotline - все еще есть в продаже новые 1280х1024, и даже модели 2019 года. Но согласен, не мейнстрим давно уже.
Вот эти все константы 11'dxxxx - надо записать в регистры, и сравнивать не с константой, а с регистром, и все будет ОК.
Но, в идеале, надо осваивать перепрограммирование PLL и делать отдельный клоковый домен для VGA, тогда любой видеорежим можно поддержать. Ну... непрост... но в идеале.... :)
Ну, 1600х1200, это, конечно, не 5:4, а 4:3, но и не 16:9 :)
1) Я в своём хобби-проекте как раз делаю видеовыход с поддержкой EDID - VGA/HDMI/DVI. Всё режается установкой одного мелкого STM32F103.
2) Куча разрешений легко укладываются, если картинку "вписывать" удвоением/утроением/etc пикселей. Просто для адресации видео-ОЗУ клок для счётчиков делим, как надо. Минусы - дублирующая логика. Если брать только с удвоением или без - просто мультиплексированием битов счётчика.
У меня STM'ка читает EDID с VGA, а вот с DVI/HDMI общается свой чип - с него инфа забирается так же в STM'ку. Оттуда по SPI вся инфа о таймингах и параметры PLL пишутся в FPGA - там сделал регистры для управления видео и PLL, всё вполне работает в железе. Сейчас жду печатки, что бы проверить чип для HDMI и избавиться от макеток с кучей проводков.
А если FPGA жирная, то у меня есть готовое решение без внешней STM'ки - с софт-ядром Cortex-M0, функционал тот же, только регистры висят сразу на шине AHB.
Вот вполне рабочий код, если кому надо: https://pastebin.com/dejJnD4e
Тут вся работа с EDID имеется - чтение, парсинг. Печатает Modeline в *NIX-like стиле, только частота в килогерцахи в HEX:
https://i.ibb.co/MBKGSgH/image.png
Очередной этап развития проекта завершен. Я сделал наконец обещанный контроллер MY.
Это, пожалуй, самый сложный и интеллектуальный контроллер дисковода из всех использовавшихся с ДВК. Он использует DMA и имеет производительность не хуже RK11 - команда COP/DEV MY0: MY1: отрабатывается меньше чем за 5 секунд. Что странно, для загрузки параметров команды в этом контроллере используется не набор регистров (цидиндра, сектора, счетчика итд), как в стандартном дековском оборудовании, а блок данных в памяти, также передаваемый через DMA. Возможно, таким образом упростили схемотехнику контроллера или упростили жизнь программистам - такой метод проще и быстрее, чем последовательная загрузка через один регистр в RX01.
Оригинальный контроллер был построен как микропроцессорная система на 1801ВМ1. Мой FPGA-вариант обошелся набором машин состояний, дабы не загромождать и без того ограниченный бюджет FPGA огромным процессорным ядром и не убивать производительность программной реализацией DMA-обмена.
Имеются следующие отличия от оригинального контроллера:
- Оригинальный контроллер мог работать с 40- и 80-дорожечными дисководами - это задавалось перемычками на плате. Мой вариант эмулирует только 80-дорожечный дисковод. Образы, снятые с 40-дорожечного дисковода и записанные на SD-карту контроллер будет корректно читать и записывать, но проинициализировать 40-дорожечную файловую систему невозможно. Да и не надо.
- Команды "форматирование" и "чтение заголовков" не поддерживаются. Реализация этих команд не имеет никакого смысла, поскольку мы работает с поблочными DSK-контейнерами на SD-карте, где никаких служебных областей и близко нет.
- Команды "чтение с меткой" и "запись с меткой" работают как обычные команды чтения-записи. Служебной области у нас нет, метку хранить негде. Я сомневаюсь, что эту возможность вообще хоть кто-то использовал на практике.
- Оригинальный контроллер мог работать с секторами размером 256, 512 и 1024 байта. Формат сектора хранился в его заголовке. Здесь поддерживаются только 512-байтные сектора, что более чем достаточно для работы с образами, созданными на ДВК.
- Контроллер в DMA-режиме ограничен 16-битным адресным пространством. Оригинальный контроллер имел возможность расширения адреса до 22 бит, но в данном случае реализация этой возможности не имеет никакого смысла - у нас 16-битная шина адреса. Но доработать контроллер до полной 22-битной шины адреса можно за полчаса. Будем надеяться, что когда-нибудь появится смысл в такой доработке.
В остальном контроллер функционально повторяет оригинал. Загрузка системы работает. В стартовый образ initdisk.img я добавил образ диска MY0 с системой ФОДОС-ТМОС. Теперь можно напрямую использовать огромные залежи MY-дискет, лежащих в разных архивах в сети.
Также прилично доработана документация. Описано распределение памяти на SD-карте, более детально описана работа дисковой подсистемы, добавлена полезная информация для портирующих проект на другие типы FPGA.
По сути, все массово применявшиеся в ДВК дисковые контроллеры теперь реализованы. Был еще MX, но делать эмуляцию этого убожества на SD-карте нет никакого смысла.
Теперь, конечно, было бы неплохо реализовать ленточный контроллер MT с магнитофоном CM-5300. Но у ленты, в отличие от диска, переменный размер блока и последовательный доступ в оба направления. Боюсь, что тут машинами состояний не обойтись, придется процессорное ядро подключать. Или ну ее нафиг эту ленту, все равно на ДВК ей мало кто пользовался...-
Перемычками на контроллере задавались временные параметры дисковода - время разгона мотора, время перехода между дорожками, время загрузки головки. Естественно для эмулятора на SD эти параметры и не нужны. А объём дискеты задавался в драйвере MY.SYS, что-то типа того SET MY NTRK=40. Так что при необходимости можно проинициализировать и 40-дорожечную файловую систему, главное найти нужный драйвер.
Там всего-то 2 перемычки, уходящие в стартовый регистр процессора. Они и задавали тип дисковода 6022 или 6121, а отличаются эти дисководы как раз числом дорожек.
А параметр NTRK, насколько я помню, использовался для чтения 40-дорожечных дискет на 80-дорожечном дисководе. Хотя я могу и ошибаться - в исходники драйвера я не влезал, а реально пользовался всем этим четверть века назад.
Насчет сетевых интерфейсов не знаю, ни разу не сталкивался в реальной жизни. А MSCP-контроллеры, да, конечно, использовали похожий метод, но не совсем - там контроллеру отправлялся командный пакет вместе с кодом команды и всеми парамтерами. Пакет ставился в очередь, и можно было отправлять следующий пакет. В MSCP это логично и оправданно. А вот так, чтобы задавать код команды через регистр, а параметры пакетом - такого мне больше нигде не встречалось. Хотя есть еще DY, с ним я не встречался никогда, может быть там тоже так же сделано...
У некоторых версий MZ драйвера (а их несколько) по мимо этого параметра был ещё REGIM
это самые популярные, были\есть ещё варианты, в том числе драйвер размером 19 блоков ;-)Код:ЛAТ
RT-11SJ V05.04 G
Date? 19-JAN-2021
WD2>DS MZ
File name: "DK:MZ.SYS", size: 4. blocks.
Release = V05, Version(s) = 1
*** Handler data structure
Handler size 182. bytes
Device size 1600. blocks
Device status word 100374 = [ FILST$ ]
Device code 374
CSR address 176674
Vector 474
* Installation code for DATA SYSTEM
* Bootable device
H.BPTR=001266, H.BLEN=512.b, H.READ=000210
*** Set options table:
RETRY = decimal entry 412
WD2>
SYSTEM PASCAL [WD2]
+++++++++++++++++++++++++++++
ЛAТ
File name: "WD:MZ.SYS", size: 4. blocks.
*** Handler data structure
Handler size 610. bytes
Device size 1600. blocks
Device status word 102774 = [ FILST$ SPFUN$ VARSZ$ ]
Device code 374
Sysgen options 000004 = [ TIMIT$ ]
CSR address 176674
Vector 474
* Bootable device
H.BPTR=002142, H.BLEN=512.b, H.READ=000210
*** Set options table:
NTRK = decimal entry 506
SIDE = decimal entry 532
STEP = decimal entry 614
NSCT = decimal entry 734
REGIM = decimal entry 624
[no] BUFF entry 634
RETRY = decimal entry 472
WD2>
SYSTEM PASCAL [WD2]
Он там даже режим IBM-PC дискет вроде как может...
Перемычки отвечали за временные параметры, была ещё комбинация для технологического теста. А читать 40-дорожечные дискеты на 80-дорожечном дисководе прямо контроллер не умеет, надо позиционироваться на заданную дорожку командой SEEK и читать текущую дорожку командой RDTR. Параметра пропуска дорожек в MY не было.
Портировал проект на Quartus 12.1, собрал под DE0 (отключил UART2, LPT, buzzer).
VT52 работает. Система останавливается с R7=000000, R6=000776, R0=140001
Надо разбираться, возможно кривую SD карту вставил
Что, даже промпта @ на экран не выкатывается?
Тогда, скорее всего, проблема в SDRAM.
Кстати да, про SDRAM я забыл совсем :(
Спасибо за наводку.
p.s. надо себе табличку в Excel сделать с описанием button/switch/led для DE0, как я их использовал
а мне повезло меньше :))
Под классику DE1 не хватило внутренней памяти для РОМ. немножко. эх..
Под DE10 конечно собирается, но этот вариант мне меньше нравиЦЦа, так что еще не проверял.
Можно терминал VT52 выкинуть, сразу очень много памяти освободится.
Ну ежели можно - тогда вот прямо сейчас попробую без него скомпилить. Спасибо.
upd: Иххх, не судьба мне запустить на DE1. На ней конечно есть UART, и наверное даже можно с РС подцепиться, но хотелось бы изображение на подключенном мониторе, а без модуля терминала - это невозможно, насколько я понял.
Без терминала конечно компилится, ресурсов поболее, но изображения само собой нет.
Если я отключаю rom055 (надо 4кБ, у меня только 1кБ на нее остается) - тогда картинку терминала я вижу :) Но клава не работает, видимо не с чем :(
Ладно, когда нить попробую на 5м циклоне, но там у меня все еще печальнее.
Ну и еще один вопрос - а под SRAM память это можно ли переделать, или уж слишком много надо памяти на все про все ?
SDRAM у меня работает. Тест RAM проходит. Не грузится по @B , RK
Что-то таки или с содержимым SD, или с прерываниями таймера (вроде как включил таймер, LED светится). Что-то не понимаю...
https://www.dropbox.com/s/xssea5trlr..._hang.jpg?dl=0
C DX и MY тоже не грузится? Тогда да, или глючная карта (таких много попадается), или неправильно на нее записаны образы дисков, или неправильно выставлены переключатели дискового банка. Тут разбираться надо. Вручную командами монитора прочитать с RK сектор 0, и посмотреть в памяти по адресу, то лежит или не то. Обычно загрузчик вот так повисает, если не находит в первом прочитанном слове кода 000240.
С DX и MY так же не грузится (одинаковая реакция). Писал на SDHC карты из старого фотика (им лет 10-12): SanDisk Extreme III (class 6, 8GB) и Transcend (class 6, 16GB). Может взять microSD? Валяется 16GB SanDisk class 10 где-то.
Буду благодарен за подсказку. Не силен в программировании контролера через регистры :)Цитата:
прочитать с RK сектор 0, и посмотреть в памяти по адресу, то лежит или не то
Для загрузки сектора 0 с RK достаточно сделать сброс, чтобы привести регистры контроллера в исходное состояние, записать регистр счетчика слов, затем команду:
Как видим, по адресу 0 появилось слово 240, потом 415, ну и так далее - весь нулевой блок диска.Код:@177406/000000 177400^
177404/000200 5
@0/000240
000002/000415
000004/000000
000006/000000
Кстати, появилась идея задать смещение данных на SD карте к началу 1 раздела (partition).
Тогда можно сделать 2 раздела:
- первый как контейнер для дисков MC1201-02 (по известному смещению от MBR),
- второй - "остаток" под FAT32.
А зачем, собственно? Жалко отдавать всю карту под образы дисков?
- - - Добавлено - - -
Решил попробовать сделать прикидку графического контроллера КГД.
В результате оказалось, что отлаживать его особо и нечем. С трудом среди дампов своих старых рабочих дискет нашел программку LAND.SAV.
Картинка получилась вот такая:
Скрытый текст
https://i.imgur.com/XZEv5ET.jpg[свернуть]
Картинка, конечно, неправильная, но для анализа работы схемы не очень годится.
Поэтому прошу местных специалистов - подскажите, пожалуйста, софт, с помощью которого можно потестировать КГД. Не видеопамять, а именно нарисовать на экране какую-нибудь тестовую картинку.
Ноль координаты X смещён. Не учтено время движения луча до начала картинки?
Да есть проблеми на MacOS у меня с записью на целый диск. Тут тупо какое-то анальное ограждение:
> sudo dd if=initdisk.img of=/dev/disk2 bs=1048576 count=128
dd: /dev/disk2: Resource busy
На desktop-pc под Linux другая проблема: SanDisk SD-SDHC USB card reader "сломался", не пишет, дает I/O error.
Есть еще рабочий ноут под Win10, поставил на Win32 Disk Imager. Но пришли "обновления политик из домена", ноут перегрузился и 2й час что-то накатывает себе.
Быстрее offset добавить в модель диска(-ов), чем доставать еще 1 ноут с виндой, заряжать его, ставить Win32 Disk Imager, записывать диск там.
Так там, как я понимаю, в одном месте константу приплюсовать.
- - - Добавлено - - -
Нет, ошибся, не в одном. В двух местах.
- - - Добавлено - - -
Хм.. интересное устройство контроллеров sd карты. Я бы, конечно, сделал не так, но.. В этом варианте смещение добавляется ещё в двух местах...
Не все так просто, к сожалению. Проблема тут в определении момента, когда надо загружать очередной байт из видеобуфера.
Но, к сожалению, я нарвался на временные ограничения - куча красных отрицательных слаков в TimeQuest. Как чувствовал, что 50 Мгц - уже многовато для видеоконтроллера.
В результате, если сделать как надо, контроллер вообще перестает работать. Тут, конечно, словами не объяснить, тут надо фрагменты исходников приводить...
Ладно - это мои проблемы, думаю что вполне разрешимые. Вот сижу, думаю как соптимизировать путь загрузки пикселей из видеобуфера...
Попробовал дать команды на регистр 0177406 -> нет реакции, не читает по адресу 0.
Накосячил, значит, вокруг маппинга SD сигналов в SPI.
Вообще-то 177406 - регистр счетчика слов. Командный регистр (CSR) - 177404.
В смысле - содержимое памяти по адресу 0 не меняется? Или меняется, но первым словом не 000240?
- - - Добавлено - - -
А, ну понятно. Вот так всегда бывает, когда несколько параллельных веток обсуждения идут.
Насчет SD-карты - действительно, для каждого контроллера надо вычилсять свой start_offset. Наверное, нужно было завести одну отдельную шину для сборки старшей части адреса всех контроллеров. Как-то не подумал...
Ну, моя идея была в том, что смещение задается через порт start_offset каждого контроллера без модификации самих контроллеров, и уж тем более модулей sdspi.
Но, конечно, я поленился вынести из sdspi полную шину адреса, хотел сэкономить малость - вынес только 23 бита. Думал, этого вполне достаточно, все-таки 4 гига, куда уж больше.
Получается, надо выносить все 32 бита. В следующем релизе так и сделаю.
Завершена половинка следующего этапа проекта - графический контроллер КГД.
Контроллер использует режим SVGA 800*600*75 Гц, и картинка в режиме удвоения пикселей ложится точно пиксель-в-пиксель по горизонтали, и с небольшим верхним темным полем по вертикали. Вот как примерно выглядит результирующее изображение:
графические часы
https://i.imgur.com/rL7vc6G.png[свернуть]
игрушка LAND
https://i.imgur.com/EBQaEPF.png[свернуть]
игрушка PIFPAF
https://i.imgur.com/8lh5WdE.png[свернуть]
На вышеприведенных картинках немного обрезан левый край, но это следствие некорректной работы устройства видеозахвата - оно плохо дружит с квадратными режимами изображения. На мониторе все выглядит правильно.
Всю эту красоту портит тот факт, что в игрушки эти поиграть не получится. Слишком быстрая у нас получилась платформа. Например, в игрушке LAND каждая попытка завершается примерно за секунду. Поскольку игрушки - это чуть ли не наиболее частый вариант использования графического контроллера, эта проблема является серьезным ограничением. Как обычно в мире DEC, разработчики проявляют обычное разгильдяйство, и привязывают свои программы не к системному таймеру, а к тактам процессора.
Надо сделать возможность при необходимости притормозить систему. Сильно понижать тактовую частоту нельзя - начнутся проблемы с SDRAM. Я попробовал задержать обращения к регистрам КГД - добавил в схему задержку ответа REPLY на 32 такта. Стало чуть помедленнее, но все равно очень быстро. Надо думать дальше.
Создание КГД само по себе еще не является полноценным этапом развития проекта. Надо переделать терминальный модуль на разрешение 800*600, чтобы можно было совмещать текст и графику. Без этого, например, нельзя воспользоваться графическим вариантом бейсика. Точнее можно, но только если разнести текст и графику по разным мониторам. Поэтому я пока не внес КГД в основную ветку репозитория, а создал отдельную ветку graphics, в которую внес все текущие изменения. Если у кого есть желание, можете сами попробовать.
В моем 1801вм2 проблема снижения частоты полностью решена. Доберусь до компа - расскажу
Итак, во все мои модели процессоров встроен "дульный компенсатор" - специальный блок позволяет имитировать работу ядра на низкой частоте, при этом внешняя шина Wishbone продолжает работать на общей (высокой) частоте SoC, позволяя периферии (например, SDRAM) не замедляться.
Там есть такие сигналы:
// - vm_clk_p - processor core positive clock, also feeds the wishbone buses
// - vm_clk_n - processor core negative clock, should be vm_clk_p 180 degree phase shifted
// - vm_clk_ena - slow clock simulation strobe, enables clock at vm_clk_p
// - vm_clk_slow - clock mode selector, enables clock slowdown simulation,
// the external I/O cycles is launched with rate of vm_clk_ena
vm_clk_p - позитивный клок процессорного ядра, сюда постоянно подается высокая частота (50-100MHz), и на ней работает системная шина (Wishbone)
vm_clk_n - негативный клок процессорного ядра, для внутренних нужд, просто инвертированный vm_clk_p (я предпочитаю снимать с PLL с фазой 180)
vm_clk_slow - это селектор режимов, если низкий уровень, то это "turbo", дульный компенсатор отключен, все блоки ничего не ждут, работа на максимальной частоте. Если уровень высокий, то включается специальный блок замедления. Есть специальный двунаправленный счетчик, он считает такты высокой частоты на сложение и низкой частоты (задается входом, описанным ниже) на вычитание, в момент когда ядро хочет выполнить ввод-вывод на шине - оно останавливается и счетчик перестает считать высокую частоты на сложение, работает ТОЛЬКО вычитание. По достижению счетчиком нуля - ядро разблокируется и выполнятся цикл ввода-вывода. Снаружи это выглядит так, как циклы эмитированы процессором, работающим на малой частоте. Сам ввод-вывод выполняется на полной скорости, не внося проблем в работу SoC.
vm_clk_ena - разрешение такта низкой частоты. Это не клок, это разрешение тактов. Например, мы хотим имитировать ВМ2 на 5МГц внутренней частоты (10 внешней). И основная тактовая SoC у нас 100MHz. На вход vm_clk_ena в течение 19 тактов высокой частоты 100MHz должен подаваться низкий уровень, и один такт высокий, скважность 1/19. Такой подход также позволяет имитировать любые частоты с использованием фазового аккумулятора (можно, например 5.33MHz или 99MHz). В моей репке cpu11 тестовые проекты поддерживают режим замедления, там есть переключатель, все тестировалось и проверялось.
Топ модуль
Код:set_location_assignment PIN_AB30 -to FB_Switches[0]
set_location_assignment PIN_Y27 -to FB_Switches[1]
set_location_assignment PIN_AB28 -to FB_Switches[2]
set_location_assignment PIN_AC30 -to FB_Switches[3]
set_location_assignment PIN_W25 -to FB_Switches[4]
set_location_assignment PIN_V25 -to FB_Switches[5]
set_location_assignment PIN_AC28 -to FB_Switches[6]
set_location_assignment PIN_AD30 -to FB_Switches[7]
set_location_assignment PIN_AC29 -to FB_Switches[8]
set_location_assignment PIN_AA30 -to FB_Switches[9]
s_SwitchesDeBouncedClocked - сигналы с подавленным дребезгом, снимаются с FB_Switches - 10 движковых переключателей на платеКод:constant sw_SlowClockMode : integer := 2;
...
signal s_SwitchesDeBouncedClocked : std_logic_vector(9 downto 0);
...
signal s_SlowClockMode : std_logic := s_SwitchesDeBouncedClocked(sw_SlowClockMode);
...
s_Clk_Cpu <= s_Clk_100MHz when (s_SlowClockMode = Low) and (s_ManualClockOn = Low) else
s_Clk_1Hz;
Подавление дребезга - это старая и давно решенная проблема, о ней даже неудобно говорить :).
Вот тут есть модуль wbc_button, он с параметром, указывается сколько миллисекунд дребезга подавить.