Вход

Просмотр полной версии : Радио-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 не знаю.
Если у кого-то есть наработки по этим контроллерам, то также буду благодарен за содействие.

tnt23
27.05.2010, 15:06
Видеовыход лучше VGA, наверное?

Santechnik
27.05.2010, 15:23
Согласен, что лучше. Но как мониторы относятся к такому сигналу, который дает классический РАДИО? Потянут? Потому как не хочется пока отходить от классики и играть разрешениями/частотами.
Я если честно, не имел опыта с мониторами и пока слабо представляю некоторые детали.

Gryphon
27.05.2010, 15:29
И еще лучше сразу сделать программную доработку "Цветные компьютеры РК86", сделать программную поддружку ВИ53, ВВ51, попробовать сделать контроллер дисковода, как описывалось в "Радио", можно сделать выход на принтер (LPT), там же можно будет сделать РОМ-диск (к примеру, сделать его на флеш-карточке). вот чисто мое имхо.

Ewgeny7
27.05.2010, 16:07
Потому как не хочется пока отходить от классики и играть разрешениями/частотами.
Основной рабочий экран не трогай, а "всё остальное" можно как угодно изменять, подгоняя под нужный режим. Самое простое - обычный скандаблер - строки выводить по ДВА раза за вдвое меньшее время (на строчку). Моники 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.
А вот это уже мне интересно. Поделишся технологией?

svofski
27.05.2010, 16:24
Некоторые мониторы действительно тяжело переживают VGA на 50Гц, но очень многие терпят. Лушче бы все-таки VGA выход иметь.

Композит удобен тем, у кого монитор умеет с композита делать PIP в углу экрана.

---------- Post added at 16:24 ---------- Previous post was at 16:20 ----------

Да, а 8255 из FPGA Arcade вполне себе исправный. В Векторе работает.

Ewgeny7
27.05.2010, 19:34
Из комплексных задач - создание контроллера DMA, CRT и периферии.
Контроллер монитора не проблема, нужно знать параметры развертки и знакогенератор.

b2m
27.05.2010, 19:57
Контроллер монитора не проблема, нужно знать параметры развертки и знакогенератор.
А если они не фиксированные? У ВГ75 количество строк, столбцов и сканлиний на знакоряд не фиксированно и задаётся в команде инициализации. Там же задаются ещё кое-какие параметры развёртки.

Ewgeny7
27.05.2010, 20:05
А если они не фиксированные?
Чесслово, не знаю. Но насколько я знаю, используется в РК вроде как один видеорежим, его и нужно эмулировать.

svofski
27.05.2010, 20:22
Это ж был самый смак, забубенить через ВГ75 какой-нибудь адский видеорежим, чтобы он был почти графическим. Разве нет?

Mick
27.05.2010, 20:26
Чесслово, не знаю. Но насколько я знаю, используется в РК вроде как один видеорежим, его и нужно эмулировать.

В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический. :)

Ewgeny7
27.05.2010, 20:37
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический.
Тады ай :(

---------- Post added at 20:37 ---------- Previous post was at 20:35 ----------

Эмуляторостроители вроде как должны знать о режимах?

DATAsoft
27.05.2010, 20:46
В некоторых игрушках и граф редакторе (по крайней мере в Апогее) ВГ75 перепрограммировался режим в псевдографический. :)

А в игрушке "Трясина" такое ощущение, что "даже в графический".

Mick
27.05.2010, 20:53
А в игрушке "Трясина" такое ощущение, что "даже в графический".

Я его назвал потому как, всеравно пискели у него из знакогенератора псевдографики. Для примера можно также назвать демо где на эране изображена карикатура воришки. Как называется она не помню. Есть она на кассете. Ее все планирую оцифровать :)
А так есть точно две прикладные проги - Графический редактор и Бейсик графический и одна игрушка - Гонки (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-х типов.

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

b2m
28.05.2010, 12:17
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).

Ewgeny7
28.05.2010, 12:28
Вот в соседней теме например: http://zx.pk.ru/showthread.php?t=11749. Этот маленький файл развернулся у меня на 1 мег
Нормальный файлик, 2 килобайта.
Держи Intel HEX:

Ewgeny7
28.05.2010, 12:30
А как пропорции изображения себя поведут?
Изменится, но несильно. Можно просто не обращать внимания, можно и подрегулировать на мониторе. Если монитор кошерный - он запомнит настройки для данного режима

Santechnik
28.05.2010, 16:29
b2m, спасибо. Все идет к тому, что всю БИС симулировать придется :v2_smoke: Ладно. Пока сделаю минимум, запущу, потом доделаю. Но сейчас хотя бы буду делать с учетом расширения.
А как курсор блок работает? Просто тупо рисуется белый прямоугольник? Или инвертированный символ? И если второе, то как это работает? Я по схеме смотрю - не получится на Радио инверсию сделать.


Нормальный файлик, 2 килобайта.
Держи Intel HEX:

О! Отлично! Хотя мой Mac на него тоже 1Мб показывает:v2_conf3:, но под Виндой все ОК. :v2_thumb:


Изменится, но несильно. Можно просто не обращать внимания, можно и подрегулировать на мониторе. Если монитор кошерный - он запомнит настройки для данного режима

Я не проверял мой моник на кошерность, но попробую твой вариант. Тем более его проще на DE1 сделать. Но я с вопросами еще зайду, ОК? :v2_rolley А то для меня моники - черный ящик пока :)

svofski
28.05.2010, 16:45
Я не проверял мой моник на кошерность, но попробую твой вариант. Тем более его проще на 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

b2m
28.05.2010, 17:00
Santechnik, и правда. Посмотрел схему, почитал Шахнова. Инверсии в Радио-86РК нет. Сигнал LTEN тоже защёлкивается в триггере одновременно с данными (в результате чего они просто не выдаются). В Шахнове сказано, что курсор-подчёркивание формируется сигналом LTEN, а курсор-блок - инверсией (у меня в эмуляторе неправильно). Значит в минимальном варианте курсор-блок не нужен.

