Просмотр полной версии : Радио-86РК: Реализация компьютера на ПЛИС
Santechnik
27.05.2010, 13:17
Приветствую!
Сейчас появилось достаточно много ретро-компьютеров, выполненных на ПЛИС. У меня возникло желание воспроизвести компьютер Радио-86РК.
В качестве второй цели проекта - изучение современных технологий.
Итак. В качестве начальной платформы будет выступать Altera DE1. Причина выбора в том, что эта плата содержит все необходимые компоненты, что позволит собрать и отладить устройство за меньшее время, т.к. не потребуется подбор/замена/проверка компонентов, а также сборка и изменение физической схемы.
После того, как проект будет отлажен, планируется создание автономного устройства.
Процессор будет использован Т8080 модифицированный svofski для его проекта Вектор-06С, за что ему отдельное спасибо. ;)
Вся простая логика на ПЛИС уже собрана на 80%.
Из комплексных задач - создание контроллера DMA, CRT и периферии. В Радио-86РК для этих целей используются соответственно: КР580ВТ57 (i8257), КР580ВГ75 (i8275) и КР580ВВ55 (i8255). Мне не удалось найти свободных готовых решений по этим БИС. На каком-то китайском сайте я нашел i8237 и i8255, но я сильно сомневаюсь, что они легальные. Возможно я все же использую этот i8255 на ранней стадии, чтобы запустить комп и перепишу ее потом.
Что касается i8257, то единственное отличие от i8237 это обратные DACK (low active) у i8257. Остальные отличия, как мне показалось, не существенны, так как относятся к функциям не используемым в Радио-86РК. Я также нашел свободную i8237, но там не реализованы часть нужных функций: www.cs.ucr.edu/~dalton/i8237a/. Можно попробовать использовать этот проект как основу для доработки.
i8275 вообще не смог найти и сейчас пишу ее с нуля. :v2_finge: :)
Клавиатура будет использоваться PS/2. RAM - SDRAM. Оба ROM, ввиду их небольшого размера, будут в ПЛИС. В дальнейшем, при создании готового устройства, возможно они будут вынесены оттуда, если это приведет к удешевлению (что вряд ли).
Видеовыход - композит.
Для загрузки и сохранения программ предполагается использовать 2 варианта:
1) через аудио сигнал (магнитофон, MP3 или CD плейер). Будет IN и OUT.
2) В Flash ПЗУ с переключаемыми страницами, как предложено уважаемым DATAsoft http://zx.pk.ru/showthread.php?t=12137:v2_thumb: Возможно, что можно и запись туда же организовать - надо подумать.
От SD карты решил отказаться, т.к. DOS нормального вроде как нет, да и сама идея теряется.
Так же, возможно, будет сделана и "Микроша". Имеет смысл? Что-то оттуда не было портировано на Радио?
Если проект интересен, то буду рад помощи, советам и идеям. :v2_cheer:
На данный момент нужны дампы для ROMов. Есть дамп знакогенератора, но он с раширением .rom и весит 1Мб :eek: Что с ним делать, чтобы был hex не знаю.
Если у кого-то есть наработки по этим контроллерам, то также буду благодарен за содействие.
Видеовыход лучше VGA, наверное?
Santechnik
27.05.2010, 15:23
Согласен, что лучше. Но как мониторы относятся к такому сигналу, который дает классический РАДИО? Потянут? Потому как не хочется пока отходить от классики и играть разрешениями/частотами.
Я если честно, не имел опыта с мониторами и пока слабо представляю некоторые детали.
И еще лучше сразу сделать программную доработку "Цветные компьютеры РК86", сделать программную поддружку ВИ53, ВВ51, попробовать сделать контроллер дисковода, как описывалось в "Радио", можно сделать выход на принтер (LPT), там же можно будет сделать РОМ-диск (к примеру, сделать его на флеш-карточке). вот чисто мое имхо.
Потому как не хочется пока отходить от классики и играть разрешениями/частотами.
Основной рабочий экран не трогай, а "всё остальное" можно как угодно изменять, подгоняя под нужный режим. Самое простое - обычный скандаблер - строки выводить по ДВА раза за вдвое меньшее время (на строчку). Моники VGA видят такую картинку как 800х600 50гц. Часть изображения сверху и снизу "урежется". Но немножко :)
---------- Post added at 16:07 ---------- Previous post was at 15:50 ----------
Есть дамп знакогенератора, но он с раширением .rom и весит 1Мб Что с ним делать, чтобы был hex не знаю.
Да ну на... Не может быть.
Насчет конвертации - давай файлы, сделаю любые конвертации в WinHex :)
---------- Post added at 16:07 ---------- Previous post was at 16:07 ----------
RAM - SDRAM.
А вот это уже мне интересно. Поделишся технологией?
Некоторые мониторы действительно тяжело переживают VGA на 50Гц, но очень многие терпят. Лушче бы все-таки VGA выход иметь.
Композит удобен тем, у кого монитор умеет с композита делать PIP в углу экрана.
---------- Post added at 16:24 ---------- Previous post was at 16:20 ----------
Да, а 8255 из FPGA Arcade вполне себе исправный. В Векторе работает.
Из комплексных задач - создание контроллера DMA, CRT и периферии.
Контроллер монитора не проблема, нужно знать параметры развертки и знакогенератор.
Контроллер монитора не проблема, нужно знать параметры развертки и знакогенератор.
А если они не фиксированные? У ВГ75 количество строк, столбцов и сканлиний на знакоряд не фиксированно и задаётся в команде инициализации. Там же задаются ещё кое-какие параметры развёртки.
А если они не фиксированные?
Чесслово, не знаю. Но насколько я знаю, используется в РК вроде как один видеорежим, его и нужно эмулировать.
Это ж был самый смак, забубенить через ВГ75 какой-нибудь адский видеорежим, чтобы он был почти графическим. Разве нет?
Чесслово, не знаю. Но насколько я знаю, используется в РК вроде как один видеорежим, его и нужно эмулировать.
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический. :)
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический.
Тады ай :(
---------- Post added at 20:37 ---------- Previous post was at 20:35 ----------
Эмуляторостроители вроде как должны знать о режимах?
DATAsoft
27.05.2010, 20:46
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический. :)
А в игрушке "Трясина" такое ощущение, что "даже в графический".
А в игрушке "Трясина" такое ощущение, что "даже в графический".
Я его назвал потому как, всеравно пискели у него из знакогенератора псевдографики. Для примера можно также назвать демо где на эране изображена карикатура воришки. Как называется она не помню. Есть она на кассете. Ее все планирую оцифровать :)
А так есть точно две прикладные проги - Графический редактор и Бейсик графический и одна игрушка - Гонки (56кб занимает)
Santechnik
28.05.2010, 02:30
Очень рад, что тема интересна. Да и заслуженные ПЛИСостроители подтянулись. ;) Дополнительно стимулирует продолжать.:)
И еще лучше сразу сделать программную доработку "Цветные компьютеры РК86", сделать программную поддружку ВИ53, ВВ51, попробовать сделать контроллер дисковода, как описывалось в "Радио", можно сделать выход на принтер (LPT), там же можно будет сделать РОМ-диск (к примеру, сделать его на флеш-карточке). вот чисто мое имхо.
Как сделать РОМ на SD я не представляю пока - там же разный принцип. SD проще прикрутить как флоппи. LPT ИМХО ненужная фишка. Насчет цвета - а разве такая модификация получила распространение? Были ли программы для такого режима? Может лучше просто Апогей замутить после?
Основной рабочий экран не трогай, а "всё остальное" можно как угодно изменять, подгоняя под нужный режим. Самое простое - обычный скандаблер - строки выводить по ДВА раза за вдвое меньшее время (на строчку). Моники VGA видят такую картинку как 800х600 50гц. Часть изображения сверху и снизу "урежется". Но немножко
А как пропорции изображения себя поведут? Должны измениться вроде, а этого не хотелось бы.
Да ну на... Не может быть.
Насчет конвертации - давай файлы, сделаю любые конвертации в WinHex :) ?
Вот в соседней теме например: http://zx.pk.ru/showthread.php?t=11749. Этот маленький файл развернулся у меня на 1 мег :v2_eek:
А вот это уже мне интересно. Поделишся технологией?
Конечно! Все выложу когда бета будет готова. Могу тебе даже раньше скинуть, когда этот блок отлажу.
Да, а 8255 из FPGA Arcade вполне себе исправный. В Векторе работает.
О! Спасибо за наводку!
А если они не фиксированные? У ВГ75 количество строк, столбцов и сканлиний на знакоряд не фиксированно и задаётся в команде инициализации. Там же задаются ещё кое-какие параметры развёртки.
Пра-а-альна. :cool: Я именно так и программирую - с переменными.:)
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический. :)
Оппа! А я хотел эту функцию схалявить. :rolleyes: Тогда надо пробежаться по функциям и решить что программить, а что нет.
Итак берем даташит и поехали:
1. Псевдографика средствами контроллера, а не через РОМ. Хотел схалявить. Неужели используется?
2. Special code control: End of Row, End of Row-Stop DMA, End of Screen, End of screen-Stop DMA. Все нужны?
3. Blink & Underline Field Attributes. Вроде не используются. Да?
4. Normal Rows / Spaced Rows - Понятия не имею что это. Видимо через строчку отображает строки символов. Хотел не делать.
5. Позиция подчеркивания. Вроде тоже не нужно?
6. Четыре вида курсора: инвертированный блок и подчеркивание плюц каждый тип мигающий и нет. Хотел сделать только подчеркивание 2-х типов.
Впринципе потом доделать можно, если что-то сейчас упустим, когда готовые проги гонять начнем.
1. Псевдографика средствами контроллера, а не через РОМ. Хотел схалявить. Неужели используется?
Зависит от схемы. В стандартном журнальном варианте выводы LA0,LA1 не используются. Но если хочешь в дальнейшем другие "конфигурации" делать (варианты РК или Апогей,Микроша,Партнёр,Юни р), то надо бы сделать. Да и несложно там, обычная табличка.
2. Special code control: End of Row, End of Row-Stop DMA, End of Screen, End of screen-Stop DMA. Все нужны?
В стандартном, по-моему, вообще не использовалось. В варианте с 4Кб монитором использовался как минимум код 0F1h.
3. Blink & Underline Field Attributes. Вроде не используются. Да?
В мониторе нет, в играх использовалось. Особенно Blink.
4. Normal Rows / Spaced Rows - Понятия не имею что это. Видимо через строчку отображает строки символов. Хотел не делать.
Использовалось или нет - не знаю, малополезная фича.
5. Позиция подчеркивания. Вроде тоже не нужно?
Нужно, если будешь делать LA0,LA1. Кроме того она определяет нижнюю границу курсора-блока.
6. Четыре вида курсора: инвертированный блок и подчеркивание плюц каждый тип мигающий и нет. Хотел сделать только подчеркивание 2-х типов.
Если в мониторе используется только подчёркивание, то это не значит, что курсор-блок не надо делать. Там же тоже несложно: либо сканлиния = позиции подчеркивания, либо <= позиции подчеркивания.
Впринципе потом доделать можно, если что-то сейчас упустим, когда готовые проги гонять начнем.
Вот это верно. Можно для начала сделать по-минимуму. Как говорится, аппетит приходит во время еды :)
---------- Post added at 13:17 ---------- Previous post was at 12:26 ----------
Кстати, по поводу пункта 1: кроме LA0,LA1 для вывода этих символов используются также LTEN и VSP. Поэтому даже если не использовать выводы LA0,LA1, то кое-что всё равно будет отображаться, а именно горизонтальные линии на всю ширину символа (а таких символов 4).
Вот в соседней теме например: http://zx.pk.ru/showthread.php?t=11749. Этот маленький файл развернулся у меня на 1 мег
Нормальный файлик, 2 килобайта.
Держи Intel HEX:
А как пропорции изображения себя поведут?
Изменится, но несильно. Можно просто не обращать внимания, можно и подрегулировать на мониторе. Если монитор кошерный - он запомнит настройки для данного режима
Santechnik
28.05.2010, 16:29
b2m, спасибо. Все идет к тому, что всю БИС симулировать придется :v2_smoke: Ладно. Пока сделаю минимум, запущу, потом доделаю. Но сейчас хотя бы буду делать с учетом расширения.
А как курсор блок работает? Просто тупо рисуется белый прямоугольник? Или инвертированный символ? И если второе, то как это работает? Я по схеме смотрю - не получится на Радио инверсию сделать.
Нормальный файлик, 2 килобайта.
Держи Intel HEX:
О! Отлично! Хотя мой Mac на него тоже 1Мб показывает:v2_conf3:, но под Виндой все ОК. :v2_thumb:
Изменится, но несильно. Можно просто не обращать внимания, можно и подрегулировать на мониторе. Если монитор кошерный - он запомнит настройки для данного режима
Я не проверял мой моник на кошерность, но попробую твой вариант. Тем более его проще на DE1 сделать. Но я с вопросами еще зайду, ОК? :v2_rolley А то для меня моники - черный ящик пока :)
Я не проверял мой моник на кошерность, но попробую твой вариант. Тем более его проще на DE1 сделать. Но я с вопросами еще зайду, ОК? :v2_rolley А то для меня моники - черный ящик пока :)
Я не знаю, как было в РК, но скорее всего развертка имела более-менее те же параметры, что и в Векторе и во всех остальных компах той эпохи: чуть-чуть быстрее, чем 50 полей в секунду за счет того, что два раза по 312 строк вместо чередующихся половинок 312/313.
Если твой монитор Векторовскую картинку показывает, значит он достаточно вынослив, чтобы показать любое Радио.
Про развертку PAL:
http://www.retroleum.co.uk/electronics-articles/pal-tv-timing-and-voltages/
Про VGA:
http://www.epanorama.net/documents/pc/vga_timing.html
http://www.epanorama.net/faq/vga2rgb/calc.html
Santechnik, и правда. Посмотрел схему, почитал Шахнова. Инверсии в Радио-86РК нет. Сигнал LTEN тоже защёлкивается в триггере одновременно с данными (в результате чего они просто не выдаются). В Шахнове сказано, что курсор-подчёркивание формируется сигналом LTEN, а курсор-блок - инверсией (у меня в эмуляторе неправильно). Значит в минимальном варианте курсор-блок не нужен.
Значит в минимальном варианте курсор-блок не нужен.
В минимальном может быть и нет, но иметь цельноработающий ВГ75 было бы очень круто.
Я тоже считаю, что нужно реализовать полноценные контроллеры DMA и CRT, а там уж - кто как захочет их использовать.
Все так, но воротить нос от 86РК с частично-реализованным ВГ75 я не стану. Микросхемы сложные и не стоит на них зацикливаться.
Как показывает жизнь, нужно делать минимальную конфигурацию машины.
Когда она заработает - уже становится принципиально интересно "наворачивать" её.
Сразу ориентироваться на "полный фарш" - проект никогда не закончишь.
just for info.
посмотрел исходники своего старого эмулятора (который yark, RK и клоны)
End Str
End Sсr
End Str, DMA Stop
End Screen, DMA stop
это точно использовалось в софте ...
Santechnik
29.05.2010, 08:16
ewgeny7 дело говорит - я могу сейчас с этим монстром зависнуть, а проект основной стоять будет. А потом, если что не так, так еще в нем и копаться придется. Так что пока делаю базовые функции из Монитора, но с расчетом доведения до ума в дальнейшем.
Про развертку PAL:
Про VGA:
Угу. Спасибо. С PALом то все понятно было, а вот с VGA очень познавательно. И калькулятор удобный. Попробую VGA сделать через дабблер. Посмотрим, что получится.
just for info.
посмотрел исходники своего старого эмулятора (который yark, RK и клоны)
End Str
End Sсr
End Str, DMA Stop
End Screen, DMA stop
это точно использовалось в софте ...
Угу. Ясно. А как это работало? Как в деталях отличалось, например End Str от End Str - DMA Stop?
Если твой монитор Векторовскую картинку показывает, значит он достаточно вынослив, чтобы показать любое Радио.
А я его еще не запускал :v2_blush: У меня PS2 клавы пока нет :)
А как это работало? Как в деталях отличалось, например End Str от End Str - DMA Stop?
Ну "End Str" - это просто гашение изображения до конца строки, а символы/атрибуты для знакомест всё равно считываются в буфер через DMA как обычно. Соответственно "End Str - DMA Stop" прекращает считывание для текущей строки. Последнее весьма полезно, если используются "невидимые" атрибуты, т.е. когда в команде инициализации задано, что атрибуты не занимают знакоместа. В этом случае ширина строки (количество символов в строке на экране) зависит от количества атрибутов в строке, а в памяти она фиксирована, и если не остановить запросы к DMA, то в каждом кадре получится смещение данных по горизонтали, из-за чего получается характерный горизонтальный скроллинг.
А я его еще не запускал :v2_blush: У меня PS2 клавы пока нет :)
Картинку видно и без клавиатуры. Его просто запускать: не надо никаких флешей подготавливать, просто .sof залил и все.
sergey2b
29.05.2010, 20:13
извините за некоторый offtop
подскажите пожалуйста где можной найти лекарство для Quartus II 9.1
подскажите пожалуйста где можной найти лекарство для Quartus II 9.1
Скачай 9.1 WEB EDITION и не забивай голову лекарствами :) Она бесплатна.
sergey2b
29.05.2010, 22:53
хочу поставить на PC с win x64, WEB EDITION ее вроде не поддерживает
sergey2b, а зачем он может быть нужен полный, кроме как для инкрементальной компиляции? Остальное для большинства наших целей вполне умеет Web edition.
WEB EDITION ее вроде не поддерживает
Он не использует преимущества х64, равно как и преимущества несколькоядерных процессоров. Но это не мешает ему работать с ними. Ставь.
sergey2b
30.05.2010, 00:06
Он не использует преимущества х64, равно как и преимущества несколькоядерных процессоров. Но это не мешает ему работать с ними. Ставь.
спасибо, это то что меня смущало
Santechnik
30.05.2010, 05:05
Картинку видно и без клавиатуры. Его просто запускать: не надо никаких флешей подготавливать, просто .sof залил и все.
Да просто хотелось и кнопочки понажимать :)
В общем залил. Моник Samsung не стал показывать. После переключения S8 и S9 в 1, картинка появилась, но пропорции ИМХО все же нарушены - дискета в углу не квадратная. Несильно, но заметно. Монитор видимо не кошерный, т.к. сжать/растянуть не позволил существенно :)
Обнаружил на LCD телеке в гостиной VGA разъем и подключился туда (пока жена не видела :biggrin:). Заработал только режим S8 и S9 в 1. Картинка оказалась смещена почти на полэкрана вправо, но настройками телека удалось ее вернуть на место и даже почти выправить пропорции. Картинка Вектора во все 42" потрясла :v2_laugh: Предвкушаю увидеть Радио на 42" :v2_lol:
Вывод - буду делать VGA. Получается очень неплохо. Незначительное нарушение пропорций компенсируется четкостью и удобством.
Из GettingStarted на вики от Вектора-06цц:
Вкратце, понимая тяжесть прочения README.txt и коментариев в vector06cc.v, сообщаю, что переключатели SW8 и SW9 должны быть в верхнем положении "1", остальные лучше перевести в положение "0".
:biggrin:
На самом деле это устарело, потому что появился ускоренный режим. Хорошо, что ты не читал ридми, я б и не вспомнил -- поправлю руководства и комменты.
Вообще у канонической Юности, или чего там еще, к чему подключали такие компьютеры, пропорции настраивались крутилочкой сзади на вкус пользователя и фиксированых отношений не имели. Для аутентичности надо наоборот добавлять генератор плывущих недогашенных лучей, имитатор потери КСИ, сброс холодильником и проч.
Santechnik
01.06.2010, 15:42
А как BURST работает? Там 2 параметра - "Число тактов между DMA запросами" (S) и "Число DMA циклов за BURST" (B). Я правильно понял, что он делает B запросов подряд, а потом S тактов ждет следующую серию?
Вообще контроллер навороченный. Про между прочим не возьмешь. Я пока только конфигуратор доделал (еще не проверял). Еще буфера, DMA и всякая мелочь остались. Плюс testbench. Да и с отладкой чую повозиться придется :v2_blink:
Я уже начинаю задумываться для ускорения процесса внешнюю ВГ75 прилепить :rolleyes:
Сопрягать FPGA-шный дизайн с олдовыми чипами -- тоже не факт, что получится просто. А это твой первый проект, или у тебя большой опыт? Начинать с ВГ75 -- это по-моему очень жестко.
A какой вообще смысл эмулировать реальную ВГ75 и DMA ?
Ваша главная задача чтоб попали соответсвующие байты памяти в соответсвующее знакоместо на экране.
На сколько помню,они работают в спарке, в контроллер DMA загоняется интервал области памяти ,адрес,длина, период передачи, а в ВГ75 непосредственно данные изображения количество строк, столбцов, межстрочные интервалы, курсор и т.д. знакогенератор там фиксированный на РФ2, вот они вместе и пашут, DMA выдает пачками данные а ВГ75 отображает сообразно знакогенератору и настройкам. Т.е. адрес экранной области и её длина не фиксированы.
A какой вообще смысл эмулировать реальную ВГ75 и DMA ?
Ваша главная задача чтоб попали соответсвующие байты памяти в соответсвующее знакоместо на экране.
Если бы формат отображения был фиксированым, это было бы так. Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.
знакогенератор там фиксированный на РФ2
Если быть точным, изначально там была РФ1. В РФ2 для стандартного знакогенератора задействовалась одна половина, а в другую можно было зашить другой, ориентированный на конкретную программу. Если не изменяет память, одна из программ, использующих свой знакогенератор, - редактор печатных плат.
Если бы формат отображения был фиксированым, это было бы так. Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.
например?
и Вы думаете что у вас эти "эффекты" не превратятся в деффекты?
Santechnik
02.06.2010, 02:23
Сопрягать FPGA-шный дизайн с олдовыми чипами -- тоже не факт, что получится просто. А это твой первый проект, или у тебя большой опыт? Начинать с ВГ75 -- это по-моему очень жестко.
Да, конечно, сопрягать тоже не просто. И тайминги, и напруга... Но по-любому продолжаем. Но если до конца июля не успею, то придется сделать паузу до ноября.
А опыта с ПЛИС нет. Из практических вещей - только все задачи с диска от DE1. :v2_blush:
Я вообще бухгалтером работаю. :v2_rolley Просто хобби у меня было лет 20 назад. Ну а сейчас захотелось это хобби восстановить. А тут новые технологии. Паять просто уже не так интересно. С микроконтроллерами разобрался. Таймер с допфункциями придумал, прошу на ассемблере написал и собрал. Теперь до ПЛИС дошел. Я там в начале писал - одна из целей проекта ознакомление с новыми технологиями. Но проект я настроен завершить решительно. :v2_smoke:
Ну прокопаюсь я с этим контроллером пусть в 5 или 10 раз дольше чем профи. Но ведь в кайф! Это же хобби - главное процесс. Ничего неразрешимого там не вижу. Но зато какой опыт!
Можно сначала сделать простой видеоконтроллер: один текстовый режим, такой как в рк86 по умолчанию, и без DMA. На нем руку набить, да и для отладки системы он потом будет полезен.
Santechnik
02.06.2010, 14:44
А у меня этот монстр движется нормально. Уже схема на все составлена. Блок программирования параметров готов, DMA готов, FIFO готов. Сейчас буфер пишу и контроллер к нему (сделано около 10%). Останется счетчики (большинство уже тоже сделано) и сигналы развертки сделать.
А потом со всем этим попробуем взлететь :biggrin:
... Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.
Для этого нужно было сам "монитор"исправить. В стандартном варианте ВГ75 запрограммировать на артибуты было нельзя,т.к. все данные от 80h,до 0FFh на ВГ75 не проходили.
Кстати К580ВГ75 отлично работает в режиме VGA с частотами 72гц на 32Кгц.(это его стандартный режим VGA).
Santechnik
03.06.2010, 00:05
А на сколько распространены были такие исправления Монитора?
Santechnik, на самом деле мониторов было мульен.
Конечно есть "классический" по журнальной схеме 32к, но дальше...
Был вариант "если нет ВГ75", с разными модифицированными коммандами, 16к версия, версия под МС7007 и т.д. и т.п.
Был даже "РК86" для "Микроши".
Santechnik
03.06.2010, 01:35
Во-о-о-т. А Вы спрашиваете почему надо ВГ75 симулировать. ;) Надо чтобы универсально было. Да и дальше может быть Микроша или Апогей будет.
svofski, А не подскажешь, пожалуйста: в 8080 для ПЛИС, который ты использовал в Векторе, 2 входа CLK: CLK и CLKEN. Я правильно разобрался, что CLK соответствует Ф2, а CLKEN - Ф1 оригинала?
Во-о-о-т. А Вы спрашиваете почему надо ВГ75 симулировать. ;) Надо чтобы универсально было. Да и дальше может быть Микроша или Апогей будет.
Наша основная задача - чтоб работали программы выводящие данные непоследственно в видео память (это - 99% игрушек) и все, никаких эмулей ВГ75 не надо. Надо только четкое попадание по знакоместам.
Santechnik, нет, что ты! Читай срочно, пока не наломал дров:
http://www.actel.com/documents/Com_RH_AN.pdf
http://www.alteraforum.com/forum/showthread.php?t=2388
Вот как этот принцип выглядит в Векторе:
http://code.google.com/p/vector06cc/wiki/ImplementationNotes#Clock_Distribution
Вот здесь рождаются все clock enables:
http://code.google.com/p/vector06cc/source/browse/trunk/src/clockster.v
CLKEN в T80 -- это clock enable, который позволяет использовать его в любом синхронном дизайне. Там есть асинхронная обертка, которая предназначена для использования софтового t80 в качестве замены реального проца в компьютерах, например. Но внутри полностью FPGA-шного дизайна так делать не надо.
Santechnik
03.06.2010, 14:30
Ну чего сразу пугать-то так :biggrin: Я за таймингами стараюсь следить. Благо скорости черепашьи. Но за статьи спасибо! Весьма познавательно.
Надо мне все же твой Вектор и сам проц поковырять получше. А зачем тогда вообще Ф1 у железного проца была?
Таки ведь не в скоростях дело. В FPGA ты практически не можешь контролировать пути распространения сигналов и гонки возникают произвольным образом. Глич и есть глич, не принципиально как он возникает -- один, или 10 миллионов раз в секунду.
Ф1 у железного проца наверное была для решения каких-то схемотехнических проблем. Допустим по Ф0 выставляется микрокоманда datapath-у, по Ф1 datapath пропихивает данные. Чем больше фаз и чем больше фронтов используется, тем больше всего можно сделать за один такт.
Для этого нужно было сам "монитор"исправить. В стандартном варианте ВГ75 запрограммировать на артибуты было нельзя,т.к. все данные от 80h,до 0FFh на ВГ75 не проходили.
Что-то вы путаете. Перепрограммировать любой контроллер можно в любой момент. Причём здесь монитор? Другое дело, что возможна потеря совместимости со стандартными подпрограммами монитора, но в таком случае их функции берет на себя программа, перепрограммирующая контроллер.
Перепрограммировать любой контроллер можно в любой момент. Причём здесь монитор? Другое дело, что возможна потеря совместимости со стандартными подпрограммами монитора, но в таком случае их функции берет на себя программа, перепрограммирующая контроллер.
Да, вместо того, что бы в мониторе изменить всего один байт, нужно писать процедуры перепрограммирования контроллера ВГ75, и замену стандартных подпрограмм монитора...тоже вариант.
Да, вместо того, что бы в мониторе изменить всего один байт, нужно писать процедуры перепрограммирования контроллера ВГ75, и замену стандартных подпрограмм монитора...тоже вариант.
Думаю, эта защита от ошибочного перепрограммирования ВГ75 в результате передачи на отображение байта более 7F не просто так сделана. И какие там особые процедуры писать надо? Это же не перевод в защищенный режим PC. Разницы в объёме кода при программировании через F809 (допустим такую возможность) и через непосредственную запись портов практически никакой, зато имеем существенный выигрыш в скорости из-за тормознутости F809. А стандартные подпрограммы могут потерять совместимость независимо от способа перепрограммирования.
Да и вроде бы изначально заявлялось о принципиальной невозможности программирования ВГ75 без правки монитора.
Santechnik
13.06.2010, 04:46
Итак, проект движется. Контроллер ВГ75 был мной разбит на 2 части - DMA + внешнее управление и вывод символов и синхры. Первый блок готов и в тестовой среде работает в соответствии с datasheet. Второй блок тоже написан, но отладить я его не успел, т.к. в процессе отладки стала появляться такая внутренняя ошибка Quartus:
Internal Error: Sub-system: ASMCC, File: /quartus/comp/asmcc/asmcc_bitfield.cpp, Line: 855
Assembler bitfield error: Found conflicting assignments for CRAM address; address = 1835112
Quartus II Version 9.1 Build 350 03/24/2010 SJ Web Edition
Service Pack Installed: 2
Что это может быть?
Santechnik
19.06.2010, 10:22
Ладно. С той ошибкой разобрался переписав половину кода :mad:
Теперь такой вопрос к уважаемым знатокам Verilog.
Делаю увеличение частоты строчной развертки вдвое, как советовали, чтобы выводить на VGA.
Я его уже переписал раз 5 разными способами - почти одно и тоже :v2_crazy: Вот кусок кода с одним из способов, который не работает.
input SVRTC;
input SHRTC; // "Родной" сигнал гор. развертки
input clk;
output VRTC_out;
output HRTC_out; // Выходной сигнал
output [8:0] hr_cnt; // Счетчик тактов (выход сделан просто для контроля пока)
reg [8:0] vr_cnt;
reg [8:0] hr_cnt;
reg HRTC_out;
........................................(ВЫРЕ АННЫЙ ОСТАЛЬНОЙ КОД)
always @(negedge clk or negedge SHRTC)
begin
if (SHRTC == 'b0)
begin
if (hr_cnt == 'd272) {hr_cnt, HRTC_out} <= {1'b0, 1'b0};
else hr_cnt <= hr_cnt + 1;
end
else if (hr_cnt != 'd272) hr_cnt <= hr_cnt + 1;
case (hr_cnt)
'd15: HRTC_out <= 'b1;
'd255: HRTC_out <= 'b0;
'd271: {HRTC_out, temp1} <= {1'b1, 1'b0};
endcase
if (hr_cnt[0] === 1'bx) {hr_cnt, HRTC_out} <= {9'b100010000, 1'b0};
end
endmodule
Этот процесс должен при negedge "родного" сигнала сделать выходной low и включить счетчик по которому сформировать еще и второй импульс в нужное время и далее ждать следующего negedge "родного" сигнала.
Дак что ни делаю, на выходе только ХХХХХХ по всем сигналам. :mad: (см. вложение) Ведь наверняка какая-то глупая ошибка!
Вот очередной вариант сделал - тоже не пашет:
assign HRTC_out = (hr_cnt < 'd16) | ((hr_cnt > 'd254) & (hr_cnt < 'd272)) ? 1'b0 : 1'b1;
always @(negedge clk or negedge SHRTC)
begin
if (SHRTC == 'b0)
begin
if (hr_cnt != 9'b111111111) hr_cnt <= hr_cnt + 1;
else hr_cnt <= 9'b000000000;
end
else if (hr_cnt != 9'b111111111) hr_cnt <= hr_cnt + 1;
end
endmodule
Я не специалист, но по-моему "always @(negedge clk or negedge SHRTC)" это неправильно. Попробуй разделить на две части, одна из которых будет привязана к negedge clk, а вторая - к negedge SHRTC.
Santechnik
19.06.2010, 13:12
Да вроде работает и так в других процессах. Вот, например, вертикальная развертка:
assign VRTC_out = (vr_cnt == 0) | ~(SVRTC);
always @(negedge SVRTC or negedge clk) // Vertical sync control
begin
if (SVRTC == 'b0) vr_cnt <= 'b111111111;
else if (vr_cnt > 'b0)
begin
if ((vr_cnt != 'b1) || (SHRTC == 'b0)) vr_cnt <= vr_cnt - 1;
else;
end
else;
end
Но, за совет спасибо! Попробую прямо сейчас!
Заработало!!! :v2_yahoo: Спасибо! Вот что значит свежий взгляд!
Я не специалист, но по-моему "always @(negedge clk or negedge SHRTC)" это неправильно. Попробуй разделить на две части, одна из которых будет привязана к negedge clk, а вторая - к negedge SHRTC.
Формально в этом нету особой неправильности. Но на практике все такие конструкции имеют такой вид:
reg [3:0] rrr;
always @(posedge xxx or posedge yyy)
if (yyy)
rrr <= 0;
else
rrr <= rrr + 1;
Если посмотреть на RTL схему от этой конструкции, то можно увидеть, что yyy подается на вход асинхронного сброса (или асинхронной установки) счетчика, а xxx -- на тактирующий вход. Какой фронт используется у обоих сигналов, значения не имеет.
В коде вертикальной развертки все просто -- одна из половинок делает асинхронную установку. А в горизонтальной написано так, что на оба фронта загружается не константа, выходит, что это не регистр с асинхронным сбросом, а что-то типа двухпортовой ячейки, или я даже не знаю что это. Наверное, Квартус тоже не понял.
Если посмотреть на RTL схему от этой конструкции, то можно увидеть, что yyy подается на вход асинхронного сброса (или асинхронной установки) счетчика, а xxx -- на тактирующий вход. Какой фронт используется у обоих сигналов, значения не имеет.
После таких преобразований - конечно.
Наверное, Квартус тоже не понял.
Интересно, как выглядит RTL схема того, которое неработает.
Кстати, это прямо в квартусе RTL схема показывается? Я особо не копался, не подскажешь - как?
Кстати, это прямо в квартусе RTL схема показывается? Я особо не копался, не подскажешь - как?
Когда уже все собралось, в Project Navigator-е смотри в закладку Hierarchy. Там в контекстном меню интересующего тебя модуля можно вызывать "Locate in RTL Viewer" и оно покажет.
Santechnik
19.06.2010, 16:35
Интересно, что я там в первый раз пытался квартусу всучить, что он так ругался "Internal Error"? :v2_blush: Кстати, до того как заработало, конструкция занимала около 60 элементов. Сейчас 30 :v2_rolley
Я думал, что неважно, что напишу, квартус разрулит это как-нибудь. Спасибо за разъяснения! Может мне книжку какую посоветуешь почитать для восполнения пробелов? А то вот так и тыкаюсь как слепой котенок иногда на таких вещах.
К сожалению не знаю подходящих книжек. Так получилось, что все из интернетов. И да здравствует опенсорс.
Клифф Каммингс написал много интересных статей про Верилог. Полторы из них я даже наполовину осилил когда-то. Мне нравится, что он часто подходит к проблеме со стороны инженера-самоучки, который в принципе многое уже умеет, но не знает почему так получается.
http://www.sunburst-design.com/papers/
Набросал свою версию Радио-86РК. Качать, как всегда, на моём сайте в разделе ПЛИС (http://bashkiria-2m.narod.ru/fpga.html). Работает почти всё, загружать программы можно через магнитофон, хотя лично я просто соеденил выход звуковой карты со входом DE1 и "жужжал" из своего эмулятора :)
Есть отличие от стандартного РК - я реализовал инверсию, чтобы проверить работу курсора-блока.
Santechnik
18.07.2011, 12:00
Супер! Попробую сегодня. А "почти все работает" что означает? Что не работает? Как реализовал ВГ75?
А "почти все работает" что означает?
Почти всё работает - означает, что реализованы все БИС, в том числе ВТ57 и ВГ75.
Что не работает?
Мелочи всякие, которые в основном не используются: сдвиг приоритетов каналов ПДП, атрибуты LA0,LA1, ну и т.п.
Как реализовал ВГ75?
По аналогии с тем, что у меня в эмуляторе :) Ну и конечно, сверялся по Шахнову. Нельзя сказать, что реализовано в точности как в железе, но основные функции оно выполняет. В частности, кадровые и строчные СИ я использовал внешние, от генератора развёртки 800х600@50Гц. Шину данных разделил на три части (ввод,вывод и вход символа от ПДП), управляющие сигналы тоже (чтобы не городить мультиплексоров). Шину адреса ВТ57 сделал без заморочек со старшим байтом в регистре - просто 16 бит. Вобщем, разница не принципиальная, в основном адаптация для ПЛИС.
Santechnik
18.07.2011, 16:41
Впечатляет! :v2_thumb: Есть в планах доделывать эти мелочи? Будешь ли выкладывать сорцы?
Основная часть была скопирована из сырцов Башкирии-2М. Я добавил лишь ВТ57 и ВГ75, их я как-нибудь потом выложу, когда посчитаю, что больше сам ничего менять не буду. :)
Добавил поддержку SD-карты, команда монитора U (которая обычно просто делает переход на 0F000h). Работают команды DIR, CD и запуск .rk(.rkr) файлов. FAT32 не поддерживается.
Исправил ошибки:
- неправильно формировался флаг доп. переноса
- в режиме макс. скорости иногда не работал вывод в порты ВГ75,ВТ57
- DIR *.RK не выдавал файлы с длинной имени 8 знаков
Решил всё-таки выложить недоделанные исходники, т.к. последние три месяца вообще ничего не делал, если не считать, что вчера добавил информацию об авторстве в исходники. Убедительная просьба, не удалять её оттуда. :)
Я потом хочу попробовать засунуть ВТ57 и ВГ75 в AVR. Будет компьютер из четырех микросхем: Задающий генератор, процессор, статическая память и AVR.
Я потом хочу попробовать засунуть ВТ57 и ВГ75 в AVR. Будет компьютер из четырех микросхем: Задающий генератор, процессор, статическая память и AVR.
Хорошая затея!
Правда, я бы распределил функции AVRов так: Видео генератор (ВТ57 и ВГ75), Процессор (ВМ80+ПЗУ+мелочевка), Статическое ОЗУ 32кб, Ввод/вывод (ППА ВВ55 D14 и D20). Возможно Вы, vinxru, это и имели ввиду?
Да, есть еще, на мой взгляд, проблема: пиксель клок в РК 8МГц. Сможет ли ATMega работающая пусть даже на 20МГц выдать нам на каком нибудь порту такой пиксель клок? 20/8=2.5 Получается нужно выдавать каждые 2 с половиной такта.
Я бы наверное использовал оригинальный процессор 580ВМ80. Если бы не 3 питания, я бы даже не думал в сторону эмуляции 8080 на ATMega.
А по поводу 8 Мгц, народ придумал использовать SPI. Я сам не разбирался, но вроде бы принцип такой. В порт в частотой 1 Мгц записывается сразу 8 бит, и эти биты с битрейтом 8 МГц последовательно выходят с ножки MISO.
Но кроме формирования видеосигнала, МК должен успевать реагировать на команды процессора (запись и чтение значений из адресного пространства устройств). Этот же МК будет загружать в ОЗУ код монитора, хотя можно и ПЗУ разместить. Микросхемы ОЗУ и ПЗУ очень просто соединять проводниками. Всмысле все дорожки между ними будут параллельны.
Если так, то надо стараться засунуть РК в один AVR.
Например, как здесь http://pmd85.topindex.sk/
В этом случае меньше согласований между микросхемами нужно делать
Если так, то надо стараться засунуть РК в один AVR.
Например, как здесь http://pmd85.topindex.sk/
В этом случае меньше согласований между микросхемами нужно делать
Тогда это будет обычный программный эмулятор компьютера РК86, только написанный для AVR.
b2m, в сорцах твоей реализации РК на DE1 лежит SDRAM_Controller.v, но он, насколько я понял, не используется. Файлик случайно туда попал или у тебя есть версия РК использующая SDRAM?
Файлик попал случайно, но версия, использующая SDRAM была (временно), и вроде даже работала без сбоев.
версия, использующая SDRAM была (временно)
Её не осталось? Если вдруг осталась, может выложишь?
Не, не осталось, я прямо в рабочем проекте попробовал, потом убрал. Слишком уж простой контроллер, на чтение/запись уходит много тактов. Для РК не критично, он всё равно 1 такт работает, 24 простаивает. А для реального применения - малопригодно.
ivagor, у меня в амижном проекте SDRAM контроллер вполне работающий
https://code.google.com/p/z3sdram/source/browse/sdram_controller.v
Выглядит страшновато, но на самом деле он хороший :)
tnt23, спасибо, но для меня это слишком страшновато. b2mу спасибо за случайно забытый контроллер, он у меня даже почти заработал.
случайно забытый контроллер, он у меня даже почти заработал.
Очень интересно. Расскажешь подробнее? :)
Несколько стыдно рассказывать, но я попробую. На данный момент затыка в доступе к SDRAMине по чтению проца и видео.
Если процу не давать читать
.rd(vid_rd),
то изображение нормальное.
Если ему дать читать
.rd(vid_rd ? 1'b1 : cpu_rd&(!addrbus[15])),
то изображение скачет. Тем не менее, можно разобрать, что на директивы монитора реагирует. Например заполнил область значением, потом вывел дамп - все работает как должно.
Ты мой проект что-ли копаешь? Я думал что-то своё мастыришь.
А я, кстати, только первые 16Кб на SDRAM подменял, т.к. в процессе отладки хотелось, что-бы РК-шка работала, а там уже в мониторе смотреть, как SDRAM выглядит. Поэтому у меня таких проблем не было.
Тут надо синхронизацию переделывать, а то процессор 1 раз в примерно 25 тактов обращается, а видео - ровно 1 раз в 24 такта. И эти обращения никак не синхронизированы. Надо скорректировать запросы путём задержки, пока они не попадут в своё "окно". Точнее, достаточно cpu_ce задерживать, если было обращение от видео.
Если еще буду копать, то оставлю нижние 16 Кб в SDRAM, а верхние надо затолкать в ПЛИС, у меня уже сегодня такая мысль появлялась. А до этого думал РК до 16 Кб урезать и все ОЗУ в ПЛИСине.
оставлю нижние 16 Кб в SDRAM, а верхние надо затолкать в ПЛИС
Так и сделал, вроде работает (директивами монитора пишет и читает, ксоникс немного погонял). Пользуясь случаем, хочу передать большой фак уроду из терасик, который решил ставить на новые DE1 уродские SRAM IS61WV25616EDBLL
---------- Post added at 01:12 ---------- Previous post was at 00:29 ----------
Вопрос про spiton.gam (идет в комплекте с emu) - в emu он показывает заставку, а на DE1 - нет. Это я что-то поломал или так и было? Сама игрушка работает, контрольная сумма при чтении совпала.
---------- Post added at 01:25 ---------- Previous post was at 01:12 ----------
С питоном разобрался. Не знал, что на РК были игрушки, которые меняли адрес экранной области.
Пользуясь случаем, хочу передать
Не стреляйте в пианиста, он играет как умеет. :)
Просто времянки надо в проекте учитывать. Ты бы лучше попытался разобраться, как заставить работать SRAM. Времени-то там дофига, процессору вообще по барабану, что память чуть медленнее, он всё равно за 3 цикла (по 25 тактов) читает/пишет. А вот в ВТ57 можно попытаться добавить ещё 1-2 состояния, чтобы запрос на чтение на 1-2 такта дольше был.
Ты бы лучше попытался разобраться, как заставить работать SRAM.
Лучше, но сложнее.
---------- Post added at 10:00 ---------- Previous post was at 09:28 ----------
Экспресс-тест по допустимой частоте cpu_ce в текущем состоянии. Только я немного переделал
reg cpu_ce2;
wire cpu_ce = cpu_ce2;
always @(posedge clk50mhz) begin
//internal ram (cpu and video) works fine with cpu_cnt!=3
//sdram (cpu) works fine with cpu_cnt!=9
if(cpu_cnt!=9) begin cpu_cnt <= cpu_cnt + 11'd1; cpu_ce2<=0; end
else begin cpu_cnt<=0; cpu_ce2<=1; end
startup <= reset|(startup&~addrbus[15]);
end
"Тестировал" в мониторе, заполняя соответственно 4000,40FF и 0,FF значениями 00,55,AA,FF и потом смотрел дамп.
---------- Post added at 11:43 ---------- Previous post was at 10:00 ----------
Вроде и SRAM нормально заработал, по крайней мере монитором, ксониксом и супер питоном проверку проходит. Взял все тот же контроллер SDRAM (очень вдохновляющий пример, b2m - еще раз спасибо) и сократил до двух состояний (читал про такое на форуме минимига, но не мог нормально сделать)
1. первый такт выставляем адрес и управляющие сигналы
2. второй такт - еще и читаем или пишем.
Только это вариант с раздельным доступом, переделанный из SDRAM, т.е. SRAM по адресам 0-3FFF и обращается к ней только проц.
Надо бы еще наверно что-то вроде теста ОЗУ наваять, но очень похоже, что все работает.
Только это вариант с раздельным доступом, переделанный из SDRAM, т.е. SRAM по адресам 0-3FFF и обращается к ней только проц.
Надо бы еще наверно что-то вроде теста ОЗУ наваять, но очень похоже, что все работает.
А если взять мой проект, и просто перенести 4000-7FFF внутрь ПЛИС, то ведь тоже должно работать? Тогда ведь к SRAM будет только процессор обращаться, а он делает это достаточно долго.
Я вот думаю, если HOLD/HLDA номально реализовать, в том числе и в процессоре, то должно работать даже с памятью, которая хоть в 10 раз медленнее. Т.е. проблема не в железе, а в исходниках проекта. Другое дело, что мой проект не единственный, который рассчитывает на быструю SRAM. Ты пробовал запускать Вектор,БК,Корвет,MSX?
А если взять мой проект, и просто перенести 4000-7FFF внутрь ПЛИС, то ведь тоже должно работать?
Я так и сделал :) Как раз это позволило мне спокойно организовать работу с SDRAM а потом со SRAM по адресам 0000-3FFF. Меня только одно смущает - неужели я так невнятно пишу, что даже ты не понял :)
Другое дело, что мой проект не единственный, который рассчитывает на быструю SRAM. Ты пробовал запускать Вектор,БК,Корвет,MSX?
Твой проект как раз в том ряду, который полагается на простой доступ к SRAM и не работает на новых DE1 с той самой "новой" SRAM (формальные отличия во времянках небольшие, сам я думаю, что основная проблема в том, что она с ECC). Проблемы с этой сраминой не только у меня, читал про это и на буржуинских форумах. Не работают вектор (я долго доставал svofski на эту тему), БК, спектрум, Б2М. Вернее степень неработоспособности разная - что-то вобще не работает, что-то частично работает. MSX завелся с полоборота, т.к. использует SDRAM.
Т.е. РК - это второй ретрокомп, который у меня заработал (но только после доработки напильником).
Я вот думаю, если HOLD/HLDA номально реализовать, в том числе и в процессоре, то должно работать даже с памятью, которая хоть в 10 раз медленнее.
Про это я ничего сейчас не могу сказать. Четкий доступ к моей SRAMине, как я уже написал, получился после разделения обращения на 2 этапа - в первом такте выставляем адрес и управляющие сигналы, во втором читаем или пишем. Т.е. проблема, конечно, не в скорости, а в том, что нужно все делать аккуратно.
неужели я так невнятно пишу, что даже ты не понял
Я имел ввиду: не трогать ту часть, которая работает с SRAM (ты, как я понял, дополнительный контроллер для SRAM сделал). Только добавить новое устройство по адресам 4000-7FFF вместо SRAM.
Четкий доступ к моей SRAMине, как я уже написал, получился после разделения обращения на 2 этапа - в первом такте выставляем адрес и управляющие сигналы, во втором читаем или пишем.
Чтение по-любому обычно так и делается. А вот при записи надо бы откладывать сигнал активации записи на второй такт и снимать его в третьем, т.к. SRAM тут асинхронный, и если сигнал записи прийдёт раньше чем изменится шина адреса, то запись произойдёт не туда, куда надо.
Другой вариант: попробуй ничего не менять, кроме одного - простробировать сигнал записи глобальным клоком:
assign SRAM_WE_N = vid_rd|cpu_wr_n|addrbus[15]|hlda|clk50mhz;
SRAM_WE_N будет полклока в длинну (надеюсь его хватит), и будет активироваться через полклока после того, как всё остальное начнёт меняться.
Я имел ввиду: не трогать ту часть, которая работает с SRAM (ты, как я понял, дополнительный контроллер для SRAM сделал). Только добавить новое устройство по адресам 4000-7FFF вместо SRAM.
А, так я тоже делал. Оно частично работает, но все равно сбоит.
Чтение по-любому обычно так и делается.
Так почему же практически везде не так? Читал, что в последних версиях минимига так стало, а еще где?
А вот при записи надо бы откладывать сигнал активации записи на второй такт и снимать его в третьем,
Сначала я сделал доступ к SRAM в три такта
1. выставляем адрес, WE_N и OE_N =1
2. и 3. как уже написал выше.
Так заработало, но раз заработало и с двумя (без п.1.), я пока с двумя и оставлю. Может при 100 МГц или более пришлось бы в 3 такта.
Другой вариант: попробуй ничего не менять, кроме одного - простробировать сигнал записи глобальным клоком:
К сожалению это не сработало, как и много других "простых" вариантов, которые я пробовал с v06cc и rk
---------- Post added at 21:14 ---------- Previous post was at 20:53 ----------
не трогать ту часть, которая работает с SRAM
Кстати, еще могу немного сказать на эту тему. В v06cc отключал видео, оставляя доступ только проца - не заработало. Контролировал по наличию звука и миганию светодиода (полученные с использованием неодобренного svofski вудуизма почти рабочие версии v06cc кое-что могут запускать и с видео и со звуком).
будет ли версия полностью на SDRAM
В смысле и без ОЗУ внутри ПЛИС? Наверняка будет, только пока непонятно, кто ее первым сделает :) Сегодня я без DE1, надумал многаидей, завтра может хоть что-то заработает. Правда у меня SDRAM сейчас не на первом месте.
По поводу исходников - в соответствии с моими нулевыми знаниями и мои вставки в исходники b2m или очевидные или непотребные. Тем не менее, если неожиданно "полный SDRAM" заработает, то я, наверно, ключевой фрагмент прямо сюда запощу, или ссылку на него.
В смысле совсем без SRAM, как бы ее и нет совсем!) а уж будет ли часть внутри плис или нет - это второй вопрос.
Тогда такой вариант уже есть, но при модификации исходника b2m мозг я практически не использовал:
1. С помощью визарда создал блок двухпортового ОЗУ в ПЛИСине. Прописал обращение в головном файле по адресам 4000-7FFF. Один порт - читает видеоконтроллер, второй - читает и пишет проц. Уже можно запустить и проверить работу директив монитора.
2. Прописал обращение к контроллеру SDRAM, забытому b2mом, по адресам 0000-3FFF. Доступ имеет только проц. Это несколько уменьшает совместимость, т.к. есть программы, которые меняют адрес ВидеоОЗУ в первую половину. Но вроде их мало.
Про "полный SDRAM" напишу, если получится. Если b2m или кто-то еще сделает раньше - с интересом посмотрю.
Если b2m не против (лицензию не читал, каюсь), то я завтра могу прислать измененный главный файл исходника и .sof.
DE1 глЮчит
Маркировка SRAM случайно не
IS61WV25616EDBLL
?
Маркировка SRAM случайно не
Там ещё важно, что после минуса стоит. Это, судя по даташиту, время доступа в наносекундах. Есть -8,-10,-20.
но у тебя наверно 61LV25616AL
Случайно не, но почти такая же - IS61WV25616BLL-10TL, ну т.е. без ED в середине.
вряд ли она отличается сильно.
Не поленился, взял лупу и посмотрел ещё раз: у меня точно такая-же!
Случайно не, но почти такая же - IS61WV25616BLL-10TL, ну т.е. без ED в середине.
вряд ли она отличается сильно.
Принципиальное отличие ED - она с ECC. Продолжаю пропагандировать идею, что причина неработоспособности проектов, использующих "простой" (неаккуратный) доступ к SRAM именно в этом.
буду ждать
Выслал.
"простой" (неаккуратный) доступ к SRAM
Будем искоренять :)
zebest, поздравляю!
Побаловался СпиналТапом, основные моменты стали понятны, но запустить стабильный SDRAM only так и не смог.
Также спиналтап помог увидеть, что доступ к SRAM (в проекте SRAM+internal RAM) у меня реально не 2 такта, а группами по несколько доступов по 2 такта, т.к. сигналы чтения и записи от процессора длинные. Этот странный вариант работает хорошо.
Попытался организовать другой контроллер, который читал или писал бы один раз на каждое обращение проца. По спиналтапу все ОК, а стабильной работы не получается.
Запущено в минимальном варианте, без звука и без SD-карты, в Speccy2010 SD подключена через свой контроллер, для меня это еще сложно, если не сказать невозможно, так что только монитор, программы загрузить не могу, увы и ах.
Про то, что такое использование микроконтроллера существенно усложняет разработку и ограничивает разработчика уже предупреждали. Проблема частично решается с помощью специально разработанной библиотеки процедур для МК под разные задачи со стороны FPGA.
Как я уже писал (а потом стер) - пошел по пути наименьшего сопротивления и переделал SDRAM_Controller.v в SRAM_Controller.v
Убрал рефреш и еще пару состояний, в итоге чтение и запись стали по 4 такта (думаю, это не предел, но пока меньше просто не пробовал).
Теперь работают варианты РК:
1. SRAM [0-3FFF]+internal RAM [4000-7FFF], но он и раньше с моим самопальным "контроллером SRAM" работал.
2. Гораздо более интересный вариант SRAM [0-7FFF]+SDRAM [0-7FFF]. В SRAM пишет процессор, а читает только видео (причем, если надо, и из адресов 0000-3FFF тоже, т.е., например SPITON показывает "картинку" при старте, в отличие от п.1). К SDRAM имеет доступ только процессор. Наверно по такому принципу можно и другие компы под мою хитрую DE1 переделать.
b2m, если не сложно, запусти вот этот тестик (http://zx-pk.ru/showpost.php?p=615016&postcount=177). В покореженных мною вариантах между прогонами гаснет экран, а как в твоем оригинальном варианте? В emu экран не гаснет.
Еще познавательный вопрос, не относящийся к реализации в ПЛИС. xonix, приложенный к эмулятору, показывает 30 строк. Если по 10 точек, то это 300 ТВ линий, не многовато ли? Насколько помню, по стандарту не более 288 активных строк.
b2m, если не сложно, запусти вот этот тестик (http://zx-pk.ru/showpost.php?p=615016&postcount=177).
Пока не смогу, доступа к DE1 нет.
Если по 10 точек, то это 300 ТВ линий, не многовато ли?
Я не помню точно, но вроде бы по стандарту кадровый СИ должен быть не менее 5%, для 312 линий это 15-16. А тут всего 12, но вполне возможно, что нехватка 3-х линий была не страшна и 99% телевизоров нормально синхронизировали кадры.
---------- Post added at 21:21 ---------- Previous post was at 21:17 ----------
Вроде в интернете пишут - для КСИ 2,5 линии достаточно.
---------- Post added at 21:23 ---------- Previous post was at 21:21 ----------
Верхнее и нижнее поле - минимум 25 линий. Их роль выполняют пустые строки.
У меня DE1 подключена к ТВ/монитору с VGAшным входом, так он не показывал все строки, пока в rk_video.v не поменял 625 на 660. Частота кадров, конечно, немного уменьшилась, но все равно для РК это ни на что не влияет.
У меня DE1 подключена к ТВ/монитору с VGAшным входом, так он не показывал все строки
Так и задумано. Слева и справа тоже не все символы показываются.
Может ли быть активен hlda не во время чтения группы символов для видеоконтроллера?
Может ли быть активен hlda не во время чтения группы символов для видеоконтроллера?
Если это вопрос по оригинальной схемотехнике 86РК, то скорее всего - нет. hlda активируется по окончании цикла в ответ на присутствие hold, а тот, в свою очередь, генерируется только контроллером ПДП.
Нет, если конечно настроить ВТ57 на чтение или запись по каналу 0 или 1, то hold активируется, но какой в этом смысл?
---------- Post added at 16:06 ---------- Previous post was at 16:05 ----------
А вот нет, фиг вам, drq для других каналов заземлены.
Вопрос был по реализации РК на ПЛИСе.
Т.е., если я правильно понял, в текущей плисовой реализации hlda активизируется только на время чтения группы символов видеоконтроллером.
b2m, вопросы по твоей реализации ВМ80.
Насколько я понял cpu_rd и cpu_wr_n длятся "от ce до ce".
Чтение происходит по заднему фронту cpu_rd?
При записи в каком такте выставляются данные?
b2m, вопросы по твоей реализации ВМ80.
Насколько я понял cpu_rd и cpu_wr_n длятся "от ce до ce".
Если ce=1, то переходим к следующему такту, иначе просто ждём. Таким образом можно задавать любую частоту процессора при фиксированном системном клоке.
Чтение происходит по заднему фронту cpu_rd?
Да, cpu_rd=1 только во втором такте, в третьем такте оно снимается, одновременно фиксируются входные данные.
При записи в каком такте выставляются данные?
В первом такте выставляется слово состояния, в циклах записи данные выставляются во втором такте и остаются до следующего первого такта. Одновременно с выдачей данных во втором такте устанавливается cpu_wr_n=0, которое снимается в третьем такте.
Основная проблема: когда видеовывод читает SRAM во втором такте цикла записи, то сигнал записи и адрес меняются одновременно, что приводит к глюкам. Чтение со стороны видеопроцессора должно быть таким:
1. деактивируем сигнал записи от процессора
2. переключаем шину адреса на свою
3. защёлкиваем данные и переключаем шину адреса обратно
4. возвращаем сигнал записи от процессора
когда видеовывод читает SRAM во втором такте цикла записи
Тем более не обязательно SRAM и не обязательно во втором.
Ты не поверишь, но я уже и сам допер, почему у меня проблемы с вариантами SRAM only и SDRAM only. Общую идею арбитра я придумал, может к воскресенью (завтра без DE1) на верилог смогу переложить.
---------- Post added at 22:16 ---------- Previous post was at 20:48 ----------
Заработал SDRAM only (контроллер SRAM у меня аналогичный, только состояний меньше, т.ч. тоже должен работать). Торопился и сделал очень коряво, выкладывать такое не буду, ну и потестировать еще надо. Погонял xonixa, spitona, свой тестик памяти, сейчас поставил тест памяти DDp.
Версия с SDRAMом работает, но надо реализацию сделать менее детсадовскую.
ВГ75 поправить
Я даже не знал, что там что-то не так. А в чем с ней проблема?
Насчет ВГ75 и других 580ых - это к b2mу. Мне бы Вектор и Б2М (ну может еще Львов) у себя запустить.
b2m выложил (http://bashkiria-2m.narod.ru/index/fpga/0-12) версию РК86 для DE1 использующую только SDRAM. Если вдруг кто обнаружит глюки этого варианта - кидайте их в меня.
andykarpov
03.09.2014, 11:07
Если кому интересно - выложил свой порт РК86 на плате WXEDA:
https://github.com/andykarpov/radio-86rk-wxeda
После создания PLL из 48 в 50 МГц все завелось.
Звук сделал через PWM на встроенный бипер.
SD-карта привинчена к тем же пинам, что и в SD card mod для проекта Вектор-06Ц для этой платы.
Пока непонятно, как пользоваться SD карточкой. При вызове команды монитора "U" появляется приглашение A:\>, на карточке есть *.RK файлы, но как их оттуда запустить?. Похоже есть какой-то косяк работы с SD-картой. DIR возвращает NO FILE(S).
Если можно, b2m, расскажите, как реализовано чтение с SD карты, куда курить, чтобы пофиксить :) Я если честно совсем в растерянности, не нашел в коде проекта исходников работы с SD картой через SPI. Она как-то хитро читается с помощью biossd?
Спасибо!
Если можно, b2m, расскажите, как реализовано чтение с SD карты, куда курить, чтобы пофиксить :)
Прежде всего нужно иметь не сильно огромную SD карточку формата FAT16.
Я если честно совсем в растерянности, не нашел в коде проекта исходников работы с SD картой через SPI.
В самом конце rk_de1.v
//////////////////// SD CARD ////////////////////
reg sdcs;
reg sdclk;
reg sdcmd;
reg[6:0] sddata;
wire[7:0] sd_o = {sddata, SD_DAT};
assign SD_DAT3 = ~sdcs;
assign SD_CMD = sdcmd;
assign SD_CLK = sdclk;
always @(posedge clk50real or posedge reset) begin
if (reset) begin
sdcs <= 1'b0;
sdclk <= 1'b0;
sdcmd <= 1'h1;
end else begin
if (addrbus[0]==1'b0 && ~ppa2_we_n) sdcs <= cpu_o[0];
if (addrbus[0]==1'b1 && ~ppa2_we_n) begin
if (sdclk) sddata <= {sddata[5:0],SD_DAT};
sdcmd <= cpu_o[7];
sdclk <= 1'b0;
end
if (cpu_rd) sdclk <= 1'b1;
end
end
Она как-то хитро читается с помощью biossd?
Да, вся работа делается самой РК-шкой. Железо предоставляет лишь сдвиговый регистр, который тактируется посредством ввода/вывода в порт SD-контроллера (см. код выше).
---------- Post added at 18:41 ---------- Previous post was at 18:37 ----------
Исходники для РК я выкладывал тут: http://zx-pk.ru/showpost.php?p=699892&postcount=51
andykarpov
03.09.2014, 19:14
Прежде всего нужно иметь не сильно огромную SD карточку формата FAT16.
Да, тестирую на FAT16-карточке размером 256Мб.
В самом конце rk_de1.v
//////////////////// SD CARD ////////////////////
reg sdcs;
reg sdclk;
reg sdcmd;
reg[6:0] sddata;
wire[7:0] sd_o = {sddata, SD_DAT};
assign SD_DAT3 = ~sdcs;
assign SD_CMD = sdcmd;
assign SD_CLK = sdclk;
always @(posedge clk50real or posedge reset) begin
if (reset) begin
sdcs <= 1'b0;
sdclk <= 1'b0;
sdcmd <= 1'h1;
end else begin
if (addrbus[0]==1'b0 && ~ppa2_we_n) sdcs <= cpu_o[0];
if (addrbus[0]==1'b1 && ~ppa2_we_n) begin
if (sdclk) sddata <= {sddata[5:0],SD_DAT};
sdcmd <= cpu_o[7];
sdclk <= 1'b0;
end
if (cpu_rd) sdclk <= 1'b1;
end
end
Да, вся работа делается самой РК-шкой. Железо предоставляет лишь сдвиговый регистр, который тактируется посредством ввода/вывода в порт SD-контроллера (см. код выше)
Спасибо за информацию! Тут, в принципе, отлаживать то и нечего.
А какая частота sdclk получается? 2 МГц? или меньше?
Исходники для РК я выкладывал тут: http://zx-pk.ru/showpost.php?p=699892&postcount=51
Спасибо! А чем собирать? Tasm?
Никаких make-файлов я особо не вижу в архиве.
А какая частота sdclk получается? 2 МГц? или меньше?
Загнул! 2МГц! Сам считай: тактовая РК 1.78МГц, самое быстрое чтение - 8 команд mov m,a подряд, каждая 7 тактов, потом mov a,m. Получится 254КГц.
Спасибо! А чем собирать? Tasm?
Никаких make-файлов я особо не вижу в архиве.
В архиве есть asm.cmd для примера. Я повесил его на .asm файлы в Far-е, запускает к примеру: asm.cmd dos
Использую кроссассемблер tasm (https://home.comcast.net/~tasm/). Из того архива нужны лишь 2 файла: tasm.exe и tasm85.tab
---------- Post added at 23:03 ---------- Previous post was at 22:51 ----------
При вызове команды монитора "U" появляется приглашение A:\>, на карточке есть *.RK файлы, но как их оттуда запустить?. Похоже есть какой-то косяк работы с SD-картой. DIR возвращает NO FILE(S).
Когда по команде DIR будут выдаваться файлы, запускать как в обычном ДОСе - имя программы без расширения. Кстати, поддерживается ещё и команда CD.
Если кому интересно - выложил свой порт РК86 на плате WXEDA:
Повальное симулирование 86РК началось? :)
Вот мой вариант, на плате u8_Reverse, с ТВ-разверткой. У уважаемого b2m я честно стырил SD-интерфейс с софтом, а также бессовестно получил и использовал несколько советов от него же :)
Мне нужен был РК именно для ТВ, посему и пришлось сдуль пыль с Квартуса...
http://savepic.ru/5738239.png
http://savepic.ru/5740287.jpg
andykarpov
03.09.2014, 22:33
Повальное симулирование 86РК началось? :)
Похоже на то :) Я еще и параллельно собираю настоящий железячный RK86 (тот который с 32К SRAM).
Вот мой вариант, на плате u8_Reverse, с ТВ-разверткой. У уважаемого b2m я честно стырил SD-интерфейс с софтом, а также бессовестно получил и использовал несколько советов от него же :)
Мне нужен был РК именно для ТВ, посему и пришлось сдуль пыль с Квартуса...
А не поделитесь ли кусочком исходников формирования ТВ сигнала? Буду премного благодарен :)
А не поделитесь ли кусочком исходников формирования ТВ сигнала?
Именно для этого РК, где Черт ногу сломит в коде благодаря "чудесному" симулированию ВГ75? Или формирование ТВ-фрейма вообще, без "отягчающих обстоятельств"? :)
---------- Post added at 22:47 ---------- Previous post was at 22:38 ----------
Кстати, Бейсик от Апогея прекрасно запустился на моей РКшке... Наверное, благодаря тому, что у меня поле памяти не ограничено 32 килобайтами...
andykarpov
04.09.2014, 00:21
Именно для этого РК, где Черт ногу сломит в коде благодаря "чудесному" симулированию ВГ75? Или формирование ТВ-фрейма вообще, без "отягчающих обстоятельств"? :)
Давайте все, что не жалко, в любом случае - буду очень признателен! :)
---------- Post added at 23:08 ---------- Previous post was at 23:05 ----------
Загнул! 2МГц! Сам считай: тактовая РК 1.78МГц, самое быстрое чтение - 8 команд mov m,a подряд, каждая 7 тактов, потом mov a,m. Получится 254КГц.
Сорри :) Кстати, у меня завелась SD-карточка!!! Почему-то только одна из 3 micro-SD карточек захотела работать.
В архиве есть asm.cmd для примера. Я повесил его на .asm файлы в Far-е, запускает к примеру: asm.cmd dos
Использую кроссассемблер tasm (https://home.comcast.net/~tasm/). Из того архива нужны лишь 2 файла: tasm.exe и tasm85.tab[COLOR="Silver"]
Спасибо за инфу, будем знать. Пока вроде бы вопрос колупания исходников той части, которая на стороне самого РК - отпадает :)
---------- Post added at 23:21 ---------- Previous post was at 23:08 ----------
А еще вопрос к автору проекта radio-86RK и знатокам, плз: где курить параметры развертки для VGA, чтобы как-то уменьшить изображение по вертикали? А то на всю высоту в монитор картинка не помещается. Сейчас вижу видеорежим 640x480 x 31.2 kHz x 50Hz.
Внутри rk_video.v куча регистров, каких-то вшитых десятичных констант, непонятно что к чему:
assign hr = h_cnt >= 10'd478 && h_cnt < 10'd530 ? 1'b0 : 1'b1;
assign vr = v_cnt >= 10'd608 && v_cnt < 10'd614 ? 1'b0 : 1'b1;
assign cce = d_cnt==3'b000 && state==2'b01;
Тут 478, 530, 608, 614...
if (state==2'b00) begin
if (d_cnt==3'b101) begin
data <= lten ? 6'h3F : vsp ? 6'b0 : fdata[5:0]^{6{rvv}};
end else
data <= {data[4:0],1'b0};
if (h_cnt+1'b1 == 10'd533) begin
h_cnt <= 0; d_cnt <= 0;
if (v_cnt+1'b1 == 10'd625 ) begin
v_cnt <= 0;
end else begin
v_cnt <= v_cnt+1'b1;
end
end else begin
h_cnt <= h_cnt+1'b1;
if (d_cnt+1'b1 == 3'b110) begin
d_cnt <= 0;
end else
d_cnt <= d_cnt+1'b1;
end
end
end
Тут 533, 625 - что это ?
HardWareMan
04.09.2014, 01:18
Может, это отступления от стандартной развертки?
http://www.epanorama.net/documents/pc/vga_timing.html
andykarpov
04.09.2014, 14:32
Может, это отступления от стандартной развертки?
http://www.epanorama.net/documents/pc/vga_timing.html
Это похоже на какие-то хитрые вычисления от того, что отдает нам ВГ75 + формирование вертикальной и горизонтальной синхронизации в привязке к входящей тактовой частоте 50МГц. Но пока очень сложно разобраться, что же эта магия делает в коде rk_video.v :)
Я просто вопросы по поводу цифр задаю потому, что реализация несколько отличается от классического формирования HSYNC + VSYNC на fpga:
Вот пример с fpga4fun, в котором разложено все по полочкам:
http://www.fpga4fun.com/PongGame.html
---------- Post added at 12:20 ---------- Previous post was at 11:54 ----------
А вот это, я так понимаю, реализация мигающего курсора?
if (d_cnt==3'b101) begin
data <= lten ? 6'h3F : vsp ? 6'b0 : fdata[5:0]^{6{rvv}};
---------- Post added at 13:32 ---------- Previous post was at 12:20 ----------
исходя из того, что в РК 64 знакоместа по горизонтали и 25 по вертикали (знакоместо при этом 6х8 + под каждой строкой орисовывается 2 линии растра), получается картинка размером 384х250.
вот с этого места непонятно, как из нее получается 640х480 :)
640x480 -- это "логический" размер. VGA-шный сигнал аналоговый и пикселей в нем нет. Если модулировать луч два раза на строку, будет 2 пикселя в строке, если 1000 -- будет 1000.
HardWareMan
04.09.2014, 15:17
640x480 -- это "логический" размер. VGA-шный сигнал аналоговый и пикселей в нем нет. Если модулировать луч два раза на строку, будет 2 пикселя в строке, если 1000 -- будет 1000.
Это все справедливо для ЭЛТ моников. Для LCD следует придерживаться некоторых правил. 384х250 отлично вписывается в 800х600 при минимально возможном бордюре. Этот режим используется в эмулях в полноэкранном режиме и в моем МХ2.
где курить параметры развертки для VGA, чтобы как-то уменьшить изображение по вертикали? А то на всю высоту в монитор картинка не помещается. Сейчас вижу видеорежим 640x480 x 31.2 kHz x 50Hz.
Давно это было. Но режим я вроде 800х600 делал, полярность КСИ/ССИ от него должна быть. Строчная - да 31,5 КГц должна быть.
Тут 533, 625 - что это ?
Вобщем считается это так. Для начала прикидываем пиксельклок: РК программирует 78 символов + 8 на ССИ, символ по 6 точек, итого 516 точек. Умножаем на строчную получаем 16,254МГц. Из 50МГц можно получить делением на 3 (я не стал заморачиваться с PLL). После деления на три получим пиксельклок 16,(6)МГц, и разделив на строчную получим полное количество точек в строке 529. В коде стоит однако 533, это я потом напильником дорабатывал, чтобы экран чуть-чуть по горизонтали сплющить, а то буквы слишком близко к краю экрана были. С вертикальной та-же фигня 31500/50=630, после доработки напильником 625 :)
Внутри rk_video.v куча регистров, каких-то вшитых десятичных констант, непонятно что к чему:
Тут 478, 530, 608, 614...
Это начало и конец ССИ и КСИ. Сначала рассчитывал, по аналогии с другими режимами VGA, потом просто доработал напильником под свой монитор :)
---------- Post added at 17:17 ---------- Previous post was at 17:06 ----------
Понял, почему у тебя 640х480. Вот табличка (по ссылке от HardWareMan-а)
Mode Horiz Vertical Horiz Vert Horiz HSYNC Vertical VSYNC
Dots Lines KHz Hz Sync Pol Sync Pol
VGA-480 640 480 31.5 60 3.8us - 64us -
VGA-400 640 400 31.5 70 3.8us - 64us +
SVGA I 800 600 35.2 56 2.0us - 57us -
SVGA II 800 600 37.8 60 3.2us + 106us +
SVGA III 800 600 48.0 72 2.4us + 125us +
XGA 1024 768 48.5 60 2.0us - 124us -
Я взял полярность от режима SVGA I, а строчная у меня неправильная. Я почему-то решил тогда, что должно быть 31.5 и точка :)
---------- Post added at 17:33 ---------- Previous post was at 17:17 ----------
А вот это, я так понимаю, реализация мигающего курсора?
Нет, это данные для сдвигового регистра. Учитывается подчеркивание (реализовано выходом lten) и инверсия (rvv). Ну и мигание тоже: vsp это одноимённый сигнал ВГ75 video supression. Он используется и во время ССИ/КСИ.
andykarpov
04.09.2014, 19:35
Спасибо за подробные разъяснения! Теперь картинка начала проясняться :)
Итак, я решил немного допилить этот кусок и реализовать SVGA II режим 800x600x60Гц.
Судя из вышеперечисленных алгоритмов вычисления, для 516 точек в строке и частоты 37.8 кГц нужен пиксельклок 19.5МГц.
С помощью PLL получилось сделать 19.512МГц.
В коде поменял полярность ССИ и КСИ на положительную, согласно требованиям видеорежима.
Также убрал деление на 3 (счетчик state), ибо на вход rk_video подаю 19.5Мгц с PLL.
После вычислений получилось точное количество точек в строке 516 при количестве строк 630. Посему поправил 533 на 516 и 625 на 630.
Остался вопрос с началом и концом ССИ и КСИ.
Согласно табличке, длительность горизонтального синхроимпульса должна составлять 3.2us, и вертикального - 106us. Сколько это в точках линии и количествах строк - непонятно, и непонятно в какой момент этот синхроимпульс должен включаться и отключаться. Просветите, плз!
Остался вопрос с началом и концом ССИ и КСИ.
Согласно табличке, длительность горизонтального синхроимпульса должна составлять 3.2us, и вертикального - 106us. Сколько это в точках линии и количествах строк - непонятно, и непонятно в какой момент этот синхроимпульс должен включаться и отключаться. Просветите, плз!
19.5Мгц*3.2us = 62.4 точки
37.8кГц*0.106ms = 4.0068 линии
---------- Post added at 20:56 ---------- Previous post was at 20:51 ----------
Судя из вышеперечисленных алгоритмов вычисления, для 516 точек в строке и частоты 37.8 кГц нужен пиксельклок 19.5МГц.
516 точек это для ТВ развёртки хорошо. Для VGA возможно больше нужно будет, чтобы изображение по горизонтали не вышло за края экрана.
---------- Post added at 20:59 ---------- Previous post was at 20:56 ----------
непонятно в какой момент этот синхроимпульс должен включаться и отключаться.
В зависимости от того, когда он включается и выключается, изображение будет смещено влево или вправо.
---------- Post added at 21:00 ---------- Previous post was at 20:59 ----------
Или вверх/вниз - для КСИ.
andykarpov
05.09.2014, 03:54
В общем сделал я 800x600x75Гц, используя пиксельклок 25МГц.
Монитор показывает правильные времянки, поляризацию и разрешение.
Но теперь, похоже, ВГ75 не успевает :) Или у меня руки совсем кривые :)))
В Вашем коде сигнал cce для ВГ75 формируется заранее с запасом (при state==2'b01, после него есть еще state 2'b10).
Проявляется бага в рандомном скакании надписи РАДИО-86РК по экрану.
andykarpov
05.09.2014, 12:51
Кстати, кому интересно, нашел ссылочку с описанием всех стандартных видео-режимов VGA со всеми посчитанными таймингами: http://tinyvga.com/vga-timing
---------- Post added at 11:51 ---------- Previous post was at 11:01 ----------
Также несколько неверным получается расчет количества точек в линии в видеосигнале, формируемым в ВГ75. Судя по этой картинке
http://www.nedopc.org/nedopc/upload/R86Ekran_.gif
(оригинал обсуждения тут: http://www.nedopc.org/forum/viewtopic.php?t=10577&start=45
Мы имеем всего 78 знакомест (вместе с гасящими), получается 468 точек в линии. Из них 64 знакоместа видимые (384 точки).
А по вертикали имеем 300 линий (250 видимой области).
Посему непонятно, откуда в первоначальных расчетах взялась цифра 516...
Мы имеем всего 78 знакомест (вместе с гасящими), получается 468 точек в линии. Из них 64 знакоместа видимые (384 точки).
А по вертикали имеем 300 линий (250 видимой области).
Посему непонятно, откуда в первоначальных расчетах взялась цифра 516...
Всё тут понятно. Я же выше говорил, что строчный СИ программируется длиной в 8 знакомест. Итого 468 + 8*6 = 516.
andykarpov
05.09.2014, 14:29
Всё тут понятно. Я же выше говорил, что строчный СИ программируется длиной в 8 знакомест. Итого 468 + 8*6 = 516.
А можно уточнить, каким образом формируется сигнал cce для ВГ75 ? я так понимаю, он должен сработать перед началом получения следующего знакоместа? Т.е. мы этот сигнал формируем каждые 6 точек ?
---------- Post added at 13:29 ---------- Previous post was at 13:27 ----------
И еще - а разве строчный СИ не формируется где-то в момент гасящих сигналов? (где-то в момент с 1 по 8 знакоместо или с 72 по 78) ?
А можно уточнить, каким образом формируется сигнал cce для ВГ75 ? я так понимаю, он должен сработать перед началом получения следующего знакоместа? Т.е. мы этот сигнал формируем каждые 6 точек ?
Да, d_cnt счётчик точек от 0 до 5. cce это просто клок для ВГ75.
И еще - а разве строчный СИ не формируется где-то в момент гасящих сигналов? (где-то в момент с 1 по 8 знакоместо или с 72 по 78) ?
Нет, ВГ75 тупо выдаёт считанные 78 символов, затем ССИ длиной в заданное число знакомест. Поэтому экран РК-шки с дырками (гашение для ТВ).
andykarpov
05.09.2014, 15:17
Нет, ВГ75 тупо выдаёт считанные 78 символов, затем ССИ длиной в заданное число знакомест. Поэтому экран РК-шки с дырками (гашение для ТВ).
Спасибо! А еще вопросик: а о КСИ такая же фигня ? 300 строк + сколько-то строк на СИ?
а о КСИ такая же фигня ? 300 строк + сколько-то строк на СИ?
Да, монитор РК-шки программирует 1 знакоряд на КСИ, т.е. 10 строк. Итого получается 310 строк, хотя телевизионный стандарт - 312,5.
andykarpov
05.09.2014, 19:14
Получается да, интересно. Это мы при количестве строк 625 получается 2 раза успеваем один и тот же фрейм вывести ???
Мы выводим фрейм не два раза, а каждую строку два раза подряд. Это и есть принцип скандаблера, когда ТВ-развертка превращается в "приближенную к VGA". Так работает VGA-конвертер от zst, так же сделаны некоторые конфигурации ретро-компов для плат uX-Reverse.
Т.е. мы удваиваем пиксельный клок и выводим строки по два раза, и ТВ превращается в ВГА :)
HardWareMan
05.09.2014, 21:27
Мы выводим фрейм не два раза, а каждую строку два раза подряд. Это и есть принцип скандаблера, когда ТВ-развертка превращается в "приближенную к VGA". Так работает VGA-конвертер от zst, так же сделаны некоторые конфигурации ретро-компов для плат uX-Reverse.
Т.е. мы удваиваем пиксельный клок и выводим строки по два раза, и ТВ превращается в ВГА :)
Так же сделано в МХ2. Только я наоборот поделил пиксельклок SVGA режима на 2, чтобы они дублировались.
Чем мне нравится такой метод - мы не только делаем комп "религиозно натуральней", но и получаем по сути два режима видеовывода, которые можно тупо переключать по желанию. Я так делал для конфига KAY-1024, к примеру. Сам конфиг генерирует ТВ-развертку, а сразу за этим модуль скандаблера записывает выводимый сигнал в две "строчки памяти" и выдает их поочередно с удвоенной частотой. Пока одна "строчка" заполняется данными, вторая успевает как раз два раза вывестись на экран. Ресурсов это отнимает совсем немного.
HardWareMan
06.09.2014, 05:00
Такой скандаблер и в отдельном устройстве дешевле, т.к. не надо хранить весь кадр. Вот только с фреймрейтом пролетаем, если 60Гц. Если взять нестандартную развертку с 50Гц, тогда было бы вообще кошерно, но не все моники ее держат. CRT держали не все, а про LCD вообще молчу.
Вот только с фреймрейтом пролетаем, если 60Гц.
Это ебстесственно. Для частоты, отличной от 50 нужно хранить в буфере весь кадр.
Я не упомянул, что у меня сейчас все мони дома и на работе держат 50Гц. Специально не подбирал, оно само так получилось :)
andykarpov
07.09.2014, 04:22
мда, все сложно как-то выходит :)
Получается, что можно сформировать кусок видимого изображения во фреймбуффер, для РК86 с головой хватает для этого пиксельклока 8Мгц (для 516 x 310 точек @ 50Гц).
Выводить эту картинку уже можно при пиксельклоке 40Мгц например (для полноценного стандартного VGA 800x600x60Гц). Другой вопрос - где хранить (и сколько раз) данные для фреймбуффера.
По логике, вроде как подходит внешний SDRAM. для одного кадра хватает 14кб, посему может и внутренних ячеек должно хватить ?
HardWareMan
07.09.2014, 12:57
Может и хватить. Тем более, внутренние двухпортовые, можно будет асинхронно туда писать и оттуда считывать.
andykarpov
08.09.2014, 14:27
Хватило. Получится блок длиной 131072 бит двухпортовой памяти. В которую помещается часть экрана (я сделал фреймбуффер 432x300). Хотя и задекларирована в РК экранная видимая область 384x250, все равно не все программы этого придерживаются и зачастую лезут в невидимую область.
Запись в него идет с клоком 16Мгц, чтение - с клоком 48Мгц.
Все бы ничего, только визуально заметны (не сильно, но есть) некоторые срывы, я так понимаю это как раз когда случается одновременная запись и чтение. Я хоть и выставлял в мега-визарде для такой ситуации, что если в ячейку что-то пишется, второй агент получает старое значение - но это как-то не сильно работает.
Учитывая то, что с квартусом и verilog'ом я знаком буквально неделю, возможно есть какие-то решения, как это избежать (читать по негативному фронту клока или еще как-то)? Хранить второй кадр аж никак не получится, нет на это ресурсов уже.
andykarpov
08.09.2014, 19:50
Вот ссылочка на текущий бранч с тестовой и пока глючноватой реализацией фреймбуффера, кому интересно: https://github.com/andykarpov/radio-86rk-wxeda/tree/framebuffer-test/
andykarpov
09.09.2014, 16:32
Выложил релиз 1.0 (тег release-1.0 в master'е) версии radio-86RK_SDRAM для платы Zr-Tech WXEDA: https://github.com/andykarpov/radio-86rk-wxeda/
В данном релизе удалось пофиксить glitch'и отображения.
Теперь имеется полноценный режим VGA 800x600x72Гц (можно было бы и 75 сделать, чтобы совсем следовать стандарту, но тактовая частота платы - 48Мгц, а с PLL возиться не хотелось) :)
Теоретически, если кому вздумается переносить код VGA обратно на DE1 - будет вообще песня, там тактовая частота 50МГц, что идеально сформирует VGA 800x600x75.
А проблема, о которой я писал выше, судя по всему, заключалась в том, что мы от ВГ75 требуем 516x620 строк для кадра, строк как бы в 2 раза больше чем в 310 оригинале, и почему-то каждая вторая строка в какой-то момент приходила чуть битая (ну или я не знаю как объяснить этот феномен).
Теперь можно курить дальше, чтобы прикрутить tape-in / tape-out и s-video :)
И поставить наконец-то точку в этом проекте :)
andykarpov
10.09.2014, 00:02
Добавил README со всеми известными мне оригинальными копирайтами и ссылками на связанные с проектом статьи / обсуждения / фото.
Если кого обидел - дайте знать, плз.
Нет повышенной яркости, ..., в сравнении с Вашим же эмулятором.
А вот не надо сравнивать с эмулятором :) Стандартная 86РК не имеет повышенной яркости. Соответственно программы для РК не используют эту фичу и выглядят вполне нормально и в эмуляторе. В эмуляторе я сделел эту фичу как-бы "на будущее", чтобы проверить работу всех атрибутов. Я просто "забыл" убрать соответсвующую строчку в конфиге.
вопрос по поводу ВГ75:
если включен режим невидимых аттрибутов, то позиции сдвигаются в пределах строки или всё же всей оставшейся части экрана?
Зависит от того, стоит ли в конце строки код остановки чтения из памяти (ПДП).
На какой стадии проект?
Я так понял проблемы начались после приколачивания VGA ?
А как устройство в остальном? Порты, слоты расширения, или вы большую часть функционала хотите впихнуть в ПЛИС, а оно туда влезет?
Прошел квест с запуском проекта от b2m и ivagor с sdram на плате Unamiga. Переделал видеовыход под стандартный композит, тк есть мониторчик 7" для этого, и заменил sd карту на mmc (не работала с biossd), тк она есть, а sd маленького объема нет и уже купить сложно. Получил удовольствие, будто попал в прошлое. За что большой респект в Уфу авторам! Проект рабочий, простой в повторении и модификации. Рекомендую.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot