PDA

Просмотр полной версии : ЮТ-88: Реализация на ПЛИС (DE1)



Santechnik
21.11.2010, 04:11
В процессе создания Радио-86РК на ПЛИС я столкнулся с большим количеством вопросов из-за недостатка опыта. Кроме того, с июля по октябрь я не имел возможности этим заниматься из-за отсутствия свободного времени. Так что 3 недели назад, когда у меня наконец появилось свободное время, я решил отложить проект Радио-86РК и потренироваться на чем-то более простом. Отработать там некоторые решения и поэкспериментировать. В качестве кошки был выбран ЮТ-88, который очень хорошо документирован, позволяет собирать его поблочно и таким образом легче решать проблемы и видеть результат. Так как DE1 не имеет клавиатуры и достаточное количество индикаторов, то я быстренько спаял плату расширения и повесил ее на GPIO_1. Т.к. оставались свободные пины на плате расширения для возможного использования и экспериментов также были сделаны магнитофонный вход/выход, видео выход и пищалка. Из всего этого испытан был только магнитофонный выход. Остальное не проверялось и возможно не работает ;)
На данный момент компьютер прекрасно работает в минимальной конфигурации. Туда добавлен ПЗУ с арифметическими функциями. Кроме того, я прилепил еще одно ПЗУ со всеми 3 программами, чтобы не загружать их каждый раз (адреса 1000 - 13FF). Магнитофонный ввод/вывод сделан через аудио-разъемы на DE1 путем выдирания соответствующего блока из Вектора уважаемого svofski. Скорее всего выдрано и что-то лишнее, но работает отлично, поэтому разбираться детальнее буду позже.
Дисплейный модуль работает, но есть шероховатости. Вывод сделан правильным VGA 800x600 60hz путем удвоения точек по вертикали и горизонтали. Из шероховатостей: очень небольшое количество снега из-за распределения приоритетов чтения экранного ОЗУ и неровный край белого у курсора и инвертированных символов. Пока глубоко с этими проблемами не разбирался, т.к. они не мешают.
Клавиатура PS2 работает, но кривовато. Есть глюки, и пока не реализован РУС/ЛАТ, а также УС и СС. Я использовал PS2 core из сети. Возможно оно не очень удачное - попробую прикрутить от Вектора и посмотреть на разницу.
В планах довести до ума клавиатуру (ну и дисплей), добавить индикацию 7-ми сегментных индикаторов с платы расширения в верхней части дисплея (на свободном поле) и использовать цифровую клавиатуру PS2 вместо кейпада на GPIO_1, чтобы желающим попробовать комп не надо было паять плату расширения. Ну и само собой добавить 64К ОЗУ и 256К квазидиск на SRAM.
Пока так. Парочку фоток прилагаю. ;)

UPDATE: Проект полностью закончен. Ознакомиться можно на сайте проекта: http://ut88.hut1.ru.
UPDATE #2: Так как выбранный бесплатный хостер вставляет рекламу так, что многие ссылки перестают работать, то теперь вся информация по этому проекту перемещена в мной созданный блог http://electronicsfun.net (http://electronicsfun.net/RU).

sergey2b
21.11.2010, 09:35
выложите пожалуйста проект

Santechnik
21.11.2010, 10:30
Сергей, пока еще он слишком сырой для этого: достаточно большое количество лишнего кода, который я использовал для экспериментов, недостаток комментариев, некоторые места написаны "в лоб" и их хотелось бы "причесать" перед публикацией, пока еще плоховато работающая клава, только 5Кб памяти, необходимость пайки платы расширения для запуска. Да и svofski все же надо сначала спросить если он не против использования этих блоков от его Вектора в этом проекте.
Я собираюсь опубликовать проект, но чуть позже. Может быть даже сразу как только до конца разберусь с клавиатурой.
И еще - со мной можно на "ты" :v2_cheer:

Ewgeny7
21.11.2010, 13:10
Santechnik, клёвая платка расширения получилась! :)

Santechnik
21.11.2010, 14:52
Ewgeny7, спасибо :) Самому понравилась. Минимум усилий и имеем дополнительные 6 индикаторов, 16 кнопок и пищалку (может быть, если она работает :rolleyes:) Вполне пригодится и для других экспериментов :v2_thumb:

Santechnik
28.11.2010, 09:57
Как я могу быть против, если у меня русским по-английскому написано, что использовать можно и нужно везде, где только получится =)

А я пока не разбирался и не читал - просто воткнул и работает :rolleyes: Но здорово, что можно использовать, спасибо :v2_thumb:


Проще всего не "выкладывать проект", а сразу хостить его там, откуда его заинтересованные люди смогут брать текущее состояние. Это на личное усмотрение автора, конечно.

Без проблем. Расскажи как и сделаю. Или ссылку дай где почитать, как делать. Мне все равно как публиковать.


P.S. Santechnik — отличный проект, так держать! =)

Спасибо!