svofski
28.05.2010, 17:21
Значит в минимальном варианте курсор-блок не нужен.
В минимальном может быть и нет, но иметь цельноработающий ВГ75 было бы очень круто.

b2m
28.05.2010, 18:00
Я тоже считаю, что нужно реализовать полноценные контроллеры DMA и CRT, а там уж - кто как захочет их использовать.

svofski
28.05.2010, 18:14
Все так, но воротить нос от 86РК с частично-реализованным ВГ75 я не стану. Микросхемы сложные и не стоит на них зацикливаться.

Ewgeny7
28.05.2010, 21:16
Как показывает жизнь, нужно делать минимальную конфигурацию машины.
Когда она заработает - уже становится принципиально интересно "наворачивать" её.
Сразу ориентироваться на "полный фарш" - проект никогда не закончишь.

esl
29.05.2010, 01:23
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 клавы пока нет :)

b2m
29.05.2010, 10:53
А как это работало? Как в деталях отличалось, например End Str от End Str - DMA Stop?
Ну "End Str" - это просто гашение изображения до конца строки, а символы/атрибуты для знакомест всё равно считываются в буфер через DMA как обычно. Соответственно "End Str - DMA Stop" прекращает считывание для текущей строки. Последнее весьма полезно, если используются "невидимые" атрибуты, т.е. когда в команде инициализации задано, что атрибуты не занимают знакоместа. В этом случае ширина строки (количество символов в строке на экране) зависит от количества атрибутов в строке, а в памяти она фиксирована, и если не остановить запросы к DMA, то в каждом кадре получится смещение данных по горизонтали, из-за чего получается характерный горизонтальный скроллинг.

svofski
29.05.2010, 16:59
А я его еще не запускал :v2_blush: У меня PS2 клавы пока нет :)

Картинку видно и без клавиатуры. Его просто запускать: не надо никаких флешей подготавливать, просто .sof залил и все.

sergey2b
29.05.2010, 20:13
извините за некоторый offtop
подскажите пожалуйста где можной найти лекарство для Quartus II 9.1

Ewgeny7
29.05.2010, 22:11
подскажите пожалуйста где можной найти лекарство для Quartus II 9.1
Скачай 9.1 WEB EDITION и не забивай голову лекарствами :) Она бесплатна.

sergey2b
29.05.2010, 22:53
хочу поставить на PC с win x64, WEB EDITION ее вроде не поддерживает

tnt23
29.05.2010, 23:35
sergey2b, а зачем он может быть нужен полный, кроме как для инкрементальной компиляции? Остальное для большинства наших целей вполне умеет Web edition.

Ewgeny7
30.05.2010, 00:02
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. Получается очень неплохо. Незначительное нарушение пропорций компенсируется четкостью и удобством.

svofski
30.05.2010, 15:52
Из 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:

svofski
01.06.2010, 15:54
Сопрягать FPGA-шный дизайн с олдовыми чипами -- тоже не факт, что получится просто. А это твой первый проект, или у тебя большой опыт? Начинать с ВГ75 -- это по-моему очень жестко.

Atari
01.06.2010, 17:56
A какой вообще смысл эмулировать реальную ВГ75 и DMA ?

Ваша главная задача чтоб попали соответсвующие байты памяти в соответсвующее знакоместо на экране.

Wowik
01.06.2010, 18:12
На сколько помню,они работают в спарке, в контроллер DMA загоняется интервал области памяти ,адрес,длина, период передачи, а в ВГ75 непосредственно данные изображения количество строк, столбцов, межстрочные интервалы, курсор и т.д. знакогенератор там фиксированный на РФ2, вот они вместе и пашут, DMA выдает пачками данные а ВГ75 отображает сообразно знакогенератору и настройкам. Т.е. адрес экранной области и её длина не фиксированы.

svofski
01.06.2010, 19:05
A какой вообще смысл эмулировать реальную ВГ75 и DMA ?

Ваша главная задача чтоб попали соответсвующие байты памяти в соответсвующее знакоместо на экране.

Если бы формат отображения был фиксированым, это было бы так. Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.

svl
01.06.2010, 19:37
знакогенератор там фиксированный на РФ2
Если быть точным, изначально там была РФ1. В РФ2 для стандартного знакогенератора задействовалась одна половина, а в другую можно было зашить другой, ориентированный на конкретную программу. Если не изменяет память, одна из программ, использующих свой знакогенератор, - редактор печатных плат.

Atari
01.06.2010, 20:04
Если бы формат отображения был фиксированым, это было бы так. Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.

например?

и Вы думаете что у вас эти "эффекты" не превратятся в деффекты?

Santechnik
02.06.2010, 02:23
Сопрягать FPGA-шный дизайн с олдовыми чипами -- тоже не факт, что получится просто. А это твой первый проект, или у тебя большой опыт? Начинать с ВГ75 -- это по-моему очень жестко.

Да, конечно, сопрягать тоже не просто. И тайминги, и напруга... Но по-любому продолжаем. Но если до конца июля не успею, то придется сделать паузу до ноября.
А опыта с ПЛИС нет. Из практических вещей - только все задачи с диска от DE1. :v2_blush:
Я вообще бухгалтером работаю. :v2_rolley Просто хобби у меня было лет 20 назад. Ну а сейчас захотелось это хобби восстановить. А тут новые технологии. Паять просто уже не так интересно. С микроконтроллерами разобрался. Таймер с допфункциями придумал, прошу на ассемблере написал и собрал. Теперь до ПЛИС дошел. Я там в начале писал - одна из целей проекта ознакомление с новыми технологиями. Но проект я настроен завершить решительно. :v2_smoke:
Ну прокопаюсь я с этим контроллером пусть в 5 или 10 раз дольше чем профи. Но ведь в кайф! Это же хобби - главное процесс. Ничего неразрешимого там не вижу. Но зато какой опыт!

