Реклама:
Управление микрокомандами - микроархитектура Mic-1

Рис. 4.4. Формат микрокоманды для Мю-1

Порядок групп в принципе произволен, хотя мы долго и тщательно его подбирали, чтобы избежать пересечений на диаграмме, показанной на рис. 4.5. Подобные пересечения на диаграммах часто соответствуют пересечениям проводов на микросхемах. Они значительно затрудняют разработку, и их лучше сводить к минимуму.

Рис. 4.5. Полная диаграмма микроархитектуры Міс-1

Управление микрокомандами - микроархитектура Mic-1

Управление микрокомандами - микроархитектура Мю-1

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

Контроллер последовательности в каждом цикле должен выдавать следующую информацию:

♦ состояние каждого сигнала управления в системе;

♦ адрес микрокоманды, которая будет выполняться следующей.

Рисунок 4.5 представляет собой подробную диаграмму полной микроархитектуры нашей машины, которую мы назвали Mic-1. Хотя на первый взгляд она может показаться внушительной, ее нужно подробно изучить. Если вы разберетесь во всех блоках и их связях, изображенных на этом рисунке, вам легче будет понять структуру уровня микроархитектуры. Диаграмма состоит из двух частей: тракта данных (слева), который мы уже подробно обсудили, и блока управления (справа), который мы рассмотрим сейчас.

Самой большой и самой важной частью блока управления является управляющая память. Удобно рассматривать ее как память, в которой хранится вся микропрограмма, хотя иногда микропрограмма реализуется в виде набора логических вентилей. Мы будем называть ее управляющей памятью, чтобы не путать с основной памятью, доступ к которой осуществляется через регистры MBR и MDR. Функционально управляющая память представляет собой память, в которой вместо обычных команд хранятся микрокоманды. В нашем примере она содержит 512 слов; каждое слово состоит из одной Зб-разрядной микрокоманды, формат которой показан на рис. 4.4. В действительности не все эти слова нужны, но по ряду причин нам требуются адреса для 512 отдельных слов.

Управляющая память отличается от основной памяти тем, что команды, хранящиеся в основной памяти, выполняются в соответствии с их адресами (за исключением ветвлений), а микрокоманды - нет. Увеличение счетчика команд в листинге 2.1 означает, что команда, которая будет выполняться после текущей, располагается вслед за ней в памяти. Микропрограммы должны обладать большей гибкостью, поскольку последовательности микрокоманд обычно короткие и этим свойством не обладают. Вместо этого каждая микрокоманда сама указывает на следующую микрокоманду.

Поскольку управляющая память функционально представляет собой ПЗУ, ей нужны собственные адресный регистр и регистр данных. Ей не требуются сигналы чтения и записи, поскольку процесс считывания происходит постоянно. Мы назовем адресный регистр управляющей памяти MPC (Microprogram Counter - счетчик микропрограмм). Название не очень подходящее, поскольку микропрограммы не упорядочены явным образом, и понятие счетчика тут неуместно, но мы не можем пойти против традиций. Регистр данных мы назовем MIR (Micro-Instruction Register - регистр микрокоманд). Он содержит текущую микрокоманду, биты которой запускают сигналы управления, влияющие на работу тракта данных.

Регистр MIR, изображенный на рис. 4.5, содержит те же шесть групп сигналов, которые показаны на рис. 4.4. Группы Addr и J (то же, что JAM) контролируют выбор следующей микрокоманды. Мы обсудим их чуть позже. Группа ALU содержит 8 бит, которые позволяют выбрать функцию АЛУ и запустить схему сдвига. Биты С загружают отдельные регистры с шины С. Сигналы M управляют работой памяти.

Наконец, последние 4 бита запускают декодер, который определяет, значение какого регистра будет передано на шину В. В данном случае мы выбрали декодер с 4 входами и 16 выходами, хотя имеется всего 9 разных регистров. В более проработанной модели мог бы использоваться декодер, имеющий 4 входа и 9 выходов. Мы задействуем стандартную схему, чтобы не разрабатывать собственную. Использовать стандартную схему гораздо проще, и, кроме того, вы сможете избежать ошибок. Ваша собственная микросхема займет меньше места, но на ее разработку потребуется довольно длительное время, к тому же вы можете построить ее неправильно.

