Возникла проблема, связанная с внедрением байта загрузки в канал данных с одним циклом без необходимости изменения памяти данных, и решение было ниже.
альтернативный текст 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 даст адрес байта ... как это возможно ?? так что, если бы я хотел загрузить половину слова, то я бы сделал один сдвиг влево, и я бы получил адрес половины слова ?? Что может быть лучше сделать загрузку байта, загрузить половину слова, изменив память данных? (вопрос выше ставит ограничения, которые мы не можем изменить в памяти данных)