Итак докладываю, что было сделано за неделю:
1) Улучшил вывод на дисплей. Теперь курсор ровный и без мерцания. Так же убрал совсем снег при статической картинке. Мелкая казалось бы проблема, а пришлось переделать весь комп с начала. Все было из-за того, что все синхронизировалось по 16 Мгц, а дисплей по 20 Мгц. Так что перевел все на 20 сейчас. Заодно причесал код и добавил комментов. Зато урок - не мешать клоки :v2_blush: Правда теперь почему-то возникла проблема с магнитофонным выходом - пока пришлось отключить, т.к. с ним вообще комп не пашет. Буду разбираться.
2) Добавил вывод индикаторов на дисплей. Можно отключать выключателем на плате (SW[0]).
3) Убрал глюки клавиатуры. Работает нормально. Русская раскладка, правда, сделана по подобию оригинала, т.е. Я=Q, Г=G и т.д. Мне удобно, потому что у меня клава PS/2 без русских букв, так что получается как транслатиница ;) Но вообще в планах сделать второй режим - классический. Сейчас собираюсь сделать режим кейпада и тогда можно будет запускать проект на любой DE1 без пайки платы расширения.

Теперь вопросы знатокам: :)

1) При записи в ОЗУ дисплея (например при скроллинге) появляется снег. Это из-за того, что приоритет обращения к ОЗУ отдается процессору и дисплейный модуль не может прочитать. Если я правильно разобрался со схемой точно такое же поведение должно быть и у оригинала. Так?

2) Курсор отображается на 1 позицию правее того места, куда ожидается ввод символа. В эмуляторе emu он выводится точно на месте вводимого символа. Как выводит реальный комп?

А пока вот еще одна фотка:

b2m
28.11.2010, 13:49
Правда теперь почему-то возникла проблема с магнитофонным выходом - пока пришлось отключить, т.к. с ним вообще комп не пашет.
Проблема, скорее всего, не в магнитофонном выходе. Просто с ним fitter по другому раскладывает LE, и какие-то сигналы при новом раскладе "устаканиваются" не в той последовательности, которая тебя устраивает. При правильном дизайне не должно быть зависимости от времени распространения сигнала от выходов ко входам. Попробуй порисовать тайминги с учётом того, что сигналы могут меняться с разной скоростью в течение такта. И не забывай, что SRAM, например, асинхронный.


1) При записи в ОЗУ дисплея (например при скроллинге) появляется снег. Это из-за того, что приоритет обращения к ОЗУ отдается процессору и дисплейный модуль не может прочитать. Если я правильно разобрался со схемой точно такое же поведение должно быть и у оригинала. Так?
Видимо так. По крайней мере, в схеме нет узла торможения процессора при коллизии с видеовыводом.


2) Курсор отображается на 1 позицию правее того места, куда ожидается ввод символа. В эмуляторе emu он выводится точно на месте вводимого символа. Как выводит реальный комп?
Скорее всего также, как и у меня в эмуляторе. Сигнал инверсии идёт сразу с выхода ОЗУ, а точки шрифта задерживаются на один символ, т.к. нужно время на выборку из ПЗУ знакогенератора.

Santechnik
28.11.2010, 14:17
Проблема, скорее всего, не в магнитофонном выходе. Просто с ним fitter по другому раскладывает LE, и какие-то сигналы при новом раскладе "устаканиваются" не в той последовательности, которая тебя устраивает.

Что-то такое я уже начал подозревать, потому что в отключенном блоке всего несколько строк и они абсолютно прозрачны. А как его заставить раскладывать по другому?

svofski
28.11.2010, 15:24
Вряд ли можно с уверенностью заставить раскладывать рыхлый проект каким-то определенным образом.

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

Еще может быть, что не все выходные сигналы в case-ах полностью определены -- это тоже, бывает, приводит к проблемам, которые поначалу хочется списать на судьбу и космические лучи.

b2m
28.11.2010, 16:08
Бывает, напишешь чего-нибудь эдакое, оно как будто работает. А потом оказывается, что работало все на гонках и при пересборке все распределилось иначе и не работает уже ничего.
Это точно. Меняешь в одном месте, а не работает в другом. :)


тоже, бывает, приводит к проблемам, которые поначалу хочется списать на судьбу и космические лучи.
И ведь понимаешь, что сам виноват, но сделать с этим чувством ничего не можешь :)

Ewgeny7
28.11.2010, 16:33
Привязываешь всё, что только можно к системному клоку, потом можно поиграться фазой клока. Обычно помогает :)

---------- Post added at 16:33 ---------- Previous post was at 16:32 ----------


Добавил вывод индикаторов на дисплей.
Вот это замечательная идея. Можно дебаггер на этом принципе сделать. Использую идею с вашего разрешения :)

Santechnik
29.11.2010, 10:49
Вот это замечательная идея. Можно дебаггер на этом принципе сделать. Использую идею с вашего разрешения

Дарю ;)

А вот еще вопрос: я на кактусе 9.1 сейчас все делаю. Стоит 10-тку качнуть? Какие у нее преимущества? Может она аккуратнее собирает?

b2m
29.11.2010, 11:33
Качал я десятку. Они жутко переделали интерфейс, мне он не понравился, и я не стал разбираться - просто снёс и вернул девятку. Но это на любителя. Я просто привык к девятке, хоть у неё и есть один глючёк: в 9.1 SP2 есть ошибка формирования файла .pof, приходится консольной утилитой его из .sof конвертировать.

---------- Post added at 13:33 ---------- Previous post was at 13:23 ----------

А собирает она, вроде, чуть-чуть оптимальнее в плане распределения логических элементов: соединения получаются короче, и как следствие, меньшее время распространения сигнала от выходов ко входам. У меня, правда, проект сразу перестал работать, это навело меня на мысль, что я что-то неправильно делаю, и я кое-что переделал (это как у тебя с магнитофонным интерфейсом, просто неправильно было), однако к тому времени десятку уже снёс и проверить уже нельзя было. Так что, как говорится, ложечки-то мы нашли, а осадочек остался :)

