
- •Часть 1
- •4. Классификация микропроцессоров, основные варианты их архитектуры и структуры
- •Общая структура и принципы функционирования
- •2. Система команд микропроцессоров и способы адресации операндов
- •3.Реализация и организация памяти
- •Организация памяти
- •4. Классификация микропроцессоров, основные варианты их архитектуры и структуры
- •Ic (16 Кбайт)
3.Реализация и организация памяти
В современных микропроцессорных системах реализуется иерархическая структура памяти, которая состоит из несколько видов ЗУ различного объема и быстродействия. Основными видами используемых ЗУ являются:
регистровые ЗУ,
оперативные ЗУ,
постоянные (программируемые и репрограммируемые) ЗУ,
промежуточная кэш-память,
внешние ЗУ.
Содержание информации, хранящейся в различных видах ЗУ, определяется ее назначением и частотой использования в процессе работы микропроцессора.
Регистровое ЗУ
Для хранения операндов и промежуточных результатов используется блок регистров общего назначения (РОН), который вместе со схемами адресации и выборки образует регистровое запоминающее устройство (РЗУ), входящее в состав микропроцессора. Объем РЗУ для различных типов микропроцессоров составляет от нескольких единиц до сотен байт. В большинстве микропроцессоров РЗУ содержит 8, 16 или 32 регистра, обращение к которым осуществляется с помощью регистровой адресации. Регистры работают с тактовой частотой процессора, запись и считывание операндов производится за один такт. Регистры РЗУ (все или часть) служат также для хранения адреса при выполнении косвенно-регистровой адресации.
Оперативное и постоянное ЗУ
Основной массив обрабатываемых данных и выполняемая программа их обработки хранятся в ОЗУ и ПЗУ, подключенных к системной шине (рис.1.1).
Обычно ОЗУ реализуются на базе микросхем памяти с произвольной выборкой RAM (Random Access Memory) статического (SRAM – Static RAM) или динамического (DRAM – Dynamic RAM) типа. При использовании микросхем DRAM в состав микропроцессорной системы включается контроллер динамической памяти, выполняющий периодическую регенерацию (перезапись) содержимого ОЗУ, которое хранится в виде электрического заряда на запоминающих емкостях в элементах памяти. Для восстановления заряда этих емкостей контроллер производит необходимое число тактов перезаписи содержимого ячеек динамического ОЗУ в процессе периодически выполняемых циклов регенерации. В течении цикла регенерации динамическое ОЗУ является недоступным для чтения-записи со стороны процессора и других устройств системы. В ряде современных микропроцессоров контроллер динамического ОЗУ реализуется на одном кристалле с процессором.
При одинаковом уровне технологии изготовления микросхемы DRAM имеют в несколько раз больший объем памяти и более низкую стоимость, чем микросхемы SRAM. Поэтому для реализации ОЗУ большой емкости чаще используются микросхемы DRAM, несмотря на необходимость использования контроллеров для регенерации хранящейся информации и связанных с этим потерь производительности системы.
Хранение информации в ОЗУ обеспечивается только при включенном источнике питания. Поэтому после включения питания в системе производится процедура инициализации, в процессе которой производится загрузка в ОЗУ информации, необходимой для начала работы системы.
Как отмечалось в разделе 1, максимальный объем адресуемой памяти определяется разрядностью шины адреса и составляет для 32-разрядных микропроцессоров 4 Гбайт и более. В современных микропроцессорных системах ОЗУ имеет емкость до нескольких сотен Мбайт, занимая часть адресного пространства. При этом в ряде типов систем (персональных компьютерах, рабочих станциях, серверах) предусмотрена модульная реализация ОЗУ, которая позволяет увеличивать его объем путем подключения дополнительных модулей статической или динамической памяти. Типичными примерами таких модулей являются стандартные модули динамической памяти - SIMM (Single In-line Memory Module) и DIMM (Double In-line Memory Module), используемые во многих системах для реализации ОЗУ необходимой емкости.
Для чтения и записи данных процессор реализует циклы обращения к ОЗУ по системной шине. Типичный цикл обращения к ОЗУ содержит следующие фазы:
установка на шине адреса необходимого адреса и выдача на шину управления адресного строба (AS или ALE) - сигнала, инициализирующего обмен,
выдача на шину управления сигналов, определяющих тип цикла обращения: чтение (сигнал RD) или запись (сигнал WR),
получение от ОЗУ по шине управления сигнала готовности к обмену (READY или DTACK),
прием-передача считываемых или записываемых данных (команд) по шине данных.
Таким образом, реализация обращения к системной шине требует выдачи и приема нескольких сигналов управления обменом, которые передаются по шине управления.
В зависимости от способа организации обмена реализация цикла обращения занимает от 2 до 4 тактов системной шины. Тактовая частота системной шины может существенно отличаться от тактовой частоты микропроцессора (см. раздел 1.1). При современном уровне микроэлектронной технологии тактовые частоты микропроцессоров могут превышать 1 ГГц, а возможности технологии изготовления печатных плат обеспечивают возможности передачи данных с частотой до 133 Мгц. Поэтому обращение к ОЗУ требует значительно большего времени, чем выборка данных из РЗУ.
Во многих микропроцессорных системах при передаче данных по системной шине выполняется контроль четности. При этом одновременно с передаваемыми данными пересылается контрольный бит, указывающий на четное или нечетное число единиц в этих данных. В ряде случаев контроль осуществляется и для адреса передаваемых данных. Обычно реализуется побайтовый контроль, при котором передается бит четности для каждого байта данных или адреса. Принимающее устройство проверяет четность полученных байтов и сравнивает их со значением принятых контрольных битов. Различие в четности указывает на наличие ошибок в процессе передачи. В этом случае формируется сигнал прерывания, вызывающий остановку выполнения программы и переход к специальной подпрограмме обслуживания, обеспечивающей выдачу информации о возникшей ошибке.
Контроль четности выявляет все единичные сбои (ошибки в значении одного из битов), а также те многократные сбои, которые вызывают изменение четности. Как показывает практика, использование контроля четности позволяет выявить 80-90% ошибок, возникающих при передаче данных из-за воздействия помех, нарушения контактов в соединениях и других причин.
В системах, оперирующих с 8-, 16- и 32-разрядными данными, часто организуются отдельные разделы ОЗУ (банки) для хранения младших, старших или промежуточных байтов. Поэтому в ряде микропроцессоров формируются отдельные сигналы разрешения выдачи данных BE (Byte Enable) для выборки в ОЗУ тех или иных байтов. При адресации 16-разрядных данных используется два сигнала BE1-0 (выборка младшего или старшего байта), при адресации 32-разрядных данных – четыре сигнала BE3-0, при 64-разрядной системной шине – восемь сигналов BE7-0. Фактически, сигналы BE заменяют младшие 1, 2 или 3 разряда адреса, обеспечивая их дешифрацию в отдельные сигналы разрешения выборки для каждого байтового банка. Сигналы BE выдаются на шину адреса вместе с остальными (старшими) разрядами адреса.
Наряду с ОЗУ память микропроцессорных систем обычно включает ПЗУ, которое занимает определенные разделы адресуемого пространства. Содержимое ПЗУ сохраняется при отключении напряжения питания и поэтому может быть использовано сразу при включении системы. В зависимости от назначения системы включенное в нее ПЗУ может выполнять различные функции и, соответственно, иметь разную емкость памяти и варианты реализации. В большинстве систем ПЗУ служит для хранения программы начальной инициализации (загрузки) систем (Bootstrap ROM), программ тестирования и диагностики, а также некоторых других служебных программ. В ряде специализированных систем ПЗУ используется для хранения таблиц постоянных коэффициентов и констант, используемых при обработке данных, или для хранения подпрограмм, обеспечивающих стандартные процедуры обработки. Имеется также большой класс специализированных микропроцессоров - микроконтроллеров, ориентированных на реализацию определенных алгоритмов управления различными объектами. Программа, обеспечивающая реализацию этих алгоритмов, обычно записывается в ПЗУ, и в процессе работы микроконтроллера производится только ее считывание. В зависимости от назначения в микропроцессорных системах используются различные типы ПЗУ.
Масочно-программируемые ПЗУ (ROM – Read-Only Memory) содержат информацию, которая записывается в них в процессе изготовления микросхем и в дальнейшем не может изменяться. При производстве этих микросхем используется специально разрабатываемый комплект фотошаблонов (масок), определяющих содержание хранящейся в них информации. Поэтому выпуск микросхем с памятью ROM возможен только по соответствующему заказу, который производитель получает от пользователя. Производство и применение таких микросхем экономически эффективно только при значительном объеме их выпуска.
Программируемые пользователем ПЗУ содержат информацию, которую заносит в них пользователь с помощью специального программатора. При использовании однократно-программируемых ПЗУ (OTPROM – One-Time Programmable ROM) запись в них возможна только один раз. Репрограммируемые ПЗУ (EPROM –Electrically Programmable ROM) позволяют производить стирание ранее записанной информации путем облучения микросхемы ультрафиолетовым светом и затем записывать в них новую информацию с помощью программатора. Такие микросхемы помещаются в специальный корпус с окном из кварцевого стекла, пропускающего ультрафиолетовое излучение. В электрически репрограммируемых ПЗУ (EEPROM –Electrically Erased Programmable ROM) стирание и запись новой информации осуществляется с помощью электрических сигналов. Разновидностью EEPROM является флеш-память (Flash-memory), в которой электрическое стирание реализуется не в каждой отдельной ячейке памяти последовательно, а одновременно для всех ячеек или их блоков. Современные модификации флэш-памяти обеспечивают возможность ее репрограммирования без удаления из системы, а непосредственно на плате или на кристалле микроконтроллера (ISP – In-System Programming). При использовании программируемого ПЗУ пользователь может самостоятельно ввести в них необходимую информацию (программы или массивы постоянных данных). При включении в систему репрограммируемого ПЗУ можно, в случае необходимости, изменять хранящуюся в них информацию, поместив микросхему памяти в программатор или выполнив перепрограммирование в составе системы (в режиме ISP).
Обращение процессора к ПЗУ выполняется так же, как к ОЗУ, с учетом того, что этот вид памяти реализует только цикл чтения.
Кэш-память
Кэш-память представляет собой быстродействующую буферную память ограниченного объема, которая располагается между процессором и ОЗУ. Обычно кэш-память размещается непосредственно на кристалле микропроцессора или реализуется в виде отдельных микросхем памяти высокого быстродействия, которые размещаются в общем корпусе с кристаллом микропроцессора. При этом цикл обращения к кэш-памяти производится за 1-2 рабочих такта микропроцессора, то есть намного быстрее, чем обращение к ОЗУ по системной шине.
В процессе работы микропроцессорной системы отдельные блоки информации копируются из ОЗУ в кэш-память. Процедура загрузки информации из ОЗУ в кэш-память называется кэширование. Когда процессор обращается за командой или данными, то сначала проверяется их наличие в кэш-памяти. Если необходимая информация находится там, то она быстро извлекается, так как обращение к кэш-памяти производится с тактовой частотой процессора. Такой случай обращения называют кэш-попаданием. Если необходимая информация в кэш-памяти отсутствует, то она выбирается из основной памяти и одновременно заносится в кэш-память. Такой случай называют кэш-пpомахом.
Повышение быстродействия вычислительной системы достигается в том случае, когда кэш-попадания реализуются намного чаще, чем кэш-пpомахи. Высокий процент кэш-попаданий обеспечивается благодаря тому, что в большинстве случаев программы обращаются к ячейкам памяти, расположенным вблизи от ранее использованных. Это свойство, которое называют локальностью программ, обеспечивает эффективность использования кэш-памяти.
В системах может использоваться общая кэш-память для команд и данных или две отдельных кэш-памяти для их хранения. В настоящее время на кристалле микропроцессора обычно размещаются две отдельные кэш-памяти для команд и данных, каждая из которых имеет объем до нескольких десятков Кбайт. Кроме этой внутренней кэш-памяти 1-го уровня (L1) часто используется дополнительная кэш-память 2-го уровня (L2) большей емкости (до нескольких Мбайт), в которой хранятся как команды, так и данные. Обычно эта память реализуется в виде отдельных микросхем, которые монтируются в общем корпусе с кристаллом микропроцессора. Однако достижения микроэлектронной технологии обеспечили возможность изготовления кэш-памяти 2-го уровня на общем кристалле с микропроцессором и кэш-памятью 1-го уровня.
Рис.1.8. Типовая структура кэш-памяти и реализация обращения к ней
Типовая структура кэш-памяти, реализуемой в современных микропроцессорах, показана на рис.1.8. Эта память ассоциативного типа, состоящая из строк длиной в несколько десятков байт (обычно16, 32 или 64 байта). Строки объединены в наборы, каждый из которых содержит несколько строк (обычно 2, 4 или 8). Число таких наборов зависит от емкости реализуемой кэш-памяти. Например, кэш-память емкостью 16 Кбайт, представленная на рис.1.8, содержит 128 наборов S127-0 по четыре строки L3-0 длиной 32 байта B31-0 каждая.
При обращении к кэш-памяти сформированный микроконтроллером адрес представляется как в виде трех полей (рис.1.8): поле тега TAG, поле SET, указывающее номер набора, и поле BYTE, задающее номер байта в строке. При обращении к кэш-памяти содержимое поля SET определяет номер выбираемого набора. Значения старших разрядов адреса (поле TAG) сравниваются с содержимым полей тегов (tag0-tag3) в строках выбранного набора. Если значение TAG совпадает с содержимым тега одной из строк, то фиксируется кэш-попадание, и производится выборка из этой строки операнда, адресуемого полем BYTE. Если совпадение не обнаружено, то фиксируется кэш-промах. В этом случае из основной памяти выбирается строка (32 байт), адресуемая разрядами A31-5 адреса, которая размещается в одной из строк выбранного набора. Заполнение кэш-памяти производится построчно, то есть в случае кэш-пpомаха из основной памяти копируется целая строка, включающая адресованный операнд. Пpи этом обновляется строка в наборе, номер которого определяется полем SET сформированного физического адреса. Старшие разряды адреса (поле TAG) заносятся в поле tag соответствующей строки кэш-памяти и становится атрибутом данной строки.
Пересылка строк между кэш-памятью и ОЗУ выполняется по системной шине с помощью пакетных циклов, которые позволяют заполнить строку за минимальное количество тактов. Для ускорения обмена в системах с кэш-памятью обычно используется системная шина увеличенной разрядности: 64 или 128 бит. Использование пакетных циклов и системной шины повышенной разрядности обеспечивает достаточно быстрое обновление содержимого кэш-памяти.
Нормальная работа микропроцессорной системы с кэш-памятью обеспечивается соответствующими механизмами, которые поддерживают когерентность - соответствие содержимого ОЗУ и кэш-памяти. Это соответствие достигается с помощью механизмов сквозной записи (Write-Through) или обратной записи (Write-Back).
При сквозной записи выполняется одновременное изменение содержимого кэш-памяти и ОЗУ. Таким образом, при любом цикле записи, даже в случае кэш-попадания, производится обращение к основной памяти по системной шине. Данное обстоятельство существенно снижает производительность системы, так как циклы обращения по этой шине выполняются с тактовой частотой системной платы, которая значительно ниже тактовой частоты процессора.
При обратной записи изменение содержимого строки кэш-памяти вызывает установку признака модификации M=1. При обновлении содержимого кэш-памяти ее строки, имеющие значение признака M=1, переписываются обратно в основную память. Таким образом, обращение к основной памяти в циклах записи производится только в случае кэш-промаха. При использовании кэш-памяти значительной емкости в режиме обратной записи процессор может достаточно долго работать без обращения к ОЗУ. Этот механизм наиболее часто используется в кэш-памяти современных микропроцессоров, хотя многие из них могут реализовать как обратную, так и сквозную запись.
Следует отметить, что для кэш-памяти команд, из которой производится только считывание кодов, не требуется поддержание когерентности. Поэтому механизмы сквозной и обратной записи реализуются только для кэш-памяти данных или общей кэш-памяти команд и данных.
Каждая кэш-память имеет собственную служебную память, где хранятся биты, характеризующие содержимое ее строк: биты обращения, используемые для определения строки, содержимое которой будет обновляться, и биты состояния (бит модификации M, бит достоверности V и другие), с помощью которых обеспечивается когерентность содержимого строки в кэш-памяти и ОЗУ.
Если при чтении произошел кэш-пpомах, и кэширование данной области памяти разрешено, то производится обновление содержимого одной из строк набора, заданного полем SET адреса, в которую вводится информация из основной памяти. Новая информация замещает ранее имевшуюся в данной строке. В первую очередь замещается содержимое незаполненной («пустой») строки или недостоверной строки, содержание которой было аннулировано специальной командой. Такие строки имеют значение бита достоверности V=0. Если в данном наборе нет недостоверной (“пустой”) строки, то производится удаление из кэш-памяти содержимого строки, которая дольше всего оставалась невостребованной.
Обычно используемый алгоритм обновления содержимого заполненных строк называется "замещение менее используемой информации" (LRU - Least Recently Used) и реализуется с помощью битов обращения. Рассмотрим реализацию этого алгоритма для кэш-памяти, наборы которой содержат по четыре строки. В этом случае в служебной памяти для каждого набора хранятся три бита обращения b0-b2 (биты LRU), значения которых определяют выбор строки, замещаемой в данном наборе при кэш-промахе.
Рис.1.9. Установка битов LRU при обращении к строкам кэш-памяти
При инициализации процессора и очистке кэш-памяти биты LRU всех наборов кэш-памяти сбрасываются в 0. В ходе работы процессора значения битов b0-b2 устанавливаются в соответствии с тем, к каким из строк набора производились последние обращения (рис.1.9). Если в данном наборе последнее обращение выполнялось к одной из пары строк L0 или L1, устанавливается b0=1, если к L3 или L4, то устанавливается b0=0. Биты b1 и b2 указывают, к какой из строк пары L1-L2 и L3-L4 осуществлялось последнее обращение. Значение b1=0 устанавливается при обращении к L0, значение b1=1 - при обращении к L1. Соответственно, значение b2=0 или 1 устанавливается при обращении к строке L2 или L3. В соответствии с алгоритмом LRU для замены выбирается пара строк, к которым не производилось последнее обращение, а в этой паре замене подлежит строка, к которой не производилось последнее обращение. Выбранная таким образом строка считается дольше всего неиспользуемой в данном наборе, поэтому ее содержимое замещается строкой, выбираемой из ОЗУ при кэш-промахе.
Данное описание соответствует использованию наборов из четырех строк, что чаще всего реализуется в кэш-памяти микропроцессоров. Для кэш-памяти, содержащей две строки в наборе, требуется только один бит LRU для каждого набора, который принимает значение b0=0 при обращении к строке L0, и b0=1 при обращении к L1.
При использовании кэш-памяти с обратной записью когерентность содержимого ОЗУ и кэш-памяти обеспечивается операционной системой, контролирующей значение битов состояния строки при обращении к внешней памяти. Это особенно важно в мультипроцессорных системах, где несколько микропроцессоров могут использовать общее ОЗУ, реализуя захват системной шины (прямой доступ к памяти, см. раздел 1).
Если выполняется захват системной шины другим процессором (активным устройством) в мультипроцессорной системе, то отключаемый от шины процессор продолжает выполнение команд и обработку данных, содержащихся в кэш-памяти. Активный процессор может обратиться к данным, копии которых уже находятся в кэш-памяти процессора, отключенного от системной шины. Поэтому необходимо принять меры для обеспечения идентичности копий данных, используемых различными процессорами. Такие меры реализуются с помощью специальных средств, выполняющих снуппинг (snoop) - слежение за содержимым кэш-памяти разных процессоров, входящих в систему. При этом отключенный от системной шины процессор принимает адреса, выдаваемые на адресные линии активным процессором. Если этот адрес совпадает с адресом данных, хранящихся в одной из заполненных строк кэш-памяти данных отключенного процессора, то выполняются следующие процедуры. Если активный процессор производил запись по данному адресу, то содержимое соответствующей строки в отключенном от шине процессоре аннулируется (устанавливается значение бита V=0). Если активный процессор производил чтение по адресу модифицированной строки, имеющей значение бита модификации M=1, то отключенный процессор выполняет специальный цикл выдачи адресованных данных на внешнюю шину, чтобы активный процессор получил их модифицированный вариант.
Специальные команды управления процессором позволяют производить очистку кэш-памяти (аннулирование содержимого строк) путем установки значений бита
достоверности V=0. При этом для обеспечения когерентности содержимое модифицированных строк переписывается в ОЗУ.