svofski
02.06.2010, 14:24
Можно сначала сделать простой видеоконтроллер: один текстовый режим, такой как в рк86 по умолчанию, и без DMA. На нем руку набить, да и для отладки системы он потом будет полезен.

Santechnik
02.06.2010, 14:44
А у меня этот монстр движется нормально. Уже схема на все составлена. Блок программирования параметров готов, DMA готов, FIFO готов. Сейчас буфер пишу и контроллер к нему (сделано около 10%). Останется счетчики (большинство уже тоже сделано) и сигналы развертки сделать.
А потом со всем этим попробуем взлететь :biggrin:

Rokl
02.06.2010, 19:42
... Но ВГ75 -- программируемый контроллер и были программы, которые программировали его нестандартным образом для для достижения разных интересных эффектов.
Для этого нужно было сам "монитор"исправить. В стандартном варианте ВГ75 запрограммировать на артибуты было нельзя,т.к. все данные от 80h,до 0FFh на ВГ75 не проходили.

Кстати К580ВГ75 отлично работает в режиме VGA с частотами 72гц на 32Кгц.(это его стандартный режим VGA).

Santechnik
03.06.2010, 00:05
А на сколько распространены были такие исправления Монитора?

Atari
03.06.2010, 00:12
Santechnik, на самом деле мониторов было мульен.

Конечно есть "классический" по журнальной схеме 32к, но дальше...

Был вариант "если нет ВГ75", с разными модифицированными коммандами, 16к версия, версия под МС7007 и т.д. и т.п.

Был даже "РК86" для "Микроши".

Santechnik
03.06.2010, 01:35
Во-о-о-т. А Вы спрашиваете почему надо ВГ75 симулировать. ;) Надо чтобы универсально было. Да и дальше может быть Микроша или Апогей будет.

svofski, А не подскажешь, пожалуйста: в 8080 для ПЛИС, который ты использовал в Векторе, 2 входа CLK: CLK и CLKEN. Я правильно разобрался, что CLK соответствует Ф2, а CLKEN - Ф1 оригинала?

Atari
03.06.2010, 09:51
Во-о-о-т. А Вы спрашиваете почему надо ВГ75 симулировать. ;) Надо чтобы универсально было. Да и дальше может быть Микроша или Апогей будет.

Наша основная задача - чтоб работали программы выводящие данные непоследственно в видео память (это - 99% игрушек) и все, никаких эмулей ВГ75 не надо. Надо только четкое попадание по знакоместам.

svofski
03.06.2010, 12:58
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 у железного проца была?

svofski
03.06.2010, 14:41
Таки ведь не в скоростях дело. В FPGA ты практически не можешь контролировать пути распространения сигналов и гонки возникают произвольным образом. Глич и есть глич, не принципиально как он возникает -- один, или 10 миллионов раз в секунду.

Ф1 у железного проца наверное была для решения каких-то схемотехнических проблем. Допустим по Ф0 выставляется микрокоманда datapath-у, по Ф1 datapath пропихивает данные. Чем больше фаз и чем больше фронтов используется, тем больше всего можно сделать за один такт.

svl
04.06.2010, 13:33
Для этого нужно было сам "монитор"исправить. В стандартном варианте ВГ75 запрограммировать на артибуты было нельзя,т.к. все данные от 80h,до 0FFh на ВГ75 не проходили.


Что-то вы путаете. Перепрограммировать любой контроллер можно в любой момент. Причём здесь монитор? Другое дело, что возможна потеря совместимости со стандартными подпрограммами монитора, но в таком случае их функции берет на себя программа, перепрограммирующая контроллер.

Rokl
09.06.2010, 00:40
Перепрограммировать любой контроллер можно в любой момент. Причём здесь монитор? Другое дело, что возможна потеря совместимости со стандартными подпрограммами монитора, но в таком случае их функции берет на себя программа, перепрограммирующая контроллер.
Да, вместо того, что бы в мониторе изменить всего один байт, нужно писать процедуры перепрограммирования контроллера ВГ75, и замену стандартных подпрограмм монитора...тоже вариант.

svl
09.06.2010, 22:50
Да, вместо того, что бы в мониторе изменить всего один байт, нужно писать процедуры перепрограммирования контроллера ВГ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

b2m
19.06.2010, 12:50
Я не специалист, но по-моему "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: Спасибо! Вот что значит свежий взгляд!

svofski
19.06.2010, 14:19
Я не специалист, но по-моему "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 -- на тактирующий вход. Какой фронт используется у обоих сигналов, значения не имеет.

В коде вертикальной развертки все просто -- одна из половинок делает асинхронную установку. А в горизонтальной написано так, что на оба фронта загружается не константа, выходит, что это не регистр с асинхронным сбросом, а что-то типа двухпортовой ячейки, или я даже не знаю что это. Наверное, Квартус тоже не понял.

b2m
19.06.2010, 14:44
Если посмотреть на RTL схему от этой конструкции, то можно увидеть, что yyy подается на вход асинхронного сброса (или асинхронной установки) счетчика, а xxx -- на тактирующий вход. Какой фронт используется у обоих сигналов, значения не имеет.
После таких преобразований - конечно.


Наверное, Квартус тоже не понял.
Интересно, как выглядит RTL схема того, которое неработает.

Кстати, это прямо в квартусе RTL схема показывается? Я особо не копался, не подскажешь - как?

svofski
19.06.2010, 15:10
Кстати, это прямо в квартусе RTL схема показывается? Я особо не копался, не подскажешь - как?

Когда уже все собралось, в Project Navigator-е смотри в закладку Hierarchy. Там в контекстном меню интересующего тебя модуля можно вызывать "Locate in RTL Viewer" и оно покажет.