svofski
29.11.2010, 11:41
Говорят, что в 10-ке больше нету классического симулятора и сигналтапа?

b2m
29.11.2010, 11:49
Я слишком быстро снёс десятку, так что ничего не могу сказать :)
Во время компиляции, если используешь Classic Timing Analyse, это уже warning. Во как.

Santechnik
29.11.2010, 13:15
Спасибо за советы - все завелось. Не знаю что помогло - один case был "открытый" и один процесс не привязан был к клоку. Десяточку наверное попозже все же качну для интереса. Она ведь при установке девятку не удаляет?

А программы вообще существуют какие-нибудь для этого компа, кроме Тетриса? Я в инете ничего не смог найти.

b2m
29.11.2010, 13:44
Вот (http://emu80.org/files/um_1.zip), например.

---------- Post added at 15:44 ---------- Previous post was at 15:40 ----------

Но, вобщем, да, нету больше :)

Santechnik
02.12.2010, 13:30
Скорее всего также, как и у меня в эмуляторе. Сигнал инверсии идёт сразу с выхода ОЗУ, а точки шрифта задерживаются на один символ, т.к. нужно время на выборку из ПЗУ знакогенератора.

Поразбирался я с этим. Все же мне кажется, что у меня правильно. Не должно задерживаться. По схеме знакогенератор дает текущий символ по тому же адресу что и ОЗУ и DD11 просто его перебирает по точкам.
Если я записываю A0 (это фактически "пробел" с флагом инверсии в старшем бите) по адресу Е800 (т.е. первый символ экранного ОЗУ) то я вижу белый квадрат в самом верхнем левом углу. Т.е. инверсия отображается правильно точно по записанному адресу.
У тебя же в эмуляторе при записи того же байта в тот же адрес ничего не отображается, а отображается если записать А0 по адресу Е801.

Кстати, у Пыхонина в эмуляторе картинка как у меня.

Лучше всего владельца оригинала найти и спросить, конечно.

Кстати, в твоем эмуляторе можно как-нибудь загрузить обычный bin файл? А то не хочется набивать :)

b2m
02.12.2010, 15:21
Не должно задерживаться. По схеме знакогенератор дает текущий символ по тому же адресу что и ОЗУ и DD11 просто его перебирает по точкам.
Нет, там после записи в сдвигающий регистр (сигнал SL формируется как И старших битов счётчика на 12) на следующем такте идёт увеличение адреса (параллельно с изменением на выходах сдвигающего регистра). Таким образом гарантируется, что ПЗУ успеет выбрать байт, однако сигнал инверсии будет браться уже из следующего байта.


Кстати, в твоем эмуляторе можно как-нибудь загрузить обычный bin файл? А то не хочется набивать :)
В меню есть "Start debugger", а в отладчике есть загрузка по Ctrl+L. Полный список клавиш выдаётся по F1.

Santechnik
05.12.2010, 03:47
Итак, очередной отчет за неделю :)
1) Изменен вывод инвертированных символов (курсора) как советовал b2m.
2) Добавлено 64К памяти на SRAM.
3) Добавлена возможность ввода с PS/2 клавиатуры при работе в минимальной конфигурации. Т.е. теперь, имея эту возможность, плюс дублирование 7-ми сегментных индикаторов на мониторе, можно запускать компьютер без платы расширения.
4) Сделан квазидиск 256К на SRAM. Но не могу пока убедиться в правильности его работы. СР/М загружается успешно и пишет "DISK RAM - 256K" при загрузке. Могу создавать файлы и удалять их. Для полноценного тестирования хотелось бы записать туда программы и погонять.

Таким образом на данном этапе компьютер практически готов. Осталось только закончить тестирование квазидиска и я выложу проект.

Можно подумать еще и о подключении SD карты, но пока я даже не представляю как это сделать. Надо поразбираться. В любом случае это будет после публикации основной версии и вычищения ошибок если таковые там будут обнаружены.

А сейчас традиционные вопросы :) . Сегодня только один :)
- Как мне загрузить СН.СОМ в СР/М? В журнале они пишут:

В Мониторе ЮТ-88 эта программа набирается с адреса 100Н и записывается на кассету. Предварительно загруженная операционная система СР/М перезапускается директивой “G” с адреса DA00H
Что значит предварительно загруженная? Если я просто загружаю ее в адрес 3100 с "магнитофона" и запускаю с указанного адреса DA00, то выводится заголовок СPM V - 2.2 DISK RAM - 256K, но нет приглашения A> и система висит. Запущенная же как положено с адреса 3100 она похоже удаляет содержимое адресов 100-3FF куда была загружена программа CH.COM.

b2m
05.12.2010, 11:41
Запущенная же как положено с адреса 3100 она похоже удаляет содержимое адресов 100-3FF куда была загружена программа CH.COM.
Вот поэтому и написано "предварительно загруженная" :) Я бы так сделал:
1. загрузил CP/M и запустил как положено с адреса 3100
2. нажал сброс
3. загрузил CH.COM
4. запустил CP/M с адреса DA00 (это холодный старт CP/M)

