2.4В - это минимальное выходное напряжение высокого уровня. А реально может быть и до напряжения питания, то есть до +5В. Если делать совсем правильно, то смотрите схему подключения ВМ2 к ПЛИС тут:
Экспериментальные модули
CAD файлы на github
2.4В - это минимальное выходное напряжение высокого уровня. А реально может быть и до напряжения питания, то есть до +5В. Если делать совсем правильно, то смотрите схему подключения ВМ2 к ПЛИС тут:
Экспериментальные модули
CAD файлы на github
Sergey(22.09.2020)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А почему к примеру не использовались "преобразователи уровня" ?
http://www.gaw.ru/html.cgi/txt/ic/Te...vels/start.htm
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
Прошу прощения, я не очень понял вопрос. На плате модулей 1801ВМx установлена MAX3064 - это как раз 5V-толерантная CPLD и два и более 74LVC245. LVC245 установлены для шины данных, если делать им замену на от CPLD это потребовало бы 32 входа/выхода - надо было бы ставить или заметно более толстую MAX3256 в корпусе TQFP-144 или две CPLD и еще возиться с программированием второй. Сильно жирно для простого преобразования уровня на шине данных.
Sergey(23.09.2020)
Vslav, а что скажешь на предмет вскрытия FPA?![]()
Я написал такой обработчик HALT (вектор 708):
Результат листинга микрокода:Код:hmode: mov #50, R0 ; mov #10, R1 ; mov #12, R2 ; mov #23, R3 ; mov #34, R4 ; mov #45, R5 ; .word 30 ; mov R0, R1 ; br hmode ;
Cкроллим код вправо - там мои комментарии.Код:# plm[42->37] op1 word fw ac **** QREG vector 000170 x+y --- rdat 001732 001732 001734 ir:000000 4 6 42 // формируем адрес вектора для чтения # plm[37->02] op2 word *x **** R7 QREG ------ y --- ---- 001732 001732 001734 ir:000000 4 6 37 // прочитали новое значение PC из вектора # plm[02->31] op1 word fw ac **** ACC 000002 ------ x+y --- rdat 001732 001150 001150 ir:000000 4 6 02 // обновили адрес для чтения +2 # plm[31->06] op2 word *x **** PSW QREG ------ y --- ---- 001732 001150 001150 ir:000000 4 6 31 // прочитали новое PSW из вектора # Access to halt vector // отладочный останов # Break in Module tb2 at E:/GIT/cpu11/vm2/hdl/org/tbe/de0_tb2.v line 143 # run # plm[06->32] se0 byte n/a ---- n/a n/a ------ n/a n/a n/a 001732 001150 001150 ir:000000 4 6 06 # plm[32->36] op2 word *x **** ACC ACC ------ y --- ---- 001732 001150 001150 ir:000000 4 0 32 # plm[36->76] op1 word fr *x **** R7 000002 ------ x+y --- rcmd 001732 001150 001150 ir:000000 4 1 36 // выборка инструкции # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001152 001152 ir:000000 4 1 76 // предвыборка следующей инструкции # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001154 001154 ir:012700 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001154 001154 ir:012700 4 6 55 // чтение литерала #50 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001154 001154 ir:012700 4 6 57 // предвыборка следующей инструкции # plm[54->76] op2 byte *x wsta R0 R_SRC ------ y --- ---- 001732 001154 001156 ir:012700 4 6 54 // R0 = 50 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001154 001156 ir:012700 4 1 76 // предвыборка следующей инструкции # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001160 001160 ir:012701 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001160 001160 ir:012701 4 6 55 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001160 001160 ir:012701 4 6 57 # plm[54->76] op2 byte *x wsta R1 R_SRC ------ y --- ---- 001732 001160 001162 ir:012701 4 6 54 // R1 = 10 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001160 001162 ir:012701 4 1 76 # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001164 001164 ir:012702 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001164 001164 ir:012702 4 6 55 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001164 001164 ir:012702 4 6 57 # plm[54->76] op2 byte *x wsta R2 R_SRC ------ y --- ---- 001732 001164 001166 ir:012702 4 6 54 // R2 = 12 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001164 001166 ir:012702 4 1 76 # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001170 001170 ir:012703 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001170 001170 ir:012703 4 6 55 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001170 001170 ir:012703 4 6 57 # plm[54->76] op2 byte *x wsta R3 R_SRC ------ y --- ---- 001732 001170 001172 ir:012703 4 6 54 // R3 = 23 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001170 001172 ir:012703 4 1 76 # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001174 001174 ir:012704 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001174 001174 ir:012704 4 6 55 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001174 001174 ir:012704 4 6 57 # plm[54->76] op2 byte *x wsta R4 R_SRC ------ y --- ---- 001732 001174 001176 ir:012704 4 6 54 // R4 = 34 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001174 001176 ir:012704 4 1 76 # plm[77->55] op2 word ac **** R7 R2 ------ x --- ---- 001732 001200 001200 ir:012705 7 6 60 # plm[55->57] op2 word *x **** R_SRC QREG ------ y --- ---- 001732 001200 001200 ir:012705 4 6 55 # plm[57->54] op1 word f2 *x **** R7 000002 ------ x+y --- pref 001732 001200 001200 ir:012705 4 6 57 # plm[54->76] op2 byte *x wsta R5 R_SRC ------ y --- ---- 001732 001200 001202 ir:012705 4 6 54 // R5 = 45, PC=1202 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001200 001202 ir:012705 4 1 76 // предвыборка инструкции следующей за 030 // здесь начитается обработка инструкции 030 в HALT-режиме # plm[77->30] op1 word *x **** R0 000000 ------ y --- ---- 001732 001202 001204 ir:000030 5 2 72 // mov #0, R0 ; R0 is 000000 # plm[30->12] op2 byte ac nzv- R2 R0 ------ x --- ---- 001732 001202 001204 ir:000030 4 2 30 // проверка условий выхода из цикла?? # plm[12->16] op1 byte *x nzv- R0 000001 ------ x+y --- ---- 001732 001202 001204 ir:000030 6 2 12 // incb R0 ; R0 is 000001 # plm[16->46] op2 word *y **** R0 R1 ------ y asl ---- 001732 001202 001204 ir:000030 6 2 16 // asl R1 ; R1 is 20 # plm[46->41] op2 word *y **** R0 R3 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 46 // rol R3 ; R3 is 46 # plm[41->12] op2 byte *y nzv- R0 R2 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 41 // rolb R2 ; R2 is 24 # plm[12->16] op1 byte *x nzv- R0 000001 ------ x+y --- ---- 001732 001202 001204 ir:000030 6 2 12 // incb R0 ; R0 is 000002 # plm[16->46] op2 word *y **** R0 R1 ------ y asl ---- 001732 001202 001204 ir:000030 6 2 16 // asl R1 ; R1 is 40 # plm[46->41] op2 word *y **** R0 R3 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 46 // rol R3 ; R3 is 114 # plm[41->12] op2 byte *y nzv- R0 R2 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 41 // rolb R2 ; R2 is 50 # plm[12->16] op1 byte *x nzv- R0 000001 ------ x+y --- ---- 001732 001202 001204 ir:000030 6 2 12 // incb R0 ; R0 is 000003 # plm[16->46] op2 word *y **** R0 R1 ------ y asl ---- 001732 001202 001204 ir:000030 6 2 16 // asl R1 ; R1 is 100 # plm[46->41] op2 word *y **** R0 R3 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 46 // rol R3 ; R3 is 230 # plm[41->12] op2 byte *y nzv- R0 R2 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 41 // rolb R2 ; R2 is 120 # plm[12->16] op1 byte *x nzv- R0 000001 ------ x+y --- ---- 001732 001202 001204 ir:000030 6 2 12 // incb R0 ; R0 is 000004 # plm[16->46] op2 word *y **** R0 R1 ------ y asl ---- 001732 001202 001204 ir:000030 6 2 16 // asl R1 ; R1 is 200 # plm[46->41] op2 word *y **** R0 R3 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 46 // rol R3 ; R3 is 460 # plm[41->12] op2 byte *y nzv- R0 R2 ------ y rol ---- 001732 001202 001204 ir:000030 4 2 41 // rolb R2 ; R2 is 177640 # plm[12->76] op2 byte ac nzvc R0 R0 ------ x --- ---- 001732 001202 001204 ir:000030 4 2 12 // цикл закончен, установка флагов # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001202 001204 ir:000030 4 1 76 // предвыборка инструкции br hmode # plm[77->76] op2 byte *x wsta R1 R0 ------ y --- ---- 001732 001204 001206 ir:010001 5 2 04 // исполнение mov R0, R1 # plm[76->77] op1 word f2 *x nzv- R7 000002 ------ x+y --- pref 001732 001204 001206 ir:010001 4 1 76 // предвыборка инструкции следующей за br hmod # plm[77->36] op1 word *x **** R7 br_off ------ x+y --- ---- 001732 001206 001210 ir:000761 7 2 73 // выполнение br
В-общем, похоже что порядок R2:R3 другой.
И еще - флаг С тут похоже не переносится, то есть это не цепочный сдвиг регистров. Я попробовад задать R1=210, и 200 не перехало в R3.
Последний раз редактировалось Vslav; 27.09.2020 в 15:03.
Alex_K(27.09.2020)
1. Обновил документацию по ВМ1:
- исправил опечатки и поредактировал футеры, теперь формат документа стал оптимальнее
- теперь PDF умеет в оглавление и закладки, типа такого:
Скрытый текст
[свернуть]
2. Добавил утилиту для анализа матриц ПЛМ для 1801ВМ1А/Г и для ВМ2:
- умеет перебирать все микроадреса (полный диапазон или по параметрам из командной строки)
- умеет делать перебор микроадресов только для указанного PDP-11 опкода с маской
- функции могут использовать SSE2/AVX2 инструкции для ускорения
- функции умеют строить оптимальное М-арное дерево для оптимизации вычисления матриц
(правда дерево вырожденное - один корень с листьями)
- под win32/64, но возможно соберется под линуксом (у меня не было GCC старше 4.9, оно не умеет в __mi256i), Makefile в комплекте
(если будут желающие - попробуйте, я приму PR с обновлениями для Linux)
- лежит на github и тут
- старая версия (где 100500 закомментированных подветок для анализа частных случаев ВМ1А на основе которой писался и проверялся документ) - тут, это чисто рабочий вариант, не для публикации, просто показывает сколько всего было проанализировано, этой ветки в официальной репке не будет.
- на основе это утилиты для ВМ2 надо брать и добавлять анализ специальных случаев, как это было сделано для ВМ1 в старой ветке
Примечание для эмуляторщиков: код функций вычисления матриц может быть использован для эмуляции микрокода серии 1801, производительность примерно до 100M отсчетов в секунду на одном ядре 4770@3.4GHz. Функции могут быть использованы или прямо для вычисления выходя матриц в момент исполнения, или для заполнения ускоряющих таблиц.
Программируемые логические матрицы
Микропроцессоры серии 1801, в-основном, построены вокруг одной большой программируемой логической матрицы - PLM. Эта матрица объединяет горизонтальный микрокод, управление состоянием конечного автомата и логику декодирования операций и может рассматриваться как набор простых комбинаторных функций входного логического вектора X, обеспечивающая выходной вектор Y:
Состояние конечного автомата определяется как адрес «микрокоманды», некоторое число младших битов входного вектора - это поле микроадреса, а выходной вектор содержит новое значение, которое будет присвоено микроадресному регистру - поле «следующий адрес». Следующие биты адреса могут быть "размазаны" по битам выходного вектора из-за того, что порядок битов определяется в процессе реверса, и не всегда очевидно, где находятся эти биты. Шестнадцать старших битов входного вектора всегда являются текущим кодом операции инструкции PDP-11.Код:y [m: 0] = f (x [n: 0])
Матрица включает логические функции в дизъюнктивной нормальной форме. Есть набор продуктов (p, логических произведений), сравниваемых с входным вектором с маскированием и совпавшие продукты объединяются в выходной вектор с помощью логического ИЛИ.
В таблице представлены параметры матриц для процессоров серии 1801:
1801BM1A - 31 бит на входе, 34 бита на выходе, 7 бит ширина микроадреса, 248 продуктов
1801BM1Г - 31 бит на входе, 34 бита на выходе, 7 бит ширина микроадреса, 249 продуктов
1801BM2 - 28 бит на входе, 37 бит на выходе, 6 бит ширина микроадреса, 198 продуктов
Матричные процедуры реализуют матричную функцию. Поддерживаемая ширина входного вектора ограничена 32 битами, а поддерживаемая ширина вывода ограничена 64 битами, прототип функции выглядит так:
Основной алгоритм - проверить все продукты, выбрать те которые совпадают с данным значением входного вектора и добавить к выходному результату используя логическое ИЛИ:Код:uint64_t f (uint32_t x);
Возможны некоторые простые и сразу очевидные оптимизации. Маскированное сравнение продуктов с входным вектором - это просто логическое XOR и AND, можно использовать SIMD-инструкции для обработки нескольких векторов за одну операцию. SSE2 реализация обрабатывает четыре вектора на итерацию цикла, реализация AVX2 может обрабатывать восемь векторов за итерацию.Код:for each product { if product matches input { add to result } }
Другая оптимизация - разделить значения входных векторов на несколько групп, используя значения некоторых выбранных битов. Тогда мы можем проверить все продукты и назначить каждой группе только совпадающие. При вычислении функции мы проверяем выбранные битовые значения и выбирает продукты какой группы будут обрабатываться в цикле вычисления результата. Так как продукты, которые не совпадают с данным значением входного вектора уже исключены (отсутствуют в массиве продуктов для этой группы) количество итераций цикла меньше.
Например, мы выбрали четыре младших бита в качестве индекса группы, и построили (один раз во время инициализации) шестнадцать массивов продуктов сопоставленные с индексами группы 0..15. Входные векторы xxxx0 будут использовать продукты группы 0 для вычисления результата, векторы xxxx5 будут использовать группу 5 и так далее.
Выбор наиболее оптимальных бит не так очевиден, код реализует проверку всех возможных битовых комбинаций для заданной матрицы и выбирает комбинацию, дающую дерево (набор массивов продуктов) минимальной высоты.
Приложение для анализа микрокода
Пример приложения обеспечивает тестирование, сканирование матриц для указанных входных векторных шаблонов и средства измерения производительности.
Имеется эталонная матрица для 1801ВМ1А, реализованная в самый простой способ и проверенная с помощью моделирования Verilog в ходе документирования 1801ВМ1. Новые реализации матричных процедур включая SIMD и оптимизированные для дерева, можно напрямую сравнить с проверенной реализацией, эта функция включается ключом --match и предоставляется только для 1801BM1A.
Ключ --speed включает тесты измерения производительности, перебирается весь диапазон ввода (2^31 - 2млрд комбинаций для 1801ВМ1), вычисляется функция матрицы, и сообщается полученное время.
Метод --table строит таблицы микроадресов и собирает статистику о переходах на целевые микроадреса. Данный цикл следует дополнять кодом для сбора специальной статистики.
Последний раз редактировалось Vslav; 25.10.2020 в 13:31.
Alex_K(25.10.2020), forth32(25.10.2020), nzeemin(25.10.2020), Sergei Frolov(25.10.2020), yu.zxpk(25.10.2020)
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)