Santechnik
19.06.2010, 16:35
Интересно, что я там в первый раз пытался квартусу всучить, что он так ругался "Internal Error"? :v2_blush: Кстати, до того как заработало, конструкция занимала около 60 элементов. Сейчас 30 :v2_rolley
Я думал, что неважно, что напишу, квартус разрулит это как-нибудь. Спасибо за разъяснения! Может мне книжку какую посоветуешь почитать для восполнения пробелов? А то вот так и тыкаюсь как слепой котенок иногда на таких вещах.

svofski
19.06.2010, 17:13
К сожалению не знаю подходящих книжек. Так получилось, что все из интернетов. И да здравствует опенсорс.

Клифф Каммингс написал много интересных статей про Верилог. Полторы из них я даже наполовину осилил когда-то. Мне нравится, что он часто подходит к проблеме со стороны инженера-самоучки, который в принципе многое уже умеет, но не знает почему так получается.
http://www.sunburst-design.com/papers/

b2m
17.07.2011, 20:33
Набросал свою версию Радио-86РК. Качать, как всегда, на моём сайте в разделе ПЛИС (http://bashkiria-2m.narod.ru/fpga.html). Работает почти всё, загружать программы можно через магнитофон, хотя лично я просто соеденил выход звуковой карты со входом DE1 и "жужжал" из своего эмулятора :)

Есть отличие от стандартного РК - я реализовал инверсию, чтобы проверить работу курсора-блока.

Santechnik
18.07.2011, 12:00
Супер! Попробую сегодня. А "почти все работает" что означает? Что не работает? Как реализовал ВГ75?

b2m
18.07.2011, 14:32
А "почти все работает" что означает?
Почти всё работает - означает, что реализованы все БИС, в том числе ВТ57 и ВГ75.


Что не работает?
Мелочи всякие, которые в основном не используются: сдвиг приоритетов каналов ПДП, атрибуты LA0,LA1, ну и т.п.


Как реализовал ВГ75?
По аналогии с тем, что у меня в эмуляторе :) Ну и конечно, сверялся по Шахнову. Нельзя сказать, что реализовано в точности как в железе, но основные функции оно выполняет. В частности, кадровые и строчные СИ я использовал внешние, от генератора развёртки 800х600@50Гц. Шину данных разделил на три части (ввод,вывод и вход символа от ПДП), управляющие сигналы тоже (чтобы не городить мультиплексоров). Шину адреса ВТ57 сделал без заморочек со старшим байтом в регистре - просто 16 бит. Вобщем, разница не принципиальная, в основном адаптация для ПЛИС.

Santechnik
18.07.2011, 16:41
Впечатляет! :v2_thumb: Есть в планах доделывать эти мелочи? Будешь ли выкладывать сорцы?

b2m
18.07.2011, 18:38
Основная часть была скопирована из сырцов Башкирии-2М. Я добавил лишь ВТ57 и ВГ75, их я как-нибудь потом выложу, когда посчитаю, что больше сам ничего менять не буду. :)

b2m
20.09.2011, 21:58
Добавил поддержку SD-карты, команда монитора U (которая обычно просто делает переход на 0F000h). Работают команды DIR, CD и запуск .rk(.rkr) файлов. FAT32 не поддерживается.

b2m
30.09.2011, 11:13
Исправил ошибки:
- неправильно формировался флаг доп. переноса
- в режиме макс. скорости иногда не работал вывод в порты ВГ75,ВТ57
- DIR *.RK не выдавал файлы с длинной имени 8 знаков

b2m
15.12.2011, 12:02
Решил всё-таки выложить недоделанные исходники, т.к. последние три месяца вообще ничего не делал, если не считать, что вчера добавил информацию об авторстве в исходники. Убедительная просьба, не удалять её оттуда. :)

vinxru
15.12.2011, 12:52
Я потом хочу попробовать засунуть ВТ57 и ВГ75 в AVR. Будет компьютер из четырех микросхем: Задающий генератор, процессор, статическая память и AVR.

kovdry
15.12.2011, 18:25
Я потом хочу попробовать засунуть ВТ57 и ВГ75 в AVR. Будет компьютер из четырех микросхем: Задающий генератор, процессор, статическая память и AVR.
Хорошая затея!

Правда, я бы распределил функции AVRов так: Видео генератор (ВТ57 и ВГ75), Процессор (ВМ80+ПЗУ+мелочевка), Статическое ОЗУ 32кб, Ввод/вывод (ППА ВВ55 D14 и D20). Возможно Вы, vinxru, это и имели ввиду?

Да, есть еще, на мой взгляд, проблема: пиксель клок в РК 8МГц. Сможет ли ATMega работающая пусть даже на 20МГц выдать нам на каком нибудь порту такой пиксель клок? 20/8=2.5 Получается нужно выдавать каждые 2 с половиной такта.

vinxru
15.12.2011, 20:06
Я бы наверное использовал оригинальный процессор 580ВМ80. Если бы не 3 питания, я бы даже не думал в сторону эмуляции 8080 на ATMega.

А по поводу 8 Мгц, народ придумал использовать SPI. Я сам не разбирался, но вроде бы принцип такой. В порт в частотой 1 Мгц записывается сразу 8 бит, и эти биты с битрейтом 8 МГц последовательно выходят с ножки MISO.

Но кроме формирования видеосигнала, МК должен успевать реагировать на команды процессора (запись и чтение значений из адресного пространства устройств). Этот же МК будет загружать в ОЗУ код монитора, хотя можно и ПЗУ разместить. Микросхемы ОЗУ и ПЗУ очень просто соединять проводниками. Всмысле все дорожки между ними будут параллельны.

kovdry
16.12.2011, 09:17
Если так, то надо стараться засунуть РК в один AVR.
Например, как здесь http://pmd85.topindex.sk/
В этом случае меньше согласований между микросхемами нужно делать

