С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Основана на реверсе, но сделана оптимизация. Когда я сделал форк на вишбон, то выполнил ряд оптимизаций - убрана фаза F1, убраны HOLD/HLDA/WAIT, ну и еще выбросил по ошибке просыпалку, считая что она тоже не нужна. Теперь выяснилось, что это я погорячился, вернул просыпалку на место. Экзорцист-то все тестирует, кроме HLT. Пришлось еще тестик на HLT добавить.
Но, надеюсь, оригинальная потранзисторная схема осталась? Для будущих поколений, которые захотят пойти не путем верилога.
Titus, http://hwm.us.to/vm80/
Ищите остальные, кидайте в личку. Я добавлю.
Разлохматил второй лист, который с АЛУ. Он действительно забавный. Остался последний, с регистрами и адресными мультиплексорами.
Все, разлохматил последний лист, с регистрами и 16ти битным счетчиком. Процессор - чистая стэйт-машина, никакого микрокода. Теперь точно ясно, что повторять его влоб смысла вообще нет, нужно делать изложение на тему. Речь конечно о реализации на FPGA/CPLD. Интересного там только сам ALU - он просто изящен, хоть и не настолько продвинут в математическом смысле, как у Z80. Ну еще и стэйт машина циклов, но ее можно и самому накорябать за полминуты. Забавно еще то, что только регистры реально хранят значения во времени и аккумулятор, хотя он часть ALU (его выбор - отдельная цепь). У ALU несколько внутренних регистров: X, R и A, причем X и R практически каждый такт перезаписываются. A, выполняет роль, собственно, аккумулятора. При расчете, данные из A сначала копируются в R. Второй операнд параллельно грузится в X и результат вычисляется комбинаторной логикой напрямую (затраты времени чисто задержка в логике), который может быть записан обратно в А, минуя внутреннюю шину, или сразу выставлен на внутреннюю шину данных. Она, кстати, двунаправленная, точнее там что-то вроде монтажного ИЛИ + накачка перед использованием, т.е. используется ёмкостный эффект - это уже обсуждали. Это позволяет загрузить опкод NOP (накачка внутренней шины отключается при активном сбросе), удерживая сброс в течение нескольких тактов (в доке написано, что их число минимально 3), что уменьшает накладные расходы в схеме. Таким образом, вот эта схема не верна, так как Accumulator Latch имеет доступ к внутренней шине.
А, еще регистр флагов. Он отсутствует как регистр - так, набор триггеров. 4 из них вообще тупые: P, Z, AC и S. А вот C - развитой. У него сложная цепь управления, т.к. он реально участвует в куче команд.
- - - Добавлено - - -
Теперь я знаю Кунг-Фу ВМ80!
- - - Добавлено - - -
Позже, я попробую сделать анализ схемы. Хочу нарисовать растактовку, когда в какой момент активируется тот или иной процесс, особенно внутри ALU. Будет нечто подобное растактовке команд из доки, только с указанием внутренних процессов, особенно тех, что без привязки к опкоду. Получившейся информации будет предостаточно для написания тактово точной модели или эмулятора. И сделать это максимально оптимально.
Последний раз редактировалось HardWareMan; 14.02.2018 в 18:26.
Ах да, последнее на сегодня. Когда-то давно, на NedoPC возник спор, что происходит на ногах у ВМ80 во время выполнения 16ти битного сложения командой DAD. По количеству машинных циклов было понятно, что эта команда прогоняется через ALU и занимает 3 машинных цикла, что подтверждает всем известная дока. Большинство арифметических команд накладывается на цикл М1 следующего опкода, если результат ALU надо сохранить в аккумулятор (помечены сноской 9 в известной доке на карте растактовки). Это возможно благодаря внутренней шине ALU, о чем я уже упомянул выше. Однако, команда DAD единственная из тех, что использует машинные циклы М2 и М3, но при этом ей не нужна шина, потому, что все необходимые данные уже внутри, в регистрах. Так вот, я хочу поставить жирную точку в этом споре. Легче всего это отследить по сигналу SYNC. Вот его схема:
Здесь видно, что сигнал SYNC формируется из сигнала T1, который может блокироваться сигналом RESET (все верно, сигнал SYNC в состоянии сброса не генерируется, но при этом машина молотит, загружая каждый раз опкод NOP в регистр инструкции). Этот сигнал запоминается сначала по тактовой фазе F1 и затем по тактовой последовательности F2. Помешать сформированному сигналу может только лог.1 на READY_INT, который, складываясь по NOR будет давить SYNC к лог.0. Напомню, что сигнал SYNC имеет положительную полярность: активный лог.1. Таким образом, SYNC это всего лишь T1 задержанный до T2. Внутри, READY_INT блокирует сигнал WR (перед выдачей на ножку WR) и обнуляет сигнал-статус SY_WO, который по сути является битом D1 в слове состояния и который означает, что процессор хочет запись. Это, в свою очередь, блокирует DBIN выход. Зачем сделано именно так? Это упрощает генерацию сигнала чтения DBIN, который генерируется чаще и должен быть длиннее. Теперь сигнал READY_INT:
Сигнал формируется только от ID_DADX, который стреляет на все 4 опкода команды DAD (09H, 19H, 29H и 39H) и два сигнала машинный циклов M4 и M5. Сигналы машинных циклов M4 и M5 сначала складываются по ИЛИ, а затем по ИЛИ-НЕ (что эквивалентно И). Т.е., блокировка происходит для M4 или M5 только при команде DAD. Соответственно, сигналы SYNC, DBIN и WR во время исполнения 2 и 3 циклов команды DAD не активны. READY_INT так же блокирует вход READY, что не даст вам остановить ВМ80 сигналом неготовности во время прогона вычислений команды DAD. Шину адреса он не блокирует - там будет активность. Шина данных так же управляется только внутренним сигналом SY_WO, поэтому на шине данных так же будет что-то выставлено (в том числе и слово состояния в своем временном слоту). Произойдет обычная запись, но при отсутствии стробирующих сигналов DBIN и WR конфликта шины или чего-то деструктивного не будет. На остальные входы и выходы READY_INT не влияет.
Очевидно, что в схеме ошибка. Вместо M4 и M5 должны быть M2 и M3. Я специально в тексте объяснения написал соответственно этой схеме, чтобы не было путаницы. Но в целом и так ясно. Не понятно, почему сигнал назван именно как READY_INT, ведь к прерываниям он отношения не имеет (сокращение INT у меня ассоциируется с ними), быть может как READY INTERNALLY? Но все это сейчас уже и не важно, наверное.
Последний раз редактировалось HardWareMan; 14.02.2018 в 22:54.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)