Схема, изображенная на рис. 4.5, работает следующим образом. В начале каждого цикла (фронт синхронизирующего сигнала на рис. 4.2) в регистр MIR загружается слово из управляющей памяти, которая на рисунке отмечена буквами MPC. Загрузка регистра MIR занимает период Aw, то есть первый подцикл (см. рис. 4.2).

Когда микрокоманда попадает в MIR, в тракт данных поступают различные сигналы. Значение определенного регистра помещается на шину В, а АЛУ узнает, какую операцию нужно выполнять. Все это происходит во время второго под-цикла. После периода Aw + Ar входные сигналы АЛУ стабилизируются.

После периода Ау стабилизируются сигналы N и Z АЛУ, а также выходной сигнал схемы сдвига. Затем значения N и Z сохраняются в двух одноразрядных триггерах. Эти биты, как и биты всех регистров, которые загружаются с шины С и памяти, сохраняются на фронте синхронизирующего сигнала, ближе к концу цикла тракта данных. Выходной сигнал АЛУ не сохраняется, а просто передается в схему сдвига. Работа АЛУ и схемы сдвига происходит во время подцикла 3.

После следующего интервала, Az, выходной сигнал схемы сдвига, пройдя через шину С, достигает регистров. Регистры загружаются в конце цикла на фронте синхронизирующего сигнала (см. рис. 4.2). Во время подцикла 4 происходит загрузка регистров и триггеров N и Z. Подцикл завершается сразу после окончания фронта, когда все значения сохранены, результаты предыдущих операций памяти доступны, регистр MPC загружен. Этот процесс продолжается снова и снова, пока вы не выключите компьютер.

Микропрограмме приходится не только управлять трактом данных, но и определять, какая микрокоманда должна выполняться следующей, поскольку микропрограммы не упорядочены в управляющей памяти. Вычисление адреса следующей микрокоманды начинается после загрузки регистра MIR. Сначала в регистр MPC копируется 9-разрядное поле NEXT_ADDRESS (следующий адрес). Пока происходит копирование, проверяется поле JAM. Если оно содержит значение ООО, то ничего больше делать не нужно, и когда копирование поля NEXT_ ADDRESS завершится, регистр MPC укажет на следующую микрокоманду.

Если один или несколько битов в поле JAM равны 1, то требуются еще некоторые действия. Если бит JAMN равен 1, то триггер N соединяется через схему ИЛИ со старшим битом регистра MPC. Если бит JAMZ равен 1, то триггер Z соединяется через схему ИЛИ со старшим битом регистра MPC. Если оба бита равны 1, они оба соединяются через схему ИЛИ с тем же битом. А теперь объясним, зачем нужны триггеры N и Z. Дело в том, что после фронта сигнала (и вплоть до спада) шина В больше не запускается, поэтому выходные сигналы АЛУ уже не могут считаться правильными. Сохранение флагов состояния АЛУ в регистрах

N и Z делает правильные значения установившимися и доступными для вычисления регистра MPC, независимо от того, что происходит вокруг АЛУ.

На рис. 4.5 блок, который выполняет это вычисление, помечен как "Старший бит". Он вычисляет следующую булеву функцию:

F= (CJAMZ И Z) ИЛИ (JAMN И N)) ИЛИ NEXT_ADDRESS[8]

Отметим, что в любом случае регистр MPC может принять только одно из двух возможных значений:

1. Значение NEXT_ADDRESS.

2. Значение NEXT_ADDRESS со старшим битом, соединенным операцией ИЛИ с логической единицей.

Других значений не существует. Если старший бит значения NEXTADDRESS уже равен 1, нет смысла использовать J AMN или JAMZ.

Отметим, что если все биты JAM равны 0, то адрес следующей команды - это просто 9-разрядный номер в поле NEXTADDRESS. Если бит JAMN или JAMZ равен 1, то существует два потенциально возможных адреса следующей микрокоманды (символы Ох говорят о том, что следующее за ними число дается в ше-стнадцатеричной системе счисления): адрес NEXT_ADDRESS и адрес NEXT_ ADDRESS, соединенный операцией ИЛИ со значением 0x100 (предполагается, что NEXT_ADDRESS < OxFF). Это иллюстрирует рис. 4.6. Текущая микрокоманда с адресом 0x75 содержит поле NEXT_ADDRESS = 0x92, причем бит JAMZ установлен в 1. Следовательно, следующий адрес микрокоманды зависит от значения бита Z, сохраненного при предыдущей операции АЛУ. Если бит Z равен 0, то следующая микрокоманда имеет адрес 0x92. Если бит Z равен 1, то следующая микрокоманда имеет адрес 0x192.