vinxru
16.12.2011, 09:31
Если так, то надо стараться засунуть РК в один AVR.
Например, как здесь http://pmd85.topindex.sk/
В этом случае меньше согласований между микросхемами нужно делать

Тогда это будет обычный программный эмулятор компьютера РК86, только написанный для AVR.

ivagor
22.01.2014, 14:09
b2m, в сорцах твоей реализации РК на DE1 лежит SDRAM_Controller.v, но он, насколько я понял, не используется. Файлик случайно туда попал или у тебя есть версия РК использующая SDRAM?

b2m
22.01.2014, 19:22
Файлик попал случайно, но версия, использующая SDRAM была (временно), и вроде даже работала без сбоев.

ivagor
22.01.2014, 19:59
версия, использующая SDRAM была (временно)
Её не осталось? Если вдруг осталась, может выложишь?

b2m
22.01.2014, 23:30
Не, не осталось, я прямо в рабочем проекте попробовал, потом убрал. Слишком уж простой контроллер, на чтение/запись уходит много тактов. Для РК не критично, он всё равно 1 такт работает, 24 простаивает. А для реального применения - малопригодно.

tnt23
23.01.2014, 10:51
ivagor, у меня в амижном проекте SDRAM контроллер вполне работающий

https://code.google.com/p/z3sdram/source/browse/sdram_controller.v

Выглядит страшновато, но на самом деле он хороший :)

ivagor
23.01.2014, 12:19
tnt23, спасибо, но для меня это слишком страшновато. b2mу спасибо за случайно забытый контроллер, он у меня даже почти заработал.

b2m
23.01.2014, 17:42
случайно забытый контроллер, он у меня даже почти заработал.
Очень интересно. Расскажешь подробнее? :)

ivagor
23.01.2014, 17:52
Несколько стыдно рассказывать, но я попробую. На данный момент затыка в доступе к SDRAMине по чтению проца и видео.
Если процу не давать читать
.rd(vid_rd),
то изображение нормальное.
Если ему дать читать
.rd(vid_rd ? 1'b1 : cpu_rd&(!addrbus[15])),
то изображение скачет. Тем не менее, можно разобрать, что на директивы монитора реагирует. Например заполнил область значением, потом вывел дамп - все работает как должно.

b2m
23.01.2014, 18:47
Ты мой проект что-ли копаешь? Я думал что-то своё мастыришь.
А я, кстати, только первые 16Кб на SDRAM подменял, т.к. в процессе отладки хотелось, что-бы РК-шка работала, а там уже в мониторе смотреть, как SDRAM выглядит. Поэтому у меня таких проблем не было.

Тут надо синхронизацию переделывать, а то процессор 1 раз в примерно 25 тактов обращается, а видео - ровно 1 раз в 24 такта. И эти обращения никак не синхронизированы. Надо скорректировать запросы путём задержки, пока они не попадут в своё "окно". Точнее, достаточно cpu_ce задерживать, если было обращение от видео.

ivagor
23.01.2014, 19:36
Если еще буду копать, то оставлю нижние 16 Кб в SDRAM, а верхние надо затолкать в ПЛИС, у меня уже сегодня такая мысль появлялась. А до этого думал РК до 16 Кб урезать и все ОЗУ в ПЛИСине.

ivagor
23.01.2014, 23:25
оставлю нижние 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 ----------

С питоном разобрался. Не знал, что на РК были игрушки, которые меняли адрес экранной области.

b2m
24.01.2014, 01:33
Пользуясь случаем, хочу передать
Не стреляйте в пианиста, он играет как умеет. :)

Просто времянки надо в проекте учитывать. Ты бы лучше попытался разобраться, как заставить работать SRAM. Времени-то там дофига, процессору вообще по барабану, что память чуть медленнее, он всё равно за 3 цикла (по 25 тактов) читает/пишет. А вот в ВТ57 можно попытаться добавить ещё 1-2 состояния, чтобы запрос на чтение на 1-2 такта дольше был.

ivagor
24.01.2014, 09:43
Ты бы лучше попытался разобраться, как заставить работать 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 и обращается к ней только проц.
Надо бы еще наверно что-то вроде теста ОЗУ наваять, но очень похоже, что все работает.

b2m
24.01.2014, 15:32
Только это вариант с раздельным доступом, переделанный из SDRAM, т.е. SRAM по адресам 0-3FFF и обращается к ней только проц.
Надо бы еще наверно что-то вроде теста ОЗУ наваять, но очень похоже, что все работает.
А если взять мой проект, и просто перенести 4000-7FFF внутрь ПЛИС, то ведь тоже должно работать? Тогда ведь к SRAM будет только процессор обращаться, а он делает это достаточно долго.

Я вот думаю, если HOLD/HLDA номально реализовать, в том числе и в процессоре, то должно работать даже с памятью, которая хоть в 10 раз медленнее. Т.е. проблема не в железе, а в исходниках проекта. Другое дело, что мой проект не единственный, который рассчитывает на быструю SRAM. Ты пробовал запускать Вектор,БК,Корвет,MSX?

ivagor
24.01.2014, 18:00
А если взять мой проект, и просто перенести 4000-7FFF внутрь ПЛИС, то ведь тоже должно работать?
Я так и сделал :) Как раз это позволило мне спокойно организовать работу с SDRAM а потом со SRAM по адресам 0000-3FFF. Меня только одно смущает - неужели я так невнятно пишу, что даже ты не понял :)



