Загрузите половину слова и загрузите байт в один цикл данных - PullRequest
5 голосов
/ 04 марта 2010

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

альтернативный текст http://img214.imageshack.us/img214/7107/99897101.jpg

Это на самом деле довольно реалистично вопрос; большинство систем памяти полностью основанный на словах, и индивидуальный байты обычно имеют дело только с внутри процессора. Когда вы видите «Ошибка шины» на многих компьютерах, это часто означает, что процессор пытался чтобы получить доступ к адресу памяти, который был не выровнены по словам, а Система памяти вызвала исключение. Во всяком случае, потому что байтовые адреса могут не быть кратным 4, мы не можем пройти их в память напрямую. Однако мы все еще может получить любой байт, потому что каждый байт может быть найден в некотором слово, и все адреса слова кратно 4. Итак, первое, что мы сделать, чтобы убедиться, что мы получаем право слово. Если мы возьмем высокие 30 бит адрес (т.е. ALUresult [31-2]) и объединить их с двумя 0 битами в нижний конец (это то, что «осталось сдвиг 2 ”блок действительно делает), мы иметь байтовый адрес слова, содержит нужный байт. Это только собственный адрес байта, округленный до кратного 4. Это изменение означает, что теперь lw будет также округлять адреса до кратных 4, но это нормально, так как не выровненные адреса не будет работать на LW в любом случае с этим блок памяти. Хорошо, теперь мы получаем данные Слово назад из памяти. Как мы получаем Байт, который мы хотим из этого? Что ж, обратите внимание, что байтовое смещение байта в слове просто дано младшие 2 бита байта адрес. Итак, мы просто используем эти 2 биты для выбора соответствующего байта из слова с помощью мультиплексора. Обратите внимание использование байтовой байтовой последовательности подходит для MIPS. Далее мы должен обнулить байт до 32 биты (т. е. просто объединить его с 24 нули в его высоком конце), потому что Проблема указывает на это. На самом деле, это была небольшая ошибка в вопрос: на самом деле, lbu инструкция обнуляет байт, но LB знак-расширяет его. Ну что ж. Наконец, мы должны расширить MemtoReg-контролируемый мультиплексор, чтобы принять один новый вход: расширенный нулем байт для Футляр. Элемент управления MemtoReg Сигнал должен быть расширен до 2 бит. исходные случаи 0 и 1 изменяются на 00 и 01 соответственно, и мы добавляем новый случай 10, который используется только в случае фунтов

Я не совсем понимаю, как это работает даже после прочтения объяснения, особенно о сдвиге влево. Результат ALU на 2 даст адрес байта ... как это возможно ?? так что, если бы я хотел загрузить половину слова, то я бы сделал один сдвиг влево, и я бы получил адрес половины слова ?? Что может быть лучше сделать загрузку байта, загрузить половину слова, изменив память данных? (вопрос выше ставит ограничения, которые мы не можем изменить в памяти данных)

1 Ответ

3 голосов
/ 04 марта 2010

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

Сдвиг влево результата ALU дает адрес слова, NOT адрес байта и учитывает неявное смещение вправо на два в маршрутизации сигнала. Конечный результат - это просто два младших бита результата ALU, которые маскируются (обнуляются) перед отправкой в ​​память. Два младших бита значения ALU передаются по потоку из памяти в байтовый мультиплексор, позволяя слову памяти читать произвольные байты.

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

...