Загрузите половину слова и загрузите байт в канал данных за один цикл

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

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

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

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


person aherlambang    schedule 03.03.2010    source источник


Ответы (1)


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

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

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

person Charles Steinkuehler    schedule 03.03.2010
comment
так что дело в том. 1. Будет ли это работать без сдвига влево на 2? 2. Если я хочу сделать полуслова, мне нужно иметь мультиплексор 2x1 и использовать младший бит в качестве управляющего сигнала? - person aherlambang; 04.03.2010
comment
1) Сдвига влево на два действительно нет. Имеется сдвиг вправо на два (вызванный отбрасыванием двух младших битов: ALUResult [31-2]), а сдвиг влево на два просто возвращает биты в то же место (с нулем в двух младших битах). Было бы гораздо очевиднее просто замаскировать два младших бита. 2) Чтобы сделать выровненное чтение полуслова, вы должны использовать ALUresult [1] для управления 16-битным мультиплексором 2 к 1. Вы не можете поддерживать произвольное чтение полуслова за один цикл с помощью этой памяти, потому что один из невыровненных случаев (адрес LSB = 11) требует байтов из двух разных 32-битных слов (то есть: два доступа к памяти). - person Charles Steinkuehler; 12.03.2010