Другое дело, что мой проект не единственный, который рассчитывает на быструю SRAM. Ты пробовал запускать Вектор,БК,Корвет,MSX?
Твой проект как раз в том ряду, который полагается на простой доступ к SRAM и не работает на новых DE1 с той самой "новой" SRAM (формальные отличия во времянках небольшие, сам я думаю, что основная проблема в том, что она с ECC). Проблемы с этой сраминой не только у меня, читал про это и на буржуинских форумах. Не работают вектор (я долго доставал svofski на эту тему), БК, спектрум, Б2М. Вернее степень неработоспособности разная - что-то вобще не работает, что-то частично работает. MSX завелся с полоборота, т.к. использует SDRAM.
Т.е. РК - это второй ретрокомп, который у меня заработал (но только после доработки напильником).



Я вот думаю, если HOLD/HLDA номально реализовать, в том числе и в процессоре, то должно работать даже с памятью, которая хоть в 10 раз медленнее.
Про это я ничего сейчас не могу сказать. Четкий доступ к моей SRAMине, как я уже написал, получился после разделения обращения на 2 этапа - в первом такте выставляем адрес и управляющие сигналы, во втором читаем или пишем. Т.е. проблема, конечно, не в скорости, а в том, что нужно все делать аккуратно.

b2m
24.01.2014, 18:39
неужели я так невнятно пишу, что даже ты не понял
Я имел ввиду: не трогать ту часть, которая работает с SRAM (ты, как я понял, дополнительный контроллер для SRAM сделал). Только добавить новое устройство по адресам 4000-7FFF вместо SRAM.


Четкий доступ к моей SRAMине, как я уже написал, получился после разделения обращения на 2 этапа - в первом такте выставляем адрес и управляющие сигналы, во втором читаем или пишем.
Чтение по-любому обычно так и делается. А вот при записи надо бы откладывать сигнал активации записи на второй такт и снимать его в третьем, т.к. SRAM тут асинхронный, и если сигнал записи прийдёт раньше чем изменится шина адреса, то запись произойдёт не туда, куда надо.

Другой вариант: попробуй ничего не менять, кроме одного - простробировать сигнал записи глобальным клоком:

assign SRAM_WE_N = vid_rd|cpu_wr_n|addrbus[15]|hlda|clk50mhz;

SRAM_WE_N будет полклока в длинну (надеюсь его хватит), и будет активироваться через полклока после того, как всё остальное начнёт меняться.

ivagor
24.01.2014, 19:14
Я имел ввиду: не трогать ту часть, которая работает с 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 кое-что могут запускать и с видео и со звуком).

ivagor
25.01.2014, 17:55
будет ли версия полностью на SDRAM
В смысле и без ОЗУ внутри ПЛИС? Наверняка будет, только пока непонятно, кто ее первым сделает :) Сегодня я без DE1, надумал многаидей, завтра может хоть что-то заработает. Правда у меня SDRAM сейчас не на первом месте.
По поводу исходников - в соответствии с моими нулевыми знаниями и мои вставки в исходники b2m или очевидные или непотребные. Тем не менее, если неожиданно "полный SDRAM" заработает, то я, наверно, ключевой фрагмент прямо сюда запощу, или ссылку на него.

ivagor
25.01.2014, 19:31
В смысле совсем без SRAM, как бы ее и нет совсем!) а уж будет ли часть внутри плис или нет - это второй вопрос.
Тогда такой вариант уже есть, но при модификации исходника b2m мозг я практически не использовал:
1. С помощью визарда создал блок двухпортового ОЗУ в ПЛИСине. Прописал обращение в головном файле по адресам 4000-7FFF. Один порт - читает видеоконтроллер, второй - читает и пишет проц. Уже можно запустить и проверить работу директив монитора.
2. Прописал обращение к контроллеру SDRAM, забытому b2mом, по адресам 0000-3FFF. Доступ имеет только проц. Это несколько уменьшает совместимость, т.к. есть программы, которые меняют адрес ВидеоОЗУ в первую половину. Но вроде их мало.

Про "полный SDRAM" напишу, если получится. Если b2m или кто-то еще сделает раньше - с интересом посмотрю.

ivagor
25.01.2014, 21:14
Если b2m не против (лицензию не читал, каюсь), то я завтра могу прислать измененный главный файл исходника и .sof.


DE1 глЮчит
Маркировка SRAM случайно не

IS61WV25616EDBLL
?

b2m
25.01.2014, 21:26
Маркировка SRAM случайно не
Там ещё важно, что после минуса стоит. Это, судя по даташиту, время доступа в наносекундах. Есть -8,-10,-20.

ivagor
25.01.2014, 21:30
-10TLI, это я по памяти

b2m
25.01.2014, 21:37
У меня тоже 10нс.

ivagor
25.01.2014, 21:39
но у тебя наверно 61LV25616AL

b2m
25.01.2014, 21:39
Угу.

b2m
26.01.2014, 00:33
Случайно не, но почти такая же - IS61WV25616BLL-10TL, ну т.е. без ED в середине.
вряд ли она отличается сильно.
Не поленился, взял лупу и посмотрел ещё раз: у меня точно такая-же!

ivagor
26.01.2014, 07:00
Случайно не, но почти такая же - IS61WV25616BLL-10TL, ну т.е. без ED в середине.
вряд ли она отличается сильно.
Принципиальное отличие ED - она с ECC. Продолжаю пропагандировать идею, что причина неработоспособности проектов, использующих "простой" (неаккуратный) доступ к SRAM именно в этом.


буду ждать
Выслал.

b2m
26.01.2014, 16:06
"простой" (неаккуратный) доступ к SRAM
Будем искоренять :)

ivagor
27.01.2014, 14:49
zebest, поздравляю!

Побаловался СпиналТапом, основные моменты стали понятны, но запустить стабильный SDRAM only так и не смог.
Также спиналтап помог увидеть, что доступ к SRAM (в проекте SRAM+internal RAM) у меня реально не 2 такта, а группами по несколько доступов по 2 такта, т.к. сигналы чтения и записи от процессора длинные. Этот странный вариант работает хорошо.
Попытался организовать другой контроллер, который читал или писал бы один раз на каждое обращение проца. По спиналтапу все ОК, а стабильной работы не получается.

