Каковы общие способы, которыми декодеры инструкций справляются с использованием констант над регистрами в микроконтроллерах?

В частности, если ассемблерная инструкция имеет константу в качестве одного из операндов, как декодер инструкций передаст ее в АЛУ? До сих пор я думал о трех способах сделать это.

  • Передайте константу в свободный регистр, а затем передайте адрес этого регистра в АЛУ.
  • Передайте константу на той же шине, что и адрес, и отдельно активируйте некоторую 1-битную шину, чтобы обозначить ее как константу.
  • Иметь полностью отдельную шину для константы и 1-битную разрешающую шину.

Пока я вижу недостатки у всех трех вышеперечисленных методов.

  • Первый заставляет отслеживать «занятые» регистры и требует больше тактовых импульсов за цикл, что замедляет работу ЦП.

  • Второй ограничивает размер константы размером адресной шины.

  • Третий увеличивает сложность внутренней схемы.

Используют ли настоящие процессоры в микроконтроллерах какой-либо из этих способов? Или есть другие решения? Какие они, если да?

Блок-схемы простых процессоров MIPS обычно мультиплексируют входные данные ALU, чтобы выбирать между результатом выборки из регистрового файла и битами, декодированными из работы инструкции. (Что будет немедленным для инструкции I-типа.) например. этот вопрос о другом показывает один, который выглядит как неконвейерная версия MIPS. (Безусловное расширение знака или повторное обнуление являются частью мультиплексора для побитовых инструкций.) Неконвейерный MIPS устраняет сложность обходной переадресации.

Peter Cordes 21.03.2022 19:51

@PeterCordes большое спасибо за информацию, к сожалению, слишком много терминологии, которую вы используете, мне неясно. Afaik MIPS - это архитектура чипа, но я не уверен, что mux означает мультиплекс и что подразумевается под безусловным расширением безусловного знака или что такое инструкции I-типа. Можно ли объяснить это немного более дружелюбно для начинающих?

Herbal Tea 21.03.2022 20:10

Машинный код MIPS намеренно разработан для использования нескольких простых форматов (в отличие от 8-битных микроконтроллеров, которым часто требуется больше декодирования). Все коды операций, использующие немедленный тип, являются «I type», с 16 непосредственными битами в одном и том же месте в слове инструкции. . Погуглите, если хотите. В некоторых из этих инструкций используется непосредственное расширение нуля вместо расширения знака (в отличие от RISC-V), поэтому мне показалось странным, что блок-схема просто имеет блок «расширения знака» на этом пути без видимого управляющего сигнала, чтобы сделать это зависит от того, какая инструкция. (И да, мультиплексор — это мультиплексор в схемной терминологии.)

Peter Cordes 21.03.2022 20:59

нет такой вещи, как свободный регистр, процессор не может знать. Суть в том, что вы просто проектируете его. Вы уже мультиплексируете регистры и для некоторых архитектур операнды на основе памяти, так что мультиплексируйте сразу или три...

old_timer 22.03.2022 00:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Pass the constant in the same bus as the address would go and separately trigger some enable 1-bit bus to signify its a constant.

То, что вы описываете как 1-битную индикацию, называется управляющим сигналом, и он используется мультиплексорами для выбора правильного входа, когда потенциально доступно более одного. MUX — это селектор — он выбирает между двумя (или более) вариантами.

В выражениях языка C мы могли бы написать, что ALUIn2 = Signal ? RegData2 : immediate, что означает, что под управлением 1-битного логического значения Signal выберите либо какое-либо значение данных регистра, либо непосредственное. Мы бы предшествовали этому с помощью RegData2 = reg[source2Field] и immediate = signExtend(immField). Эта ?: операция — это то, что делают мультиплексоры: выберите один из двух (или более) вариантов.

При выборе, сделанном в MUX, часто один вход совершенно неприменим, а другой полностью подходит. В то время как управляющий сигнал является динамическим, аппаратное обеспечение выполняет параллельные вычисления нескольких вариантов. Он не ждет, пока не узнает, какой из них является правильным выбором для текущей инструкции, вместо этого он вычисляет множество возможных вещей, а затем выбирает правильный позже. Таким образом, ряд параллельных вычислений игнорируется/отбрасывается каждый цикл.

Однако адресная шина, вероятно, будет обойдена, чтобы отправлять эти элементы данных непосредственно в ALU (непосредственно по модулю мультиплексоров и другой логики, поиска и/или расширения знака). Когда элемент данных передается между двумя компонентами, мы обычно не думаем об этом как о шине, а скорее о проводной связи. Однако это может соответствовать некоторому определению автобуса.

Ограничение на ширину константы по-прежнему будет присутствовать, но это будет очевидно в архитектуре набора инструкций и кодировках машинного кода, а также в проблемах, с которыми могут работать программы. Аппаратное обеспечение просто должно было бы приспособиться к наибольшему постоянному размеру набора инструкций, который обычно будет таким же, как размер данных (который обычно совпадает с размером адреса).


Have a completely separate bus for a constant, and a 1-bit enable bus.

Некоторые процессоры уже имеют шину для одного или другого входа ALU. Константе будет предоставлен доступ к этой шине.

Другие процессоры будут иметь более простую проводку, подающую на входы ALU, но эта проводка будет выбирать между несколькими вариантами, и, как я сказал выше, ее можно рассматривать как нечто вроде шины.


Pass the constant into a free register and then pass the address of that register to the ALU.

  • Процессор на самом деле не отслеживает свободные/занятые регистры — это работа (машинного кода) программы. (это относится к архитектурным регистрам, а не к регистрам переименования; также некоторые процессоры в целом отмечают, использовался ли какой-либо из регистров с плавающей запятой, чтобы ускорить переключение контекста для процессов, которые не используют числа с плавающей запятой).

Другие вопросы по теме