В какое именно 32-разрядное значение (со знаком или без знака) превратится 8-разрядное значение регистра MBR, определяется тем, какой из двух сигналов управления (две белые стрелки под регистром MBR на рис. 4.1) установлен. Прямоугольник, обозначенный на рисунке пунктиром, показывает способность 8-разрядного регистра MBR действовать в качестве источника 32-разрядных слов для шины В.
Микрокоманды
Для управления трактом данных, изображенным на рис. 4.1, нам нужно 29 сигналов. Их можно разделить на пять функциональных групп:
♦ 9 сигналов для записи данных с шины С в регистры;
♦ 9 сигналов для разрешения передачи регистров на шину Вив АЛУ;
♦ 8 сигналов для управления АЛУ и схемой сдвига;
♦ 2 сигнала, которые указывают, что нужно осуществить чтение или запись через регистры MAR/MDR (на рисунке они не показаны);
+ 1 сигнал, который указывает, что нужно осуществить вызов из памяти через регистры PC/MBR (на рисунке также не показан).
Значения этих 29 сигналов управления определяют операции для одного цикла тракта данных. Цикл состоит из передачи значений регистров на шину В, прохождения этих сигналов через АЛУ и схему сдвига, передачи полученных результатов на шину С и записи их в нужный регистр (регистры). Кроме того, если установлен сигнал считывания данных, то в конце цикла после загрузки регистра MAR начинает работать память. Данные из памяти помещаются в MBR или MDR в конце следующего цикла, а использоваться эти данные могут в цикле, который идет после него. Другими словами, если считывание из памяти через любой из портов начинается в конце цикла k, то полученные данные не смогут использоваться в цикле k + 1 (только в цикле k + 2 и позже).
Этот процесс иллюстрирует рис. 4.2. Сигналы управления памятью выдаются только после загрузки регистров MAR и PC, которая происходит на фронте синхронизирующего сигнала незадолго до конца цикла 1. Будем считать, что память помещает результаты на шину памяти в течение одного цикла, поэтому регистры MBR и/или MDR могут загружаться на следующем фронте вместе с другими регистрами.
Другими словами, мы загружаем регистр MAR в конце цикла тракта данных и инициируем работу памяти сразу после этого. Следовательно, мы не можем ожидать, что результаты считывания окажутся в регистре MDR в начале следующего цикла, особенно если длительность импульса небольшая. Этого времени будет недостаточно. Поэтому между началом считывания из памяти и использованием полученного результата должен помещаться один цикл. Однако во время этого цикла могут выполняться не только передача слова из памяти, но и другие операции.
Предположение о том, что память работает в течение одного цикла, эквивалентно предположению, что доля кэш-попаданий (успешных обращений к кэш-памяти) составляет 100 %. Подобное предположение никогда не может быть истинным, но мы не будем здесь рассказывать о циклах памяти переменной длины, поскольку это не относится к теме книги.
Так как регистры MBR и MDR загружаются на фронте синхронизирующего сигнала вместе с другими регистрами, их можно считывать во время циклов, в течение которых осуществляется передача нового слова из памяти. Они возвращают старые значения, поскольку прошло еще недостаточно времени для того, чтобы они сменились новыми. Здесь нет никакой двусмысленности: до тех пор, пока новые значения не загрузятся в регистры MBR и MDR на фронте сигнала, предыдущие значения находятся там и могут использоваться. Отметим, что операции считывания могут проходить одна за другой, то есть в двух последовательных циклах (поскольку сам процесс считывания занимает только один цикл). Кроме того, обе памяти могут функционировать в одно и то же время. Однако попытка чтения и записи одного и того же байта одновременно приводит к неопределенным результатам.