vlad
27.01.2014, 15:03
Запущено в минимальном варианте, без звука и без SD-карты, в Speccy2010 SD подключена через свой контроллер, для меня это еще сложно, если не сказать невозможно, так что только монитор, программы загрузить не могу, увы и ах.
Про то, что такое использование микроконтроллера существенно усложняет разработку и ограничивает разработчика уже предупреждали. Проблема частично решается с помощью специально разработанной библиотеки процедур для МК под разные задачи со стороны FPGA.

ivagor
28.01.2014, 10:37
Как я уже писал (а потом стер) - пошел по пути наименьшего сопротивления и переделал 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 переделать.

ivagor
30.01.2014, 19:55
b2m, если не сложно, запусти вот этот тестик (http://zx-pk.ru/showpost.php?p=615016&postcount=177). В покореженных мною вариантах между прогонами гаснет экран, а как в твоем оригинальном варианте? В emu экран не гаснет.

Еще познавательный вопрос, не относящийся к реализации в ПЛИС. xonix, приложенный к эмулятору, показывает 30 строк. Если по 10 точек, то это 300 ТВ линий, не многовато ли? Насколько помню, по стандарту не более 288 активных строк.

b2m
30.01.2014, 20:23
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 линий. Их роль выполняют пустые строки.

ivagor
30.01.2014, 20:56
У меня DE1 подключена к ТВ/монитору с VGAшным входом, так он не показывал все строки, пока в rk_video.v не поменял 625 на 660. Частота кадров, конечно, немного уменьшилась, но все равно для РК это ни на что не влияет.

b2m
31.01.2014, 10:33
У меня DE1 подключена к ТВ/монитору с VGAшным входом, так он не показывал все строки
Так и задумано. Слева и справа тоже не все символы показываются.

ivagor
31.01.2014, 14:19
Может ли быть активен hlda не во время чтения группы символов для видеоконтроллера?

b2m
31.01.2014, 15:06
Может ли быть активен hlda не во время чтения группы символов для видеоконтроллера?
Если это вопрос по оригинальной схемотехнике 86РК, то скорее всего - нет. hlda активируется по окончании цикла в ответ на присутствие hold, а тот, в свою очередь, генерируется только контроллером ПДП.

Нет, если конечно настроить ВТ57 на чтение или запись по каналу 0 или 1, то hold активируется, но какой в этом смысл?

---------- Post added at 16:06 ---------- Previous post was at 16:05 ----------

А вот нет, фиг вам, drq для других каналов заземлены.

ivagor
31.01.2014, 15:52
Вопрос был по реализации РК на ПЛИСе.
Т.е., если я правильно понял, в текущей плисовой реализации hlda активизируется только на время чтения группы символов видеоконтроллером.

ivagor
31.01.2014, 17:56
b2m, вопросы по твоей реализации ВМ80.
Насколько я понял cpu_rd и cpu_wr_n длятся "от ce до ce".
Чтение происходит по заднему фронту cpu_rd?
При записи в каком такте выставляются данные?

b2m
31.01.2014, 18:38
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. возвращаем сигнал записи от процессора

ivagor
31.01.2014, 20:17
когда видеовывод читает SRAM во втором такте цикла записи
Тем более не обязательно SRAM и не обязательно во втором.
Ты не поверишь, но я уже и сам допер, почему у меня проблемы с вариантами SRAM only и SDRAM only. Общую идею арбитра я придумал, может к воскресенью (завтра без DE1) на верилог смогу переложить.

---------- Post added at 22:16 ---------- Previous post was at 20:48 ----------

Заработал SDRAM only (контроллер SRAM у меня аналогичный, только состояний меньше, т.ч. тоже должен работать). Торопился и сделал очень коряво, выкладывать такое не буду, ну и потестировать еще надо. Погонял xonixa, spitona, свой тестик памяти, сейчас поставил тест памяти DDp.

ivagor
01.02.2014, 07:02
Версия с SDRAMом работает, но надо реализацию сделать менее детсадовскую.


ВГ75 поправить
Я даже не знал, что там что-то не так. А в чем с ней проблема?

ivagor
01.02.2014, 14:11
Насчет ВГ75 и других 580ых - это к b2mу. Мне бы Вектор и Б2М (ну может еще Львов) у себя запустить.

ivagor
03.02.2014, 21:59
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
03.09.2014, 17:41
Если можно, 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-файлов я особо не вижу в архиве.

b2m
03.09.2014, 22:03
А какая частота 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.

Ewgeny7
03.09.2014, 22:08
Если кому интересно - выложил свой порт РК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-интерфейс с софтом, а также бессовестно получил и использовал несколько советов от него же :)
Мне нужен был РК именно для ТВ, посему и пришлось сдуль пыль с Квартуса...

А не поделитесь ли кусочком исходников формирования ТВ сигнала? Буду премного благодарен :)

Ewgeny7
03.09.2014, 22:47
А не поделитесь ли кусочком исходников формирования ТВ сигнала?
Именно для этого РК, где Черт ногу сломит в коде благодаря "чудесному" симулированию ВГ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 :)

svofski
04.09.2014, 14:36
640x480 -- это "логический" размер. VGA-шный сигнал аналоговый и пикселей в нем нет. Если модулировать луч два раза на строку, будет 2 пикселя в строке, если 1000 -- будет 1000.

HardWareMan
04.09.2014, 15:17
640x480 -- это "логический" размер. VGA-шный сигнал аналоговый и пикселей в нем нет. Если модулировать луч два раза на строку, будет 2 пикселя в строке, если 1000 -- будет 1000.
Это все справедливо для ЭЛТ моников. Для LCD следует придерживаться некоторых правил. 384х250 отлично вписывается в 800х600 при минимально возможном бордюре. Этот режим используется в эмулях в полноэкранном режиме и в моем МХ2.

