Я строю простой 16-битный процессор в Logisim и готов ALU и коды операций, которые я хочу иметь. Теперь мне действительно трудно найти правильную кодировку для команд, чтобы различные подсхемы (например, логика, арифметика) не нуждались во всех управляющих проводах (которые создают кодирование) в качестве входных данных, а как можно меньше. Существуют ли какие-либо стратегии или методы, которые помогают с эффективным дизайном кода операции?
спасибо заранее
cpu
computer-architecture
Benjoyo
источник
источник
Ответы:
Я думаю, что это хороший подход для изучения некоторых других наборов инструкций.
Малым будет MSP430 от TI, это 16-битный процессор с 22 инструкциями.
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
Вы также можете посмотреть на AVR Atmel, они также имеют довольно небольшой набор инструкций.
В своем небольшом проекте я попытался разработать простой 32-битный процессор на VHDL с небольшим набором команд (14 инструкций):
http://www.blog-tm.de/?p=80
Из-за моего текущего свободного времени это не полностью закончено. Инструкции выполнены, но две не проверены и, возможно, некоторые флаги состояния отсутствуют.
источник
Изучите (но не повторяйте) подход ARM к кодированию команд. Он сильно ориентирован на префиксы (как подход дерева Хаффмана, рекомендованный Дзардой) и очень однороден с точки зрения того, где регистр выбирает часть инструкции.
Единственный, но надежный подход состоит в том, чтобы перечислить все имеющиеся у вас управляющие сигналы , которые, вероятно, будут превышать 16 бит, а затем попытаться выполнить минимизацию логики в стиле карты Карно для них.
источник
Однажды я попытался создать 4-битный процессор с 8-битным ядром длины команд в Logisim. Законченный простым конечным автоматом, больше чем процессор, действительно.
Случайные вещи, чтобы искать
Отличное видео на Computerphile о деревьях Хаффмана:
источник
В ISA, который я написал для класса, был 4-битный оп-код, например:
1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store
Вместо того, чтобы быть наиболее оптимальным, это один из более простых стилей для конструирования / проектирования шлюзов, потому что входной сигнал одного бита может полностью контролировать, какой логический путь выбран. Кроме того, вы можете использовать код Хаффмана для своих наиболее часто используемых символов и дополнять их нулями, чтобы получить код операции фиксированной длины.
источник
Одна вещь, которую вы должны рассмотреть, - разрешить ли любую форму инструкции из нескольких слов или что-нибудь, что может «действовать» как инструкция из нескольких слов; если вы это сделаете, вы можете подумать, следует ли использовать дополнительные слова инструкции после основной инструкции или префиксные слова перед ней. Разрешение префиксов и последующих слов может увеличить сложность обработки прерываний, но это может избежать необходимости размещать редко используемые инструкции в том же пространстве кода операции, что и обычно используемые.
Если инструкции извлекаются в цикле до их выполнения, можно получить инструкцию «условного перехода», которая либо заставит пропустить следующее слово инструкции, либо его содержимое будет перенесено непосредственно в счетчик программ; такой дизайн может добавить некоторую дополнительную сложность к последовательности прерываний, но это может облегчить необходимость использования большой части пространства кода операции для команд "ветвление", "переход" и "вызов", в то же время позволяя гораздо более широкий диапазон условий ветвления чем было бы возможно в противном случае. Поскольку ветвь, которая берется, обычно требует мертвого цикла после выполнения самой инструкции, независимо от того, откуда исходит адрес, получение адреса из следующего слова, которое было выбрано, но не будет выполнено, не требует дополнительных затрат. время.
Несмотря на то, что перемещение целевого адреса из инструкций ветвления сократит объем занимаемого ими кода операции, 16-разрядный формат кода операции все еще довольно узок. Использование префиксных инструкций может помочь в этом. Если, например, нужно иметь 32 регистра, для того чтобы любой регистр мог быть независимо указан как source1, source2 и destination, потребуется 15 битов в коде операции, что дает колоссальную сумму двух команд. Не очень полезно. С другой стороны, было бы неплохо использовать любой из 32 регистров для каждого из трех операндов. Можно сбалансировать две цели, если любая операция ALU, которой не предшествует префикс, использует восемь битов, чтобы сделать два выбора из одного из шестнадцати регистров, но имеет операцию ALU, которая следует сразу за префиксом, используя некоторые биты в префиксе вдоль с восьмым из следующей инструкции, чтобы позволить независимый выбор обоих источников и адресатов из полного набора из 32. Инструкции, которые используют верхние регистры, будут занимать два слова / цикла, а не одно, но в некоторых случаях такой компромисс может быть целесообразным. Самая большая трудность с использованием префиксов заключается в том, что необходимо либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо обеспечить, чтобы в случае возникновения прерывания команда после префикса все еще использовала правильные регистры [например, имея программу -counter save logic хранит адрес последней выполненной не префиксной инструкции]. но в некоторых случаях такой компромисс может быть оправдан. Самая большая трудность с использованием префиксов заключается в том, что необходимо либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо обеспечить, чтобы в случае возникновения прерывания команда после префикса все еще использовала правильные регистры [например, имея программу -counter save logic хранит адрес последней выполненной не префиксной инструкции]. но в некоторых случаях такой компромисс может быть оправдан. Самая большая трудность с использованием префиксов заключается в том, что необходимо либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо обеспечить, чтобы в случае возникновения прерывания команда после префикса все еще использовала правильные регистры [например, имея программу -counter save logic хранит адрес последней выполненной не префиксной инструкции].
Использование многословных инструкций усложнит некоторые аспекты дизайна, но может снизить необходимость принятия других сложных решений.
источник
Этот парень лучше всех разбирается в жесткой проводке жестко закодированной части декодера, которая объясняет управляющие линии для жестко запрограммированного процессора: http://minnie.tuhs.org/CompArch/Tutes/week03.html Как вы можете видеть, ваш Выбор в кодах операций действительно влияет на сложность логики декодирования.
источник