L Juriy
05.12.2010, 14:22
Santechnik,
1 Загружаешь СРМ в адрес 3100 и запускаешь ее.
2 Выходишь в монитор и грузишь с магнитофона СН.СОМ в 100 адрес
3 Запускаешь СРМ с адреса DA00
Дальше по инстукции сахраняешь её командой SAVE
Вроде как то так

Santechnik
13.12.2010, 14:10
Спсибо всем за совет по запуску CP/M. Все заработало. Только вот квази-диск не работает. Видимо я неправильно понял логику его работы. Буду разбираться дальше. Только сейчас времени опять нет - новогодние/рождественские каникулы на носу и дел невпроврот - все выходные расписаны. Так что небольшая пауза пока :)
А пока вот вопрос по программному обеспечению. Там утилиты всякие в СР/М должны быть типа STAT.COM, POWER.COM и т.д. Где их взять? А то я скачал что-то из и-нета от какого-то Xerox, работать-то работает, но все надписи на "русском" (типа вместо SPACE - СПАЦЕ :D ).Какая-то кодовая таблица другая.

b2m
13.12.2010, 14:40
Это просто у ЮТ-88 вместо маленьких латинских большие русские. Собственно, в 7-битный набор больше и не влезет - либо то, либо другое. Можно в любом HEX-редакторе исправить маленькие латинские на большие :)

Santechnik
13.12.2010, 14:58
А-ааа! Понятно! ;) Ну это не долго переделать. Займусь потом. Вообще хочу наборчик таких программ на квазидиске собрать, чтобы потом через DE1 Control Panel просто образ памяти в SRAM заливать и вся система вместе с квазидиском загружена (вот еще один пункт в to do: "Прикрутить для этого интерфейс").
Ввиду "популярности" компа приделывать SD видимо бессмысленно, и квазидиска с программами должно хватить на поиграться и пощупать :)

svofski
13.12.2010, 15:04
В адаптированных биосах обычно были какие-то способы настроить монитор для работы в разных режимах: latin1 и koi7 так, что все программы могли работать без переделок -- и английские и русские. К сожалению, не могу ничего вспомнить про это, поищи документацию.

Santechnik
14.12.2010, 12:19
О! Отличная идея! Поставлю второй знакогенератор и выведу переключение на один из выключателей на борде. Где только прошивку взять, чтобы не рисовать? Может от Радио подойдет? Посмотрю попозже.

b2m
14.12.2010, 13:24
Возьми файл symgen.bin (из эмулятора Пыхонина, он-же и в моём эмуляторе лежит). Там куча разных вариантов. Посмотреть можно сделав конфиг для моего эмулятора :)



main.Caption="Test"

font : Memory {
rom="symgen.bin"
}

vid : orion-video {
plane[0][0]=font
}


Первый килобайт, по-моему, тебе как раз подойдёт (максимум, придётся инвертировать, если у тебя инвертированный знакогенератор, как в РК).

---------- Post added at 15:23 ---------- Previous post was at 15:15 ----------

А если добавить ещё и CPU:


CPU : K580wm80a {
}

то можно будет запускать отладчик, и выбрав в нём ПЗУ (по Ctrl+M), редактировать его и наблюдать изменения (после закрытия отладчика).

---------- Post added at 15:24 ---------- Previous post was at 15:23 ----------

Сохранять - Ctrl+S.

Santechnik
15.12.2010, 13:53
Спасибо, b2m! То что надо! Сегодня прикрутил по быстрому - работает как часы. Только проинвертировать предварительно файл пришлось. Зашил в 2К ПЗУ на ПЛИС вторым килобайтом, а А10 повесил на выключатель. Работы на 5 минут. :v2_thumb: Одним пунктом из todo меньше ;)

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

Santechnik
23.12.2010, 23:44
Знакогенератор подчистил. Теперь работает нормально. Не нравятся некоторые символы из новой таблицы (например $), так что в todo записал пройтись по всем основным символам и заменить их со старой таблицы если выглядят хуже.

Бьюсь с квазидиском. :v2_dizzy_wall: Видимо что-то недопонимаю в принципе его работы. Нужна помощь зала ;)

Вот такой код у меня за память и квазидиск отвечает:


process (clk20, sync_cpu) -- эмуляция контроллера памяти КР580ВК38
begin
if (clk20'event and clk20 = '0' and sync_cpu = '1') then
db_status <= d_bus_O;
end if;
end process;

mem_rd <= '1' when (sync_cpu = '0' and db_status(7) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтение из памяти
io_rd <= '1' when (sync_cpu = '0' and db_status(6) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтение из порта
mem_wr <= '1' when (sync_cpu = '0' and db_status(1) = '0' and wr_n = '0' and rd_en = '0') else '0'; -- разрешение записи в память
io_wr <= '1' when (sync_cpu = '0' and db_status(4) = '1' and wr_n = '0' and rd_en = '0') else '0'; -- разрешение записи в порт
io_stack <= '1' when (sync_cpu = '0' and db_status(2) = '1') else '0'; -- разрешение обращения к стэку

..............................
здесь вырезан неинтересный блок распределения адресов
..............................

SRAM_DQ(7 downto 0) <= d_bus_O when (ram_wr = '0' or (io_stack = '1' and wr_n = '0')) else "ZZZZZZZZ";
SRAM_WE_N <= ram_wr;
SRAM_CE_N <= '0';
SRAM_LB_N <= kvazi_block(2);
SRAM_UB_N <= not kvazi_block(2);
SRAM_OE_N <= '0';
SRAM_ADDR <= kvazi_block(1 downto 0) & a_bus;

process (clk20)
begin
if (clk20'event and clk20 = '0') then
if (io_wr = '1' and a_bus (15 downto 12) = "0100" and sync_cpu = '0') then
case d_bus_O(3 downto 0) is
when "1110" => kvazi_block <= "100"; -- если старший бит 1, то квазидиск включен
when "1101" => kvazi_block <= "101";
when "1011" => kvazi_block <= "110";
when "0111" => kvazi_block <= "111";
when OTHERS => kvazi_block <= "000";
end case;
end if;
end if;
end process;

a_bus[15..0] - адресная шина, d_bus_O[7..0] и d_bus_I[7..0] - выходная и входная шины данных. sync_cpu - сигнал SYNC процессора.

Что я недопонял? :confused:

b2m
24.12.2010, 17:06
Если используешь только половину SRAM (судя по сигналу SRAM_DQ), то маску записи байт надо сделать так:
SRAM_LB_N <= '0';
SRAM_UB_N <= '1';
А то у тебя сейчас включается квазидиск, и пишется старший байт неизвестно откуда.

---------- Post added at 19:06 ---------- Previous post was at 18:47 ----------

И ещё, SRAM_OE_N <= '0'; тоже не есть гуд.

Santechnik
25.12.2010, 07:22
Я использую обе половинки. Одна - ОЗУ, вторая - квазидиск. Когда включается квазидиск, то старший бит kvazi_block становится 1 и включается половинка UB. Мне кажется, что проблема в самом алгоритме работы с квазидиском. Я видимо его неправильно понимаю. То что я выложил - одна из последних попыток. Изначально было так (и мне кажется это правильнее):


process (clk20, sync_cpu) -- эмуляция контроллера памяти КР580ВК38
begin
if (clk20'event and clk20 = '0' and sync_cpu = '1') then
db_status <= d_bus_O;
end if;
end process;

mem_rd <= '1' when (sync_cpu = '0' and db_status(7) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтение из памяти
io_rd <= '1' when (sync_cpu = '0' and db_status(6) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтение из порта
mem_wr <= '1' when (sync_cpu = '0' and db_status(1) = '0' and wr_n = '0' and rd_en = '0') else '0'; -- разрешение записи в память
io_wr <= '1' when (sync_cpu = '0' and db_status(4) = '1' and wr_n = '0' and rd_en = '0') else '0'; -- разрешение записи в порт
io_stack_rd <= '1' when (sync_cpu = '0' and db_status(2) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтения из стэка (квазидиск)
io_stack_wr <= '1' when (sync_cpu = '0' and db_status(2) = '1' and wr_n = '0' and rd_en = '0') else '0'; -- разрешение записи в стэк (квазидиск)

..............
Здесь вырезан неинтересный блок распределения адресов. В нем же шина данных подается на SDRAM (d_bus_I <= SRAM_DQ(7 downto 0) when (mem_rd = '1' or io_stack_rd = '1'))
..............

SRAM_DQ(7 downto 0) <= d_bus_O when (ram_wr = '0' or io_stack_wr = '1') else "ZZZZZZZZ";
SRAM_WE_N <= ram_wr;
SRAM_CE_N <= '0';
SRAM_LB_N <= '0' when (kvazi_block(2) = '0' or (io_stack_wr = '0' and io_stack_rd = '0')) else '1';
SRAM_UB_N <= '0' when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else '1';
SRAM_OE_N <= '0' when (ram_wr = '0' or io_stack_wr = '1' or io_stack_rd = '1' or mem_rd = '1') else '1';
SRAM_ADDR <= kvazi_block(1 downto 0) & a_bus when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else "00" & a_bus;

process (clk20)
begin
if (clk20'event and clk20 = '0') then
if (io_wr = '1' and a_bus (15 downto 12) = "0100" and sync_cpu = '0') then
case d_bus_O(3 downto 0) is
when "1110" => kvazi_block <= "100";
when "1101" => kvazi_block <= "101";
when "1011" => kvazi_block <= "110";
when "0111" => kvazi_block <= "111";
when OTHERS => kvazi_block <= "000";
end case;
end if;
end if;
end process;

Т.е. мой алгоритм выглядит так:
1) Если производится запись в порт и адрес порта 40Н (0100 на старших 4-х битах шины адреса), то в зависимости от значения младших 4-х битов шины данных включается нужный блок квазидиска (см. код в case) путем присвоения значения сигналу kvazi_block. У этого сигнала старший бит используется для выбора половинки SRAM, а младшие два подставляются в адрес для SRAM (как 16-ый и 17-ый биты).
2) Далее при обращении к стеку (когда статусный бит 2 на шине данных при SYNC = 1 равен 1 активируется сигнал io_stack_wr или io_stack_rd) включается вторая половинка SRAM сигналом 0 на SRAM_UB_N, если квазидиск был включен (kvazi_block(2) = '1') записью в порт 40Н. Иначе 0 подается на LB (половинка ОЗУ).

В этом варианте при попытке выполнения команды SAVE выводится ошибка "NO SPACE". В варианте, который я приводил в предыдущем сообщении, диск работает и пишется без ошибок, но делается это в ОЗУ со всеми вытекающими последствиями, если пишется длинный файл (или много файлов). И команда STAT выдает при этом объем свободного пространства 51k.

Смущает, что в журнале было написано так: "Таким образом, при обращении к стеку и когда в порт 40Н записано 00, открывается электронный квазидиск. Если инициализация порта 40 не произведена, то стек формируется как обычно, в адресном пространстве основного ОЗУ."
По схеме же наоборот - если в порт записан 0 (значения старших 4-х битов не учитываются), то на все CAS блоков памяти квазидиска будут поданы нули и они все вместе включатся, что не есть хорошо.
Я делаю так, как я понял по схеме - ноль в нужном бите шины данных показывает какой блок включать.

Santechnik
25.12.2010, 11:09
Одну ошибку нашел - забыл, что вторая половинка SRAM имеет свою шину данных (15..8). :rolleyes: Исправил. Но все равно STAT видит только 51K...

Ewgeny7
25.12.2010, 14:42
SRAM_OE_N <= '0' when (ram_wr = '0'
Здесь как-то фиговенько. У тебя OE активен и при записи? Это совсем не гуд. При записи в СРАМ сигнал ОЕ должен быть неактивен, т.е. "1".

b2m
25.12.2010, 15:15
Но все равно STAT видит только 51K...
STAT видит столько, сколько в блоке параметров диска в БИОСе CP/Mа указано.

Error404
25.12.2010, 15:17
STAT видит столько, сколько в блоке параметров диска в БИОСе CP/Mа указано.

Недоработочка!

Santechnik
25.12.2010, 15:17
По даташиту роли не играет. Но убрал на всякий пожарный - ничего не изменилось :(. STAT выдает стабильно 51k свободного места, т.е. по всей видимости квазидиск не активируется. Вот на всякий случай тот кусок кода со всеми исправлениями на данный момент:


SRAM_DQ(7 downto 0) <= d_bus_O when (ram_wr = '0' or (io_stack_wr = '1' and kvazi_block(2) = '0')) else "ZZZZZZZZ";
SRAM_DQ(15 downto 8) <= d_bus_O when (io_stack_wr = '1' and kvazi_block(2) = '1') else "ZZZZZZZZ";
SRAM_WE_N <= ram_wr;
SRAM_CE_N <= '0';
SRAM_LB_N <= '0' when (kvazi_block(2) = '0' or (io_stack_wr = '0' and io_stack_rd = '0')) else '1';
SRAM_UB_N <= '0' when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else '1';
SRAM_OE_N <= '0' when (io_stack_rd = '1' or mem_rd = '1') else '1';
SRAM_ADDR <= kvazi_block(1 downto 0) & a_bus when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else "00" & a_bus;

process (clk20)
begin
if (clk20'event and clk20 = '0') then
if (io_wr = '1' and a_bus (15 downto 12) = "0100" and sync_cpu = '0') then
case d_bus_O(3 downto 0) is
when "1110" => kvazi_block <= "100";
when "1101" => kvazi_block <= "101";
when "1011" => kvazi_block <= "110";
when "0111" => kvazi_block <= "111";
when OTHERS => kvazi_block <= "000";
end case;
end if;
end if;
end process;

---

А-а-а-а! Проверил, что стоит по адресу 4А50 загрузчика. А там 39Н - значение для версии квазидиска 64Кб. :mad: Причем это во всех источниках - на сайте, в журнале и в книге. :mad: Должно быть F9H! Поменял и теперь STAT показывает 242k свободно! :v2_clapp: Теперь буду тестировать большими файлами.

---

Не работает :v2_conf2: При попытке записать файл командой SAVE 200 TEST.TXT залезает аж в область дисплейной памяти, т.е. пишет в ОЗУ вместо квазидиска. Все же видимо в алгоритме проблема...

b2m
25.12.2010, 16:51
Я смотрел БИОС CP/M, там пишется в порт 40h:
0FFh - выключить квазидиск
0FEh,0FDh,0FBh,0F7h - для включения соответствующего блока 64К
Так что алгоритм верен. Проверь, правильно ли формируются сигналы io_stack_wr,io_stack_rd. На мой взгляд, достаточно запоминать один сигнал io_stack.

Santechnik
26.12.2010, 12:33
У-ф-ф-ф! Завелось! Из-за кучи исправлений/улучшений начала образовываться каша и плодиться новые ошибки. Так что переписал весь блок работы с памятью с нуля. И заработало. :v2_dizzy_gamer:
Осталось добавить интерфейс для работы с DE1 CONTROL PANEL, чтобы записывать/восстанавливать весь дамп памяти включая квазидиск, а не грузить каждый раз с "магнитофона". Ну и конечно натаскать туда программ. Плюс пофиксить дополнительный знакогенератор как хотел. И можно публиковать!
А сейчас пошел помогать сумки паковать и отчаливаю с утра на неделю пассивного отдыха - пока рождественские/новогодние каникулы здесь :v2_dizzy_bye:. А там никаких компьютеров - только расслабон! :v2_rolley Так что доделывать буду уже в Новом году.
Всех с наступающим!!! :v2_dizzy_newyear:

Santechnik
13.06.2011, 13:33
Прошу прощения, что пропал. Приходится учиться на старости лет :v2_dizzy_botan: Времени на хобби не так много остается. Вот в перерывах между учебой, экзаменами и работой и пишу.
Итак, проект завершен. Ввиду сложности самого компьютера запуск его на ПЛИС тоже не прост. Поэтому пришлось сделать сайт с подробной информацией как запускать и как работать. :v2_dizzy_coder:
Все интересующиеся приглашаются сюда: http://ut88.hut1.ru .
Комментарии и пожелания оставляйте здесь или на страничке комментариев сайта. Правда я не обещаю, что пожелания будут выполнены ;)
JTAG добавлен и работает, так что теперь можно загрузить всю CP/M вместе с программами на квазидиске одним махом. На сайте есть как SOF и POF файлы, так и исходники и программы. Так же там описано как записать другие программы и где их искать. Я готов выкладывать их тоже на сайте если пожелаете.
В принципе я хочу поставить на этом проекте точку и переходить к следующему, тем более основная, образовательная, цель этого проекта для меня выполнена.
Удачи!

b2m
13.06.2011, 14:47
Хороший сайт! Надо будет себе в ссылки добавить.
Непременно достану с полки запылившуюся коробку с DE1 и посмотрю на ЮТ-88. :)

P.S. Некоторые страницы отображаются в Firefox-е не так, как задумано, например раздел "Скачать".

svofski
13.06.2011, 15:06
Ух ты! И сайт красивый =) Спасибо!

b2m
13.06.2011, 16:18
Кстати, Santechnik, как я понимаю, POF ты заливать не пробовал :) Он у тебя для EPCS16, а у DE1 - EPCS4. Но даже если указать правильный конфиг-флеш, то твой Quartus 9.1 SP2 сделает "кривой" POF, я уже попадался на этот баг. К счастью, можно сконвертировать SOF в POF командой:

C:\Altera\91sp2\quartus\bin\quartus_cpf.exe -c -dEPCS4 UT88v2.sof UT88v2.pof

Santechnik
13.06.2011, 17:14
Да, не пробовал :rolleyes: Спасибо за совет. Переделаю завтра и заменю. А сайт у меня в Safari показывается отлично, но раз проблема с таблицей в "Скачать", то завтра ее тоже заменю на простой список.

svofski
13.06.2011, 17:41
P.S. Некоторые страницы отображаются в Firefox-е не так, как задумано, например раздел "Скачать".


<div id="id4" class="style_SkipStroke_3 shape-with-text" style="height: 27px; left: 29px; position: absolute; top: 427px; width: 184px; z-index: 1; ">

Задавать абсолютные позиции элементам в лейауте, это, конечно way to go =) Сделай просто table:


<table>
<tr>
<td><a href="blah.zip">blah.zip 2.4Mб</a></td>
<td>Файл blah.zip СКАЧАТЬ БЕСПЛАТНО СКАЧАТЬ</td>
</tr>
<tr>
...
</tr>
</table>

Santechnik
14.06.2011, 14:04
А это не мой way, это чудо-проги в которой я это делал :v2_dizzy_rain: Я бы не осилил вручную такой сайт писать :rolleyes:
Сейчас все пофиксил, POF перезалил, теперь должно все работать.
Кто-нибудь пробовал? Удалось разобраться с тем что я наворотил?

b2m
14.06.2011, 23:03
Кто-нибудь пробовал? Удалось разобраться с тем что я наворотил?
Достал-таки DE1 с полки :) Попробовал, и даже немного в тетрис поиграл. Несколько неудобно постоянно переключать клаву из одного режима в другой. Было бы удобнее, если бы сразу оба порта работали, они ведь не пересекаются. Ещё, при выводе на экран мелькают полоски: это баг или фича? :)

А так - прикольно. Хотя в переключателях постоянно путался :) Как-то бы уменьшить их количество...

Santechnik
15.06.2011, 11:26
О! Спасибо, что попробовал.
Снег это фича :) При записи в видеопамять это происходит из-за конструкции компа (нельзя и читать и писать в память одновременно).
Выключателей да - много. Но сам комп модульный и этими модулями надо как-то управлять, чтобы попробовать все режимы. Да и не все модули могут работать одновременно. Оригинал тоже выключателей имел много, кстати.
Про удобство с клавиатурой не подумал, честно говоря :v2_conf2:. У меня кейпад приделан и я им пользовался.
На мой взгляд, этот комп весьма экзочитен. Поэтому вряд ли кому-то интересно будет гонять его долгое время. Да и с программами для него напряженка. В этом случае удобство пользования не так критично, как возможность попробовать все режимы работы. Поэтому и решил не углубляться слишком в детали с этим проектом, а переключиться на другой проект. Правда пока еще не решил какой. Выбираю между Радио-86РК и Агатом :v2_dizzy_army:

b2m
15.06.2011, 13:51
Снег это фича :) При записи в видеопамять это происходит из-за конструкции компа (нельзя и читать и писать в память одновременно).
Если это фича, то должны быть не сплошные полоски (а кусочки знакогенератора) и не шире одного знакоместа. :)


