В частности, если ассемблерная инструкция имеет константу в качестве одного из операндов, как декодер инструкций передаст ее в АЛУ? До сих пор я думал о трех способах сделать это.
Пока я вижу недостатки у всех трех вышеперечисленных методов.
Первый заставляет отслеживать «занятые» регистры и требует больше тактовых импульсов за цикл, что замедляет работу ЦП.
Второй ограничивает размер константы размером адресной шины.
Третий увеличивает сложность внутренней схемы.
Используют ли настоящие процессоры в микроконтроллерах какой-либо из этих способов? Или есть другие решения? Какие они, если да?
@PeterCordes большое спасибо за информацию, к сожалению, слишком много терминологии, которую вы используете, мне неясно. Afaik MIPS - это архитектура чипа, но я не уверен, что mux означает мультиплекс и что подразумевается под безусловным расширением безусловного знака или что такое инструкции I-типа. Можно ли объяснить это немного более дружелюбно для начинающих?
Машинный код MIPS намеренно разработан для использования нескольких простых форматов (в отличие от 8-битных микроконтроллеров, которым часто требуется больше декодирования). Все коды операций, использующие немедленный тип, являются «I type», с 16 непосредственными битами в одном и том же месте в слове инструкции. . Погуглите, если хотите. В некоторых из этих инструкций используется непосредственное расширение нуля вместо расширения знака (в отличие от RISC-V), поэтому мне показалось странным, что блок-схема просто имеет блок «расширения знака» на этом пути без видимого управляющего сигнала, чтобы сделать это зависит от того, какая инструкция. (И да, мультиплексор — это мультиплексор в схемной терминологии.)
нет такой вещи, как свободный регистр, процессор не может знать. Суть в том, что вы просто проектируете его. Вы уже мультиплексируете регистры и для некоторых архитектур операнды на основе памяти, так что мультиплексируйте сразу или три...
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.
Блок-схемы простых процессоров MIPS обычно мультиплексируют входные данные ALU, чтобы выбирать между результатом выборки из регистрового файла и битами, декодированными из работы инструкции. (Что будет немедленным для инструкции I-типа.) например. этот вопрос о другом показывает один, который выглядит как неконвейерная версия MIPS. (Безусловное расширение знака или повторное обнуление являются частью мультиплексора для побитовых инструкций.) Неконвейерный MIPS устраняет сложность обходной переадресации.