Я создаю простой 16-битный процессор в Logisim, и у меня есть готовый ALU и коды операций, которые я хочу иметь. Теперь мне очень трудно найти правильную кодировку для команд, чтобы различные подсхемы (например, логическая, арифметическая) не нуждались в входных данных для всех управляющих проводов (из которых состоит кодировка), а как можно меньше. Существуют ли какие-либо стратегии или методы, помогающие разработать эффективный код операции?
спасибо заранее
Я думаю, что это хороший подход к изучению некоторых других наборов инструкций.
Маленьким будет MSP430 от TI, это 16-битный процессор с примерно 22 инструкциями.
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
Вы также можете посмотреть на AVR Atmel, у них также довольно небольшой набор инструкций.
В своем небольшом проекте я попытался разработать простой 32-битный процессор на VHDL с небольшим набором инструкций (14 инструкций):
Из-за моего текущего свободного времени он не полностью закончен. Инструкции реализованы, но две из них не проверены, и, возможно, отсутствуют некоторые флаги состояния.
Изучите (но не копируйте) подход 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 регистра, то для того, чтобы любой регистр мог быть независимо указан как источник1, источник2 и место назначения, потребуется 15 бит в коде операции, что позволяет получить в общей сложности две инструкции. Не очень полезно. С другой стороны, было бы неплохо иметь возможность использовать любой из 32 регистров для каждого из трех операндов. Можно сбалансировать две цели, если любая операция АЛУ, которой не предшествует префикс, использует восемь битов для выбора одного из шестнадцати регистров, но имеет операцию АЛУ, которая следует сразу за префиксом, использует некоторые биты в префиксе вдоль с восьмеркой из следующей инструкции, чтобы обеспечить независимый выбор как источника, так и адресата из полного набора 32. Инструкции, использующие верхние регистры, заняли бы два слова/цикла, а не один, но в некоторых случаях такой компромисс может быть вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса]. но в некоторых случаях такой компромисс может оказаться вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса]. но в некоторых случаях такой компромисс может оказаться вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса].
Использование инструкций, состоящих из нескольких слов, усложнит некоторые аспекты дизайна, но может уменьшить потребность в принятии других сложных решений.
Этот парень лучше всех разбирается в жестком подключении жестко закодированной части декодера, что объясняет линии управления для жестко запрограммированного процессора: http://minnie.tuhs.org/CompArch/Tutes/week03.html Как видите, ваш выбор в кодах операций действительно влияет на сложность логики декодирования.
пользователь 253751
Пэббельс