Выбираю между Радио-86РК и Агатом
Агат без дисковода не интересен, придётся разбираться с SD-карточкой. А если сделаешь Радио-86РК, то будет уже несложно и аналогичные компы сделать: Апогей,Микроша,Партнёр,Юни� �р.

svofski
15.06.2011, 14:09
Агат без дисковода не интересен, придётся разбираться с SD-карточкой. А если сделаешь Радио-86РК, то будет уже несложно и аналогичные компы сделать: Апогей,Микроша,Партнёр,Юни� �р.

И 8275, с которого все начиналось =)

Santechnik
15.06.2011, 14:33
Если это фича, то должны быть не сплошные полоски (а кусочки знакогенератора) и не шире одного знакоместа. :)

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


Агат без дисковода не интересен, придётся разбираться с SD-карточкой. А если сделаешь Радио-86РК, то будет уже несложно и аналогичные компы сделать: Апогей,Микроша,Партнёр,Юни� �р.

Все верно. Агат интереснее машинка, чем Радио, но схема посложнее (зато без навороченных БИС) и SD надо будет как дисковод прикручивать. Радио попроще, можно кучу компов заодно сделать, но, как тонко подметил svofski :wink: там 8275, которую с лету не возмешь :biggrin: , да и 8257 тоже потребует времени. Опять таки если получится, то эти две БИС будут на FPGA доступны, что тоже неплохо. Но у меня уже 3 ВГ75 в ящике лежат, из России заказанные. Еще парочку 8257 на ebay прикуплю, соберу с ними опять платку расширения и повешу на GPIO_1 и GPIO_0 :v2_wink2: И если комп с ними удастся запустить, то можно будет изучать как они себя ведут и пытаться написать их. В общем есть о чем подумать пока.

