Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
6502:decoder [2013/09/23 14:52]
org
6502:decoder [2020/02/10 13:10] (текущий)
org
Строка 1: Строка 1:
 +# Декодер
 +
 Декодер 6502 (англ. PLA) - это обыкновенный демультиплексор,​ но очень большой. Формула демультиплексора получается 21-to-130, но с некоторыми исключениями (об этом ниже) Декодер 6502 (англ. PLA) - это обыкновенный демультиплексор,​ но очень большой. Формула демультиплексора получается 21-to-130, но с некоторыми исключениями (об этом ниже)
  
 Топологически декодер разделен линиями земли на несколько групп, поэтому мы будем придерживаться такого же разделения,​ для удобства. Топологически декодер разделен линиями земли на несколько групп, поэтому мы будем придерживаться такого же разделения,​ для удобства.
  
-=== Особенные линии ​===+Входные линии : 
 +  * /T0, /T1X : текущий цикл для коротких (2-х тактовых) инструкций. Эти сигналы выходят с [[6502:​random:​dispatch|логики dispatch]]. 
 +  * /T2, /T3, /T4, /T5 : текущий цикл для длинных инструкций. Сигналы выходят с [[6502:​extra_counter|расширенного счетчика циклов]]. 
 +  * /IR0, /IR1, IR01 : младшие рязряды кода операции из [[6502:​ir|регистра инструкций]]. Для уменьшения количества линий 0 и 1 разряды объединены в одну контрольную линию IR01. 
 +  * IR2-IR7, /IR2-/IR7 : прямые и инверсные значения остальных разрядов. Прямая и инверсная формы нужны для проверки разряда на 0 и 1. 
 + 
 +Логика декодера основана на принципе исключения. Схематически каждый выход представляет собой многовходовый элемент NOR, это значит,​ что если хотя бы на одном из входов будет 1, то вся линейка НЕ сработает. 
 + 
 +{{6502:​decoder_nice.jpg?​1000}} 
 + 
 +## Особенные линии 
 + 
 +Кроме перечисленных выше значений в качестве дополнительных входов могут выступать специальные контрольные линии. 
 + 
 +  * Внутренняя линия Push/Pull : специальная (129я по счёту) линия, которая не выходит за пределы декодера. Используется чтобы "​отсечь"​ инструкции Push/pull при выборе инструкций. Используется в трёх линейках : 83, 90 и 128. 
 +  * /PRDY : эта линия приходит на 73ю линейку декодера (Branch T0) 
 +  * IR0 : обычно для проверки двух младших разрядов кода операции используется общий сигнал IR01, но исключительно для 128й линейки (IMPL) используется значение IR0. 
 + 
 +Есть мнение что эти специальные управляющие линии хотя и территориально входят в декодер - на самом деле просто части рандомной логики,​ а в декодер попали просто потому что так удобней было развести соединения. 
 + 
 +## Содержимое PLA
  
-=== Содержимое PLA ===+Онлайн-декодер : http://​breaknes.com/​files/​6502/​decoder.htm
  
 ^Group ^N  ^Raw bits                ^Decoded ​ ^T      ^Comments^ ^Group ^N  ^Raw bits                ^Decoded ​ ^T      ^Comments^
Строка 94: Строка 116:
 |F06  |78 |001001010101010100100 ​  ​|00100000 |T3     |JSR| |F06  |78 |001001010101010100100 ​  ​|00100000 |T3     |JSR|
 |F07  |79 |000101000000101000000 ​  ​|100XXXX1 |TX     |STA| |F07  |79 |000101000000101000000 ​  ​|100XXXX1 |TX     |STA|
-|F08  |80 |000000010110000101000 ​  ​|XXX10000 |T2     |Branch|+|F08  |80 |000000010110000101000 ​  ​|XXX10000 |T2     |BR2|
 |F09  |81 |000000100100000001000 ​  ​|XXXX01XX |T2     |zero page| |F09  |81 |000000100100000001000 ​  ​|XXXX01XX |T2     |zero page|
 |F10  |82 |000000010100001001000 ​  ​|XXXX00X1 |T2     |ALU indirect| |F10  |82 |000000010100001001000 ​  ​|XXXX00X1 |T2     |ALU indirect|
Строка 147: Строка 169:
 |K07 |126 |000000000000010000000 ​  ​|0XXXXXXX |TX     ​|/​IR7| |K07 |126 |000000000000010000000 ​  ​|0XXXXXXX |TX     ​|/​IR7|
 |K08 |127 |001001011010100100000 ​  ​|10111000 |TX     |CLV| |K08 |127 |001001011010100100000 ​  ​|10111000 |TX     |CLV|
-|K09 |128 |000000011000000000000 ​  ​|XXXX10X0 |TX     |All impliedexcept Push/pull|+|K09 |128 |000000011000000000000 ​  ​|XXXX10X0 |TX     |IMPL| 
 + 
 +## Что значит Raw bits 
 + 
 +Если представить себе декодер как ROM 21x130где каждый бит представляет собой транзистор,​ образуемый пересечением полисиликона и диффузии,​ то raw bits будут представлять одну линейку декодера. 
 + 
 +Для примера на картинке представлена 5-я линейка декодера. Счёт бит начинается снизу-вверх. 0 означает отсутствие транзистора,​ 1 - наличие. 
 + 
 +{{6502:​decoder_line.jpg}} 
 + 
 +## Branch T0 skipping 
 + 
 +С контакта [[6502:​pads#​rdy_sync|RDY]] через линию задержки приходит специальная линия **/PRDY**. Если процессор был не готов на момент завершения //​предыдущей//​ инструкции,​ то если следующая инструкция является инструкцией условного перехода (branch), то её 0-й цикл (T0) пропускается. 
 + 
 +Зачем они это сделали - не известно. 
 + 
 +## Симуляция 
 + 
 +Существует два подхода в симуляции декодеров : 
 +  * Обычный перебор всех линий в цикле. При этом каждая итерация будет представлять собой операцию NOR над всеми входами. В нашем случае это будет очень медленно,​ потому что у декодера 6502 очень много линий (130). 
 +  * Табличный метод. Смысл в том, что мы заранее генерируем массив массивов для всех 130 линий, перебирая все возможные комбинации входов (IR, T0-T5, /PRDY). Индекс массива получается 8+6+1=15 бит, итого получается 32768 130-байтовых массивов (4.2 MB памяти). 
 + 
 +{{template>​6502_blocks}}
  • Показать страницу