Управление микрокомандами - микроархитектура Mic-1

Рис. 4.6. Микрокоманда с битом JAMZ, равным 1, указывает на две потенциальные последующие микрокоманды

Третий бит в поле JAM - JMPC. Если он установлен, то 8 бит регистра MBR поразрядно связываются операцией ИЛИ с 8 младшими битами поля NEXT_ ADDRESS текущей микрокоманды. Результат отправляется в регистр MPC. На рис. 4.5 меткой "О" обозначена схема, которая выполняет операцию ИЛИ над MBR и NEXT_ADDRESS, если бит JMPC равен 1, и просто отправляет NEXT_ADDRESS в регистр MPC, если бит JMPC равен 0. Если бит JMPC равен 1, то младшие 8 бит поля NEXT_ADDRESS равны 0. Старший бит может быть 0 или 1, поэтому значение поля NEXT_ADDRESS обычно 0x000 или 0x100. Почему иногда используется значение 0x000, а иногда - 0x100, мы обсудим позже.

Возможность выполнять операцию ИЛИ над MBR и NEXT_ADDRESS и сохранять результат в регистре MPC позволяет реализовывать межуровневые переходы. Отметим, что биты, находящиеся в регистре MBR, позволяют задать любой адрес из 256 возможных. Регистр MBR содержит код операции, поэтому использование бита JMPC приведет к единственно возможному выбору следующей микрокоманды. Этот метод позволяет осуществлять быстрый переход к функции, соответствующей вызванному коду операции.

Чтобы разобраться в следующем материале этой главы, очень важно понимать принципы синхронизации машины, поэтому повторим их еще раз. Синхронизирующий сигнал делится на подциклы, хотя внешние изменения этого сигнала происходят только на спаде, с которого начинается цикл, и на фронте, который загружает регистры и триггеры N и Z. Посмотрите еще раз на рис. 4.2.

Во время подцикла 1, который инициируется спадом сигнала, адрес, находящийся в регистре MPC, загружается в регистр MIR. Во время подцикла 2 регистр MIR устанавливает сигналы, и на шину В загружается выбранный регистр. Во время подцикла 3 работают АЛУ и схема сдвига. Во время подцикла 4 стабилизируются значения шины С, шин памяти и АЛУ. На фронте сигнала загружаются регистры из шины С, загружаются триггеры N и Z, а регистры MBR и MDR получают результаты из памяти, начавшей функционировать в конце предыдущего цикла (если эти результаты вообще имеются). Как только регистр MBR получает свое значение, загружается регистр MPC. Это происходит где-то в середине отрезка между фронтом и спадом, но уже после загрузки регистров MBR и MDR. Регистр MPC может загружаться либо уровнем (но не фронтом) сигнала, либо через фиксированный отрезок времени после фронта. Все это означает, что регистр MPC не получает своего значения до тех пор, пока не будут готовы регистры MBR, N и Z, от которых он зависит. На спаде сигнала, когда начинается новый цикл, регистр MPC может обращаться к памяти.

Отметим, что каждый цикл является самодостаточным. В каждом цикле определяется, значение какого регистра должно поступать на шину В, что должны делать АЛУ и схема сдвига, куда нужно сохранить значение шины С и, наконец, каким должно быть следующее значение регистра MPC.

Следует сделать еще одно замечание по поводу рис. 4.5. До сих пор мы считали MPC регистром, который состоит из девяти бит и загружается на высоком уровне сигнала. В действительности этот регистр вообще не нужен. Все его входные сигналы можно непосредственно связать с управляющей памятью. Поскольку эти сигналы присутствуют в управляющей памяти на спаде синхронизирующего сигнала, когда выбирается и считывается регистр MIR, этого достаточно. Их не нужно хранить в регистре MPC. По этой причине MPC может быть реализован в виде виртуального регистра, который представляет собой просто место объединения сигналов и похож скорее на коммутационное поле, чем на настоящий регистр. Если MPC сделать виртуальным регистром, то процедура синхронизации значительно упрощается: в этом случае события происходят только на фронте и спаде сигнала. Но если вам проще считать MPC реальным регистром, то такой подход тоже вполне допустим.

Микрокоманды || Оглавление || Пример архитектуры набора команд - IJVM