ILoveSpeccy
17.06.2011, 14:03
Я тоже было дело Радио-86РК для Аеона написать хотел.
Искал доки на комп и ВГ75. В Радио-86РК вроде бы используется ВГ75
только один режим ВГ75. Тоесть сделать можно без особых проблем.
А 8257 простая как три копейки. Да и вообще без неё обойтись можно!

Kakos_nonos
17.06.2011, 14:27
В журнале радио была схема замены вг75.
Ещё можно ZX80/ZX81 сделать. Для полной истории спекки.

Santechnik
19.06.2011, 05:30
57 простая, согласен. Но все равно надо сделать, чтобы точно работала. Насчет обойтись - не знаю. Надо детальнее смотреть. Вдруг какая прога хитро его задействует?
Насчет схемы обхода 75 знаю, но компы с ней не совсем совместимы становятся. Так что это костыль и не хочется по этому пути идти. Тогда уж совсем очумелый вариант - воткнуть вместо этого контроллера ATMega core с написанным на С контроллером. :v2_biggr:
Но я Агат-7 пока начал делать. "Радио" будет после. Почитал книжку, очень понравилась конструкция и идеи. Загорелся собрать. Насчет SD есть пара идей, но надо еще их обдумать. Так что ждите скоро тему "АГАТ-7 на ПЛИС" - есть пока непонятности по некоторым местам, так что спрашивать буду, если не смогу сам разобраться.;)