b2m
04.09.2014, 16:33
где курить параметры развертки для 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. Сколько это в точках линии и количествах строк - непонятно, и непонятно в какой момент этот синхроимпульс должен включаться и отключаться. Просветите, плз!

b2m
04.09.2014, 20:00
Остался вопрос с началом и концом ССИ и КСИ.
Согласно табличке, длительность горизонтального синхроимпульса должна составлять 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...

b2m
05.09.2014, 14:23
Мы имеем всего 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) ?

b2m
05.09.2014, 14:38
А можно уточнить, каким образом формируется сигнал cce для ВГ75 ? я так понимаю, он должен сработать перед началом получения следующего знакоместа? Т.е. мы этот сигнал формируем каждые 6 точек ?
Да, d_cnt счётчик точек от 0 до 5. cce это просто клок для ВГ75.


И еще - а разве строчный СИ не формируется где-то в момент гасящих сигналов? (где-то в момент с 1 по 8 знакоместо или с 72 по 78) ?
Нет, ВГ75 тупо выдаёт считанные 78 символов, затем ССИ длиной в заданное число знакомест. Поэтому экран РК-шки с дырками (гашение для ТВ).

andykarpov
05.09.2014, 15:17
Нет, ВГ75 тупо выдаёт считанные 78 символов, затем ССИ длиной в заданное число знакомест. Поэтому экран РК-шки с дырками (гашение для ТВ).

Спасибо! А еще вопросик: а о КСИ такая же фигня ? 300 строк + сколько-то строк на СИ?

b2m
05.09.2014, 18:33
а о КСИ такая же фигня ? 300 строк + сколько-то строк на СИ?
Да, монитор РК-шки программирует 1 знакоряд на КСИ, т.е. 10 строк. Итого получается 310 строк, хотя телевизионный стандарт - 312,5.

andykarpov
05.09.2014, 19:14
Получается да, интересно. Это мы при количестве строк 625 получается 2 раза успеваем один и тот же фрейм вывести ???

Ewgeny7
05.09.2014, 21:01
Мы выводим фрейм не два раза, а каждую строку два раза подряд. Это и есть принцип скандаблера, когда ТВ-развертка превращается в "приближенную к VGA". Так работает VGA-конвертер от zst, так же сделаны некоторые конфигурации ретро-компов для плат uX-Reverse.
Т.е. мы удваиваем пиксельный клок и выводим строки по два раза, и ТВ превращается в ВГА :)

HardWareMan
05.09.2014, 21:27
Мы выводим фрейм не два раза, а каждую строку два раза подряд. Это и есть принцип скандаблера, когда ТВ-развертка превращается в "приближенную к VGA". Так работает VGA-конвертер от zst, так же сделаны некоторые конфигурации ретро-компов для плат uX-Reverse.
Т.е. мы удваиваем пиксельный клок и выводим строки по два раза, и ТВ превращается в ВГА :)
Так же сделано в МХ2. Только я наоборот поделил пиксельклок SVGA режима на 2, чтобы они дублировались.

Ewgeny7
05.09.2014, 21:53
Чем мне нравится такой метод - мы не только делаем комп "религиозно натуральней", но и получаем по сути два режима видеовывода, которые можно тупо переключать по желанию. Я так делал для конфига KAY-1024, к примеру. Сам конфиг генерирует ТВ-развертку, а сразу за этим модуль скандаблера записывает выводимый сигнал в две "строчки памяти" и выдает их поочередно с удвоенной частотой. Пока одна "строчка" заполняется данными, вторая успевает как раз два раза вывестись на экран. Ресурсов это отнимает совсем немного.

HardWareMan
06.09.2014, 05:00
Такой скандаблер и в отдельном устройстве дешевле, т.к. не надо хранить весь кадр. Вот только с фреймрейтом пролетаем, если 60Гц. Если взять нестандартную развертку с 50Гц, тогда было бы вообще кошерно, но не все моники ее держат. CRT держали не все, а про LCD вообще молчу.

Ewgeny7
06.09.2014, 21:33
Вот только с фреймрейтом пролетаем, если 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 со всеми известными мне оригинальными копирайтами и ссылками на связанные с проектом статьи / обсуждения / фото.
Если кого обидел - дайте знать, плз.

b2m
05.05.2015, 09:34
Нет повышенной яркости, ..., в сравнении с Вашим же эмулятором.
А вот не надо сравнивать с эмулятором :) Стандартная 86РК не имеет повышенной яркости. Соответственно программы для РК не используют эту фичу и выглядят вполне нормально и в эмуляторе. В эмуляторе я сделел эту фичу как-бы "на будущее", чтобы проверить работу всех атрибутов. Я просто "забыл" убрать соответсвующую строчку в конфиге.

Saar
15.02.2016, 14:42
вопрос по поводу ВГ75:
если включен режим невидимых аттрибутов, то позиции сдвигаются в пределах строки или всё же всей оставшейся части экрана?

b2m
15.02.2016, 23:22
Зависит от того, стоит ли в конце строки код остановки чтения из памяти (ПДП).

LED
21.09.2017, 01:38
На какой стадии проект?
Я так понял проблемы начались после приколачивания VGA ?
А как устройство в остальном? Порты, слоты расширения, или вы большую часть функционала хотите впихнуть в ПЛИС, а оно туда влезет?

IgorR76
06.10.2018, 05:51
Прошел квест с запуском проекта от b2m и ivagor с sdram на плате Unamiga. Переделал видеовыход под стандартный композит, тк есть мониторчик 7" для этого, и заменил sd карту на mmc (не работала с biossd), тк она есть, а sd маленького объема нет и уже купить сложно. Получил удовольствие, будто попал в прошлое. За что большой респект в Уфу авторам! Проект рабочий, простой в повторении и модификации. Рекомендую.