Для ретрокомпьютерщиков так же принципиальна важна способность работать в точности на оригинальной растактовке. А измененная шина - это уже уход от подобной возможности.
Вид для печати
Для этого предназначена ветка Qsync - там сохранена оригинальная шина, и на базе этой ветки можно сделать такой себе ВМ-улятор - плату заменяющую собственно микросхему ВМ1. Только устанавливался бы такой ВМ-улятор в старые платы и был бы ограничен их возможностями, абсолютно ничего нового он не дал бы. И микросхема 1801ВМ1 не является дефицитом. Но задачу "оригинальной растактовки" ВМ-улятор решает.
Поэтому так - ветка Qsync закончена, можно больше ничего не делать, проект закрыт, реплика готова. А можно пойти дальше - сделать полную систему на ПЛИС, работающую на высокой частоте, но с времянкой реального устройства.
В ветке Wsync предусмотрен режим эмуляции точной растактовки - работа в "медленном" режиме. Точная растактовка имеет смысл исключительно для повторения времянки реальных устройств, тут есть два фактора - частота ядра до 5МГц и задержки ответа внешних устройств, особенно тут интересна репликация ВП1-037 в случае повторения БК. Поэтому соответственно есть два блока поддержки точного тактирования - внутри процессора и во внешней системе. Имея быстрый Wishbone на 100МГц можно эмулировать времянку медленного Qbus на 5 МГц с неплохой точностью.
Внутри процессора предусмотрен "дульный компенсатор", ядро работает постоянно на высокой частоте - это делает его простым и "идентичным натуральному" и работает специальный счетчик, считает такты высокой частоты - инкрементируется на 100МГц. В режиме точной растактовки, при запуске транзакции на внешней шине этот счетчик начинает считать такты медленной частоты - декрементируется на 5МГц. По достижению нуля транзакция будет запущена на шине. Внешний блок (например БК) уже эмулирует работу системы, и завершает транзакцию согласно своим представлениям. Тут будет специальный механизм - сама транзакция выполнится на полной скорости, чтобы не нарушать работу системы (нельзя захватиьт шину на 2 мкс и мешать, например, работе видеоконтроллера из разделяемой SDRAM), но процессору будет сообщен момент когда она закончится в реальном времени.
Итого - все транзакции быстрые, работают на быстрой шине снаружи процессора и запускаются и завершаются синхронно с частотой 5МГц в те же самые такты когда они появиись бы в реальной системе.
К тому же, в собственно реальных системах с точной растактовкой не все гладко - ВМ1А и ВМ1Г работают в этом плане по-разному, есть отличия, точно я их не искал, но тесты 791401 и 791404 на разных микропрограммах исполняются разное время. Также в процессоре есть индетерминизим - прескайлеры таймера шины и ВЕ-таймера не сбрасываются, после старта имеют произвольные значения, таким образом, оригинальный ВМ1 может работать минимум в 8 разных фазах относительно контроллера динамической памяти. На практике тайм-аут шины происходит редко, поэтому фазы исполнения команд довольно быстро (за несколько циклов максимум) сойдутся к одной, но расфазировка все равно будет вылазить при каждом тайм-ауте.
Ну и максимально точная растактовка имеет какой-то смысл только для БК. А в ДВК был зоопарк процессоров, плат и частот - не везде даже кварц в генераторе стоял, там ПО не очень требовательно к точности растактовки.
Сейчас ВМ1 не является дефицитом, но настанет время, когда его перестанут выпускать. Тут и пригодится точный клон на ПЛИС или на КПЛИС(квантовом плис 21 века, который наверняка появится ;-)).
А исправляются ли ошибки, найденные при разработках в других ветках, в ветке Qsync? Что-то там про таймер вы писали или я не помню уже, какая была ошибка.
Да. К тому же тактирование моделей Async и Qsync полностью совпадает, на обоих был прогнан тест 791401 и достигнуто полное совпаление осциллограмм на внешних выводах - все сигналы Qbus ставляться и снимаются в той же фазе по тем же ниспадающим и нарастающим фронтам в обоих моделях, и совпадают с реальным процессором (тут я смотрел отдельные транзакции, правда). Сейчас отлаженная модель Wsync (v1.3b) имеет единственное отличие - DATIOx выполняется на 2 такта меньше чем в оригинале, чистые же DATI и DATOx выполняютс ровно столько же. Такое отличие дало ускорение времени теста менее чем на 1 процент.
В-общем, поисправлял ошибки, добавил в проект заглушку на терминал (в моделсиме можно и вывод увидеть) для генерации прерываний, и успешно прошлись тесты 791401 и 791404 на реальной ПЛИС для ВМ1А/Г.
Версия 1.3b
Используемые ресурсы:
http://s017.radikal.ru/i425/1506/d0/ada2caa5f978.png
Частотные характеристики:
http://s017.radikal.ru/i440/1506/28/3d007c069614.png
Готов первый вариант давно обещанного адаптера шины МПИ:
Адаптер шины МПИ для эмулятора ДВК-1
Теперь C-модели МПИ-устройств можно с минимальными переделками запускать в эмуляторе ДВК.
Потихоньку изучаю микрокод и пишу документацию, чтобы завершить проект.
На днях еще попался симпатичный экземпляр ВМ1Г:
http://s020.radikal.ru/i719/1508/19/500079f4ecc5t.jpg
На плате еще невиданные ранее ВП-шки - 026, 028, 031, 038, а также РЕ-шки 072, 074, 076, 0209. ПЗУ, наверное, имеет смысл считать - это недолго, а ковырять матрицы - уже нет.
http://s017.radikal.ru/i430/1508/f0/53faad417582t.jpg
Вот тут кое-что есть по предмету.
Цифровые устройства и микропроцессоры, стр.84 "Построение цифровой схемы по произвольной таблице истинности"
https://books.google.ru/books?id=kEg...page&q&f=false
Vslav, вчера мне удалось с помощью вашей программы mcode вычислить все невалидные операции процессора, просто подав 0x7E в качестве начального адреса и вычисляя выходной сигнал 12.
Для того чтобы сигнал 12 выдавался правильно, на входе должно быть:
mr[14] = 0
mr[13] = 0
mr[12] = 1
mr[11:7] -- (флаги) любые
mr[6:0] -- (адрес) 0x7E
Пытаюсь заставить мою модель ВМ1 на си проходить тест 791404.
В основном проблемы возникали из-за того, что эмулятор терминала неправильно выполнял цикл генерации векторного прерывания.
Но тут возникла непонятная ситуация в тесте 71
Вот кусок теста
командой bis #100, tps разрешается генерация векторного прерывания терминалом. Но поскольку прерывания разрешены, то сразу возникает прерывание по вектору 064. Путём манипуляций с задержкой выдачи VIRQ удалось достичь того, что прерывание возникает сразу перед выполнением wait. Увеличение задержки ведёт к тому, что предыдущие тесты перестают проходить. Как можно добиться того, чтобы прерывание происходило тогда, когда этого задумали авторы теста?Код:2$: tstb tps ;tps = 177564
bpl 2$ ;
mov #0, tpb ;tpb = 177566
bis #100, tps ;
clr status ;
mtps status ;
wate3: wait ;
Есть ли где-то информация по растактовке работы ВП1-035/ВП1-065 ? Или описание их работы с временными задержками?
vslav, когда будете заниматься ВМ2 -- напомню что есть Техническое описание от Titus'а:
http://zx-pk.ru/showthread.php?t=17284
Вот прямая ссылка на архив: http://www.felixl.com/1801VM2SPECS.zip
В частности, про блок микропрограммного управления (БМУ) там говорится что он тоже построен на ПЛМ:
дешифратор команд (ДШК) на 50 логических произведений,
накопитель микрокоманд (НМК) на 200 логических произведений.
Ну и по микрокомандам там кое-что расписано.
И там есть конечно некоторые параллели с тем что мы видим в микрокомандах ВМ1.