Atari
19.06.2011, 12:03
Если я правильно помню, то был только один дебагер для Микроши который переключал экраны.
Возможно это делалось именно изменением адреса доступа 8257 к ОЗУ.
Но впринципе для начала не надо эмулировать ни 8257 ни 8275, можно просто с эмулировать видеовывод именно из тех адресов ОЗУ и всё.

Ewgeny7
16.11.2011, 20:58
Добавил свой кирпичег в этот огород - http://zx.pk.ru/showpost.php?p=435909&postcount=769

---------- Post added at 20:58 ---------- Previous post was at 19:47 ----------


Курсор отображается на 1 позицию правее того места, куда ожидается ввод символа. В эмуляторе emu он выводится точно на месте вводимого символа. Как выводит реальный комп?
Что интересно, у меня также курсор правее на один символ. Может быть, это таки правильно?

b2m
16.11.2011, 22:48
Что интересно, у меня также курсор правее на один символ. Может быть, это таки правильно?
Я уже где-то объяснял, что инверсия (курсор) берётся непосредственно с выхода ОЗУ, а точки символа загружаются из знакогенератора как раз в тот момент, когда счётчик адреса увеличивается (т.е. на выборку из ПЗУ оставляется почти всё время до смены адреса). Получается, что символ отстаёт на одно знакоместо.

Santechnik
31.03.2012, 16:12
Обнаружил, что реклама, которую вставляет хостер на мой сайт, мешает работе ссылок. Так что я создал собственный блог http://electronicsfun.net (http://electronicsfun.net/RU/) куда и перенес все информацию по этому проекту. Пожалуйста, измените ссылки на мой сайт на своих сайтах, так как старый сайт я скоро закрою.
Кстати, я в этом блоге начинаю вести мой второй проект Агат-7 и буду выкладывать там детали и подробности. Если интересно там есть возможность подписаться на RSS обновления.

GARNIZON
17.04.2012, 22:00
Собственный блог это здорово, я на агатовском сайте сцылочку на него сделаю.
Офф: про то, что агат был дорогой ты конечно махнул. 3900 это виртуальная цена по безналу.

vazman
31.01.2016, 23:41
Пытаюсь запустить проект на DE2. При компилировании не может найти файлы mon_0_1.hex и mon_0_2.hex. Где их можно найти?

sergey2b
13.05.2022, 05:02
В процессе создания Радио-86РК на ПЛИС я столкнулся с большим количеством вопросов из-за недостатка опыта. Кроме того, с июля по октябрь я не имел возможности этим заниматься из-за отсутствия свободного
хостинг больше не доступен
могли бы вы выложить файлы проекта

zebest
13.05.2022, 08:22
https://web.archive.org/web/20210512093259/https://www.electronicsfun.net/downloads