| Каталог | Индекс раздела |
| Назад | Оглавление | Вперед |
В самом низу иерархической схемы на рис. 1.2 находится цифровой логический уровень, или аппаратное обеспечение компьютера. В этой главе мы рассмотрим различные аспекты цифровой логики, что должно стать основой для изучения более высоких уровней в последующих главах. Предмет изучения находится на границе информатики и электротехники, но материал является самодостаточным, поэтому предварительного ознакомления с аппаратным обеспечением и электротехникой не требуется.
Основные элементы, из которых конструируются цифровые компьютеры, чрезвычайно просты. Сначала мы рассмотрим эти основные элементы, а также специальную двузначную алгебру (булеву алгебру), которая используется при конструировании этих элементов. Затем мы изучим основные схемы, которые можно построить из вентилей в различных комбинациях, в том числе схемы для выполнения арифметических действий. Следующая тема о том, как комбинировать вентили для хранения информации, то есть о том, как построить память. После этого мы перейдем к процессорам и к тому, как процессоры на одной микросхеме обмениваются информацией с памятью и периферийными устройствами. Затем мы рассмотрим различные примеры, взятые из компьютерной индустрии.
Цифровые схемы могут конструироваться из небольшого количества простых элементов путем сочетания этих элементов в различных комбинациях. В следующих подразделах описаны эти основные элементы, показано, как их можно сочетать, а также введен математический метод анализа их работы.
Цифровая схема - это схема, в которой есть только два логических значения. Обычно сигнал от 0 до 1 В представляет одно значение (например, 0), а сигнал от 2 до 5 В - другое значение (например, 1). Напряжение за пределами указанных величин недопустимо. Крошечные электронные устройства, которые называются вентилями, позволяют получать различные функции от этих двузначных сигналов. Вентили лежат в основе аппаратного обеспечения, на котором строятся все цифровые компьютеры.
Описание принципов работы вентилей не является темой этой книги, поскольку относится к уровню физических устройств, который находится ниже уровня 0. Тем не менее мы очень кратко коснемся основного принципа, который не так уж и сложен. Вся современная цифровая логика основывается на том, что транзистор может работать как очень быстрый бинарный переключатель. На рис. 3.1, а изображен биполярный транзистор, встроенный в простую схему. Транзистор имеет три соединения с внешним миром: коллектор, базу и эмиттер. Если входное напряжение Vin ниже определенного критического значения, транзистор выключается и действует как очень большое сопротивление. Это приводит к выходному сигналу Vout, близкому к Vcc (напряжению, подаваемому извне), - для данного типа транзистора это обычно +5 В. Если Vin превышает критическое значение, транзистор включается и действует как проводник, вызывая заземление сигнала Vout (по соглашению - это 0 В).
Важно отметить, что если напряжение Vin низкое, то Vout высокое, и наоборот. Эта схема, таким образом, является инвертором, превращающим логический 0 в логическую 1 и логическую 1 в логический 0. Резистор (ломаная линия) нужен для ограничения тока, проходящего через транзистор, чтобы транзистор не сгорел. На переключение из одного состояния в другое обычно требуется несколько наносекунд.
На рис. 3.1, б два транзистора соединены последовательно. Если и напряжение V1 и напряжение V2 высокое, то оба транзистора становятся проводниками и снижают Vout. Если одно из входных напряжений низкое, то соответствующий транзистор выключается и напряжение на выходе становится высоким. Другими словами, напряжение Vout является низким тогда и только тогда, когда и напряжение V1 и напряжение V2 высокое.
На рис. 3.1, в два транзистора соединены параллельно. Если один из входных сигналов высокий, включается соответствующий транзистор и снижает выходной сигнал. Если оба напряжения на входе низкие, то выходное напряжение становится высоким.
Эти три схемы образуют три простейших вентиля. Они называются вентилями НЕ, НЕ-И и НЕ-ИЛИ соответственно. Вентили НЕ часто называют инверторами. Мы будем использовать оба термина. Если мы примем соглашение, что высокое напряжение ( Vcc) - это логическая 1, а низкое напряжение ("земля") - логический 0, то мы сможем выражать значение на выходе как функцию от входных значений. Значки, которые используются для изображения этих трех типов вентилей, показаны на рис. 3.2, а-в. Там же показаны режимы работы функции для каждой схемы. На этих рисунках A и B - входные сигналы, X - выходной сигнал. Каждая строка таблицы определяет выходной сигнал для различных комбинаций входных сигналов.
Если выходной сигнал на рис. 3.2, б подать в инвертор, мы получим другую схему, противоположную вентилю НЕ-И, то есть такую, у которой выходной сигнал равен 1 тогда и только тогда, когда оба входных сигнала равны 1. Такая схема называется вентилем И; ее изображение и описание соответствующей функции даны на рис. 3.2, г. Точно так же вентиль НЕ-ИЛИ может быть связан с инвертором. Тогда получится схема, у которой выходной сигнал равен 1 в том случае, если хотя бы один из входных сигналов единичный, и равен 0, если оба входных сигнала нулевые. Изображение этой схемы, которая называется вентилем ИЛИ, а также описание соответствующей функции даны на рис. 3.2, д. Маленькие кружочки в схемах инвертора, вентиля НЕ-И и вентиля НЕ-ИЛИ называются инвертирующими выходами. Они также могут использоваться в другом контексте для указания на инвертированный сигнал.
Пять вентилей, изображенные на рис. 3.2, составляют основу цифрового логического уровня. Из предшествующего обсуждения должно быть ясно, что вентили НЕ-И и НЕ-ИЛИ требуют два транзистора каждый, а вентили И и ИЛИ - три транзистора каждый. По этой причине во многих компьютерах используются вентили НЕ-И и НЕ-ИЛИ, а не И и ИЛИ. (На практике все вентили строятся несколько иначе, но вентили НЕ-И и НЕ-ИЛИ в любом случае проще, чем И и ИЛИ.) Следует упомянуть, что вентили могут иметь более двух входов. В принципе вентиль НЕ-И, например, может иметь произвольное количество входов, но на практике больше восьми обычно не бывает.
Хотя устройство вентилей относится к уровню физических устройств, мы все же упомянем основные линейки производственных технологий, так как они часто упоминаются в литературе. Две основные технологии - биполярная и МОП (металл, оксид, полупроводник). Среди биполярных технологий можно назвать ТТЛ (транзисторно-транзисторная логика), которая служила основой цифровой электроники на протяжении многих лет, и ЭСЛ (эмиттерно-связанная логика), которая используется в тех случаях, когда требуется высокая скорость выполнения операций. В отношении вычислительных схем более распространена технология МОП.
МОП-вентили работают медленнее, чем ТТЛ и ЭСЛ, но потребляют гораздо меньше энергии и занимают гораздо меньше места, поэтому можно компактно расположить большое количество таких вентилей. Вентили МОП имеют несколько разновидностей: p-канальный МОП, n-канальный МОП и комплиментарный МОП. Хотя МОП-транзисторы конструируются не так, как биполярные транзисторы, они тоже могут функционировать как электронные переключатели. Современные процессоры и память чаще всего производятся с использованием технологии комплиментарных МОП, которая работает при напряжении +3,3 В. Это все, что мы можем сказать об уровне физических устройств. Читатели, желающие узнать больше об этом уровне, могут обратиться к литературе, приведенной в главе 9.
Чтобы описать схемы, получаемые сочетанием различных вентилей, нужен особый тип алгебры, в которой все переменные и функции могут принимать только два значения: 0 и 1. Такая алгебра называется булевой. Она названа в честь английского математика Джорджа Буля (1815-1864). На самом деле в данном случае мы говорим об особом типе булевой алгебры, а именно - об алгебре релейных схем, но термин "булева алгебра" очень часто используется в значении "алгебра релейных схем", поэтому мы не будем их различать.
Как и в обычной алгебре (то есть в той, которую изучают в школе), в булевой алгебре есть свои функции. Булева функция на входе получает одну или несколько переменных и выдает результат, который зависит только от значений этих переменных. Можно определить простую функцию f, сказав, что f(A) = 1, если A = 0, и f(A) = 0, если А = 1. Такая функция будет функцией НЕ (см. рис. 3.2, а).
Так как булева функция от n переменных имеет только 2n возможных комбинаций значений переменных, то такую функцию можно полностью описать в таблице с 2n строками. В каждой строке будет даваться значение функции для разных комбинаций значений переменных. Такая таблица называется таблицей истинности. Все таблицы на рис. 3.2 представляют собой таблицы истинности. Если мы договоримся всегда располагать строки таблицы истинности по порядку номеров, то есть для двух переменных в порядке 00, 01, 10, 11, то функцию можно полностью описать 2n-разрядным двоичным числом, которое получается, если считывать по вертикали колонку результатов в таблице истинности. Таким образом, НЕ-И - это 1110, НЕ-ИЛИ - 1000, И - 0001 и ИЛИ - 0111. Очевидно, что существуют только 16 булевых функций от двух переменных, которым соответствуют 16 возможных 4-разрядных цепочек. В обычной алгебре, напротив, есть бесконечное число функций от двух переменных, и ни одну из них нельзя описать, дав таблицу значений этой функции для всех возможных значений входных переменных, поскольку каждая переменная может принимать бесконечное число значений.
На рис. 3.3, а показана таблица истинности для булевой функции от трех переменных: M = f(A, B, C). Это функция большинства, которая принимает значение 0, если большинство переменных равны 0, или 1, если большинство переменных равны 1. Хотя любая булева функция может быть определена с помощью таблицы истинности, с возрастанием количества переменных такой тип записи становится громоздким. Поэтому вместо таблиц истинности часто используется другой вариант записи.
Чтобы увидеть этот другой тип записи, отметим, что любую булеву функцию можно определить, указав, какие комбинации значений входных переменных приводят к единичному значению функции. Для функции, приведенной на рис. 3.3, а, существует 4 комбинации переменных, которые дают единичное значение функции. Мы будем рисовать черту над переменной, показывая, что ее значение инвертируется. Отсутствие черты означает, что значение переменной не инвертируется. Кроме того, мы будем использовать знак умножения (точку) для обозначения булевой функции И (этот знак может опускаться) и знак сложения (+) для обозначения булевой функции ИЛИ. Например, A M = Это компактная запись таблицы истинности. Таким образом, функцию от n переменных можно описать суммой максимум 2n произведений, при этом в каждом произведении будет по n множителей. Как мы скоро увидим, такая формулировка особенно важна, поскольку она позволяет реализовать данную функцию с использованием стандартных вентилей.
Важно понимать различие между абстрактной булевой функцией и ее реализацией с помощью электронной схемы. Булева функция состоит из переменных, например, A, B и С, а также из операторов И, ИЛИ и НЕ. Булева функция описывается с помощью таблицы истинности или специальной за- записи, например:
F = A Булева функция может быть реализована электронной схемой (часто различными способами) с использованием сигналов, которые представляют входные и выходные переменные, и вентилей, например, И, ИЛИ и НЕ.
Как было отмечено ранее, представление булевой функции в виде суммы максимум 2n произведений делает возможной реализацию этой функции. На рис. 3.3, б входные сигналы А, B и C показаны с левой стороны, а функция M, полученная на выходе, - с правой. Поскольку необходимы дополнительные величины (инверсии) входных переменных, для их получения сигнал проходит через инверторы 1, 2 и 3. Чтобы сделать рисунок понятней, мы нарисовали 6 вертикальных линий, 3 из которых связаны с входными переменными, 3 другие - с их инверсиями. Эти линии обеспечивают передачу входного сигнала к вентилям. Например, вентили 5, 6 и 7 на входе получают сигнал А. В реальной схеме эти вентили, вероятно, будут непосредственно соединены проводом с А без каких-либо промежуточных вертикальных проводов.
Схема содержит четыре вентиля И, по одному для каждого члена в уравнении для V (то есть по одному для каждой строки в таблице истинности с результатом 1). Каждый вентиль И вычисляет одну из указанных строк таблицы истинности. В конце концов, все данные произведения суммируются (имеется в виду операция ИЛИ) для получения конечного результата.
Посмотрите на рис. 3.3, б. В этой книге мы будем использовать следующее соглашение: если две линии на рисунке пересекаются, связь подразумевается только в том случае, если на пересечении расположена жирная точка. Например, выход вентиля 3 пересекает все 6 вертикальных линий, но связан он только с линией C. Отметим, что другие авторы могут использовать другие соглашения.
Из рис. 3.3 должно быть ясно, как получить схему для любой булевой функции:
Мы показали, как реализовать любую булеву функцию с помощью вентилей НЕ, И и ИЛИ. Однако гораздо удобнее строить схемы с использованием одного типа вентилей. К счастью, можно легко преобразовать схемы, построенные по предыдущему алгоритму, в форму НЕ-И или НЕ-ИЛИ. Чтобы осуществить такое преобразование, все, что нам нужно, - это реализовать вентили НЕ, И и ИЛИ с помощью какого-нибудь одного типа вентилей. На рисунке 3.4 показано, как это сделать на базе вентиля НЕ-И или НЕ-ИЛИ. Отметим, что существуют и другие варианты подобного преобразования.
Для того чтобы реализовать булеву функцию только на базе вентиля НЕ-И или НЕ-ИЛИ, можно сначала следовать описанному алгоритму, сконструировав схему с вентилями НЕ, И и ИЛИ. Затем нужно заменить вые вентили эквивалентными схемами на двухвходовых вентилях. Например, А + B + C + D можно поменять на (А + B) + (C + D), использовав три двухвходовых вентиля. Затем вентили НЕ, И и ИЛИ заменяются схемами, изображенными на рис. 3.4.
Хотя такая процедура и не приводит к оптимальным схемам с точки зрения минимального числа вентилей, она демонстрирует, что подобное преобразование осуществимо. Вентили НЕ-И и НЕ-ИЛИ считаются полными, потому что каждый из них позволяет вычислить любую булеву функцию. Ни один другой вентиль не обладает таким свойством, вот почему именно эти два типа вентилей предпочтительнее при построении схем.
Таблица 3.1. Некоторые соотношения булевой алгебры
Затем, опираясь на рис. 3.6, а, мы приходим к рис. 3.7, г. Переменные Теперь мы знаем, как строить простейшие схемы из отдельных вентилей. На практике цифровые логические схемы очень редко строятся вентиль за вентилем, хотя когда-то такой подход был распространен. Сейчас стандартные "строительные" блоки представляют собой модули, объединяющие несколько вентилей. В следующих подразделах мы рассмотрим эти стандартные блоки более подробно и увидим, как они используются и как их получить из отдельных вентилей.
Вентили производятся и продаются не по отдельности, а в модулях, которые называются интегральными схемами (ИС), или микросхемами. Интегральная ма представляет собой квадратный кусок кремния размером примерно 5 x 5 мм, на котором располагаются несколько вентилей. Маленькие интегральные схемы обычно помещаются в прямоугольные пластиковые или керамические корпуса размером от 5 до 15 мм в ширину и от 20 до 50 мм в длину. Вдоль длинных сторон располагается два параллельных ряда выводов около 5 мм в длину, которые можно вставлять в разъемы или впаивать в печатную плату. Каждый вывод соединяется с входом или выходом какого-нибудь вентиля, с источником питания или с "землей". Корпус с двумя рядами выводов снаружи и интегральными схемами внутри официально называется корпусом с двусторонним расположением выводов (Dual Inline Package, DIP), но все называют его микросхемой, игнорируя разницу между куском кремния и корпусом, в который он помещается. Большинство корпусов имеют 14, 16, 18, 20, 22, 24, 28, 40, 64 или 68 выводов. Для больших микросхем часто используются корпуса, у которых выводы расположены со всех четырех сторон или снизу.
Микросхемы можно разделить на несколько классов с точки зрения количества вентилей, которые они содержат. Эта классификация, конечно, очень грубая, но иногда она может быть полезна:
Эти схемы имеют различные свойства и используются для различных целей. МИС обычно содержит от двух до шести независимых вентилей, каждый из которых может использоваться отдельно, как описано в предыдущих разделах. На рис. 3.9 изображена обычная МИС, содержащая четыре вентиля НЕ-И.
Каждый из этих вентилей имеет два входа и один выход, что требует 12 выводов. Кроме того, микросхеме требуются питание (Vcc) и земля. Они общие для всех вентилей. На корпусе рядом с выводом 1 обычно имеется паз, чтобы можно было определить, что это вывод 1. Чтобы избежать путаницы на диаграмме, по соглашению не показываются неиспользованные вентили, источник питания и земля.
Подобные микросхемы стоят несколько центов. Каждая содержит несколько вентилей и примерно до 20 выводов. В 70-е годы компьютеры конструировались из большого числа таких микросхем, но в настоящее время на одну микросхему помещается целый центральный процессор и существенная часть памяти (кэш-память).
Для удобства мы считаем, что выходной сигнал вентиля изменяется, как только изменяется сигнал на его входе. На самом деле существует определенная задержка вентиля, которая включает в себя время прохождения сигнала через микросхему и время переключения. Задержка обычно составляет от 1 до 10 нc.
В настоящее время стало возможным помещать до 10 млн транзисторов на одну микросхему1. Так как любая схема может быть сконструирована из вентилей НЕ-И, может создаться впечатление, что производитель способен изготовить микросхему, содержащую 5 млн вентилей НЕ-И. К несчастью, для создания такой микросхемы потребуется 15 000 002 выводов. Поскольку стандартный вывод занимает 0,1 дюйма, микросхема будет иметь в длину более 18 км, что, вероятно, отрицательно скажется на ее рыночных свойствах. Поэтому чтобы использовать преимущество данной технологии, нужно разработать такие схемы, в которых количество вентилей значительно превышает количество выводов. В следующих подразделах мы рассмотрим простые МИС, в которых для вычисления той или иной функции несколько вентилей соединяются определенным образом между собой, что позволяет уменьшить число внешних выводов.
Многие применения цифровой логики требуют наличия схем с несколькими входами и несколькими выходами, в которых выходные сигналы определяются текущими входными сигналами. Такая схема называется комбинаторной. Не все схемы обладают таким свойством. Например, схема, содержащая элементы памяти, может генерировать выходные сигналы, которые зависят от значений, хранящихся в памяти. Микросхема, которая реализует таблицу истинности (например, приведенную на рис. 3.3, я), является типичным примером комбинаторной схемы. В этом разделе мы рассмотрим наиболее часто используемые комбинаторные схемы.
Мультиплексоры
На цифровом логическом уровне мультиплексор представляет собой схему с 2n входами, одним выходом и n линиями управления, которые позволяют выбрать один из входов. Выбранный вход соединяется с выходом. На рис. 3.10 изображена схема восьмивходового мультиплексора. Три линии управления, A, B и C, кодируют 3-разрядное число, которое указывает, какая из восьми входных линий должна соединяться с вентилем ИЛИ и, следовательно, с выходом. Вне зависимости от того, какое значение окажется на линиях управления, семь вентилей И всегда будут выдавать на выходе 0, а оставшийся может выдавать 0 или 1 в зависимости от значения выбранной линии входа. Каждый вентиль И запускается определенной комбинацией сигналов на линиях управления. Если в схему мультиплексора, показанную на рис. 3.10, добавить источник питания и землю, то мультиплексор можно включить в корпус с 14 выводами.
Использовав мультиплексор, мы можем реализовать функцию большинства (см. рис. 3.3, я), как показано на рис. 3.11, б. Для каждой комбинации A, B и C выбирается одна из входных линий. Каждый вход соединяется либо с сигналом Vcc (логическая 1), либо с землей (логический 0). Алгоритм соединения входов очень прост: входной сигнал Di такой же, как значение в строке i таблицы истинности. На рис. 3.3, а в строках 0, 1, 2 и 4 значение функции равно 0, поэтому соответствующие входы заземляются; в оставшихся строках значение функции равно 1, поэтому соответствующие входы соединяются с логической единицей. Таким способом можно реализовать любую таблицу истинности с тремя переменными, использовав микросхему на рис. 3.11, а.
Мы уже видели, как мультиплексор может использоваться для выбора одного из нескольких входов и как он позволяет строить таблицу истинности. Его также можно использовать в качестве преобразователя параллельного кода в последовательный. Если подать 8 бит данных на входные линии, а затем поочередно переключать линии управления, чтобы получить значения от 000 до 111 (это двоичные числа), то 8 бит поступят на выходную линию последовательно. Обычно такое преобразование осуществляется при вводе информации с клавиатуры, поскольку каждое нажатие клавиши определяет 7- или 8-разрядное число, которое должно передаваться последовательно по телефонной линии.
Противоположностью мультиплексора является демультиплексор, который соединяет единственный входной сигнал с одним из 2n выходов в зависимости от значений сигналов в n линиях управления. Если бинарное значение линий управления равно k, то выбирается выход k.
Декодеры
В качестве второго примера рассмотрим схему, которая получает на входе гг-разрядное число и использует его для того, чтобы выбрать (то есть установить в значение 1) одну из 2n выходных линий. Такая схема называется декодером. Пример декодера для я = 3 показан на рис. 3.12.
Чтобы понять, зачем нужен декодер, представим себе память, состоящую из 8 микросхем, каждая из которых содержит 1 Мбайт. Микросхема 0 имеет адреса от 0 до 1 Мбайт, микросхема 1 - адреса от 1 Мбайт до 2 Мбайт и т. д. Три старших двоичных разряда адреса используются для выбора одной из восьми микросхем. На рис. 3.12 эти три бита - три входа A, B и C. В зависимости от входных сигналов ровно одна из восьми выходных линий (D0, ..., D7) принимает значение 1; остальные линии принимают значение 0. Каждая выходная линия запускает одну из восьми микросхем памяти. Поскольку только одна линия принимает значение 1, запускается только одна микросхема.
Принцип работы схемы, изображенной на рис. 3.12, не сложен. Каждый вентиль И имеет три входа, из которых первый - это A или Компараторы
Еще одна полезная схема - компаратор. Компаратор сравнивает два слова, которые поступают на вход. Компаратор, изображенный на рис. 3.13, принимает два входных сигнала, A и B, по 4 бита каждый и выдает 1, если они равны, и 0, если они не равны. Схема основывается на вентиле ИСКЛЮЧАЮЩЕЕ ИЛИ, который выдает 0, если сигналы на входе равны, и 1, если сигналы на входе не равны. Если все четыре входных слова равны, все четыре вентиля ИСКЛЮЧАЮЩЕЕ ИЛИ должны выдавать 0. Эти четыре сигнала затем поступают в вентиль ИЛИ. Если в результате получается 0, значит, слова, поступившие на вход, равны; в противном случае они не равны. В нашем примере мы использовали вентиль ИЛИ в качестве конечного, чтобы поменять значение полученного результата: 1 означает равенство, 0 - неравенство.
Программируемые логические матрицы
Ранее отмечалось, что любую функцию (таблицу истинности) можно представить в виде суммы произведений и, следовательно, воплотить в схеме, использовав вентили И и ИЛИ. Для вычисления сумм произведений служит так называемая программируемая логическая матрица (рис. 3.14). Эта микросхема содержит входы для 12 переменных. Дополнительные сигналы (инверсии) генерируются внутри самой микросхемы. В итоге получается всего 24 входных сигнала. Какой именно входной сигнал поступает в тот или иной вентиль И, определяется по матрице размером 24 х 50 бит. Каждая из входных линий к 50 вентилям И содержит плавкую перемычку. При выпуске с завода все 1200 перемычек остаются нетронутыми. Чтобы запрограммировать матрицу, покупатель выжигает выбранные перемычки, прикладывая к схеме высокое напряжение.
Выходная часть схемы состоит из шести вентилей ИЛИ, каждый из которых содержит до 50 входов, что соответствует наличию 50 выходов у вентилей И. Какие из потенциально возможных связей действительно существуют, зависит от того, как была запрограммирована матрица 50 х 6. Микросхема имеет 12 входных выводов, 6 выходных выводов, питание и землю (то есть всего 20 выводов).
Приведем пример использования программируемой логической матрицы. Вернемся к схеме на рис. 3.3, б. Она содержит три входа, четыре вентиля И, один вентиль ИЛИ и три инвертора. Если запрограммировать нашу матрицу определенным образом, она сможет вычислять ту же функцию, используя три из 12 входов, четыре из 50 вентилей И и один из 6 вентилей ИЛИ. (Четыре вентиля И должны вычислять произведения Хотя матрицы, программируемые в эксплуатационных условиях, все еще используются, предпочтение отдается матрицам, которые изготавливаются на заказ. Они разрабатываются заказчиком и выпускаются производителем в соответствии с запросами заказчика. Такие программируемые логические матрицы гораздо дешевле.
А теперь мы можем обсудить три разных способа воплощения таблицы истинности, приведенной на рис. 3.3, а. Если в качестве компонентов использовать МИС, нам потребуются 4 микросхемы. С другой стороны, мы можем обойтись одним мультиплексором, построенном на СИС, как показано на рис. 3.11, б. Наконец, мы можем использовать лишь четвертую часть программируемой логической матрицы. Очевидно, если необходимо вычислять много функций, использование программируемой логической матрицы более эффективно, чем применение двух других методов. Для простых схем предпочтительнее более дешевые МИС и СИС.
Перейдем от СИС общего назначения к комбинаторным схемам СИС, которые используются для выполнения арифметических операций. Мы начнем с простой 8-разрядной схемы сдвига, затем рассмотрим структуру сумматоров и, наконец, изучим арифметико-логические устройства, которые играют существенную роль в любом компьютере.
Схемы сдвига
Первой арифметической схемой СИС, которую мы рассмотрим, будет схема сдвига, содержащая 8 входов и 8 выходов (рис. 3.15). Восемь входных битов подаются на линии D0, ..., D7. Выходные данные, которые представляют собой входные данные, сдвинутые на 1 бит, поступают на линии S0, ..., D7. Линия управления С определяет направление сдвига: 0 - влево, 1 - вправо.
Чтобы понять, как работает такая схема, рассмотрим пары вентилей И (кроме крайних). Если C = 1, правый член каждой пары включается, пропуская через себя соответствующий бит. Так как правый вентиль И соединен с входом вентиля ИЛИ, который расположен справа от этого вентиля И, происходит сдвиг вправо. Если C = 0, включается левый вентиль И из пары, и тогда происходит сдвиг влево.
Сумматоры
Компьютер, который не умеет складывать целые числа, практически немыслим. Следовательно, схема выполнения операций сложения является существенной частью любого процессора. Таблица истинности для сложения одноразрядных целых чисел показана на рис. 3.16, а. Здесь имеется два результата: сумма входных переменных A и B и перенос на следующую (левую) позицию. Схема для вычисления бита суммы и бита переноса показана на рис. 3.16, б. Такая схема обычно называется полусумматором.
Полусумматор подходит для сложения битов нижних разрядов двух многобитовых слов. Однако он не годится для сложений битов в середине слова, потому что не может осуществлять перенос в эту позицию. Поэтому необходим полный сумматор (рис. 3.17). Из схемы должно быть ясно, что полный сумматор состоит из двух полусумматоров. Сумма равна 1, если нечетное число переменных A, B и вход переноса принимает значение 1 (то есть, если единице равна или одна из переменных, или все три). Выход переноса принимает значение 1, если либо A и B одновременно равны 1 (левый вход в вентиль ИЛИ), либо один из них равен 1 и вход переноса также равен 1. Два полусумматора порождают и биты суммы, и биты переноса.
Чтобы построить сумматор, например, для двух 16-разрядных слов, нужно 16 раз продублировать схему, изображенную на рис. 3.17, б. Перенос производится в левый соседний бит. Перенос в самый правый бит соединен с 0. Такой сумматор называется сумматором со сквозным переносом. Прибавление 1 к числу 111...111 не осуществится до тех пор, пока перенос не пройдет весь путь от самого правого бита к самому левому. Существуют более быстрые сумматоры, работающие без подобной задержки. Естественно, предпочтение обычно отдается им.
Рассмотрим пример более быстрого сумматора. Разобьем 32-разрядный сумматор на 2 половины: нижнюю 16-разрядную и верхнюю 16-разрядную. Когда начинается сложение, верхний сумматор еще не может приступить к работе, поскольку не знает значение переноса, а узнать его он не сможет, пока не совершится 16 суммирований в нижнем сумматоре.
Однако можно сделать одно преобразование. Вместо одного верхнего сумматора можно получить два верхних сумматора, продублировав соответствующую часть аппаратуры. Тогда схема будет состоять из трех 16-разрядных сумматоров: одного нижнего и двух верхних, U0 и U1 работающих параллельно. В качестве переноса в сумматор U0 поступает 0, в сумматор U1 - 1. Оба верхних сумматора начинают работать одновременно с нижним сумматором, но только один из результатов суммирования в двух верхних сумматорах будет правильным. После сложения 16 нижних разрядов становится известно значение переноса в верхний сумматор, и тогда можно определить правильный ответ. При подобном подходе время сложения сокращается в два раза. Такой сумматор называется сумматором с выбором переноса. Можно еще раз разбить каждый 16-разрядный сумматор на два 8-разрядных и т. д.
Арифметико-логические устройства
Большинство компьютеров содержат одну схему для выполнения над двумя машинными словами операций И, ИЛИ и сложения. Обычно эта схема для n-разрядных слов состоит из n идентичных схем - по одной для каждой битовой позиции. На рисунке 3.18 изображена такая схема, которая называется арифметико-логическим устройством (АЛУ). Это устройство может вычислять одну из 4-х следующих функций: A И B, A ИЛИ B, В левом нижнем углу схемы находится двухразрядный декодер, который генерирует сигналы включения для четырех операций. Выбор операции определяется сигналами управления F0 и F1. В зависимости от значений F0 и F1 выбирается одна из четырех линий разрешения, и тогда выходной сигнал выбранной функции проходит через последний вентиль ИЛИ.
В верхнем левом углу схемы находится логическое устройство для вычисления функций A И B, A ИЛИ B и АЛУ может выполнять не только логические и арифметические операции над переменными A и B, но и делать их равными нулю, отрицая ENA (сигнал разрешения A) или ENB (сигнал разрешения B). Можно также получить A, установив сигнал INVA (инверсия A). Зачем нужны сигналы ENA, ENB и INVA, мы узнаем в главе 4. При нормальных условиях и ENA, и ENB равны 1, чтобы разрешить поступление обоих входных сигналов, а сигнал INVA равен 0. В этом случае A и B просто поступают в логическое устройство без изменений.
В нижнем правом углу находится полный сумматор для подсчета суммы A и B а также для осуществления переносов. Переносы необходимы, поскольку несколько таких схем могут быть соединены для выполнения операций над целыми словами. Одноразрядные схемы, подобные показанной на рис. 3.18, называются разрядными микропроцессорными секциями. Они позволяют разработчику строить АЛУ любой разрядности. На рис. 3.19 показана схема 8-разрядного АЛУ, составленного из восьми одноразрядных секций. Сигнал INC (увеличение на единицу) нужен только для операций сложения. Он дает возможность вычислять такие суммы, как Л + 1иЛ + В+1.
Во многих цифровых схемах все зависит от порядка выполнения операций. Иногда одна операция должна предшествовать другой, иногда две операции должны происходить одновременно. Для контроля временных параметров в цифровые схемы встраиваются тактовые генераторы, позволяющие обеспечить синхронизацию. Тактовый генератор - это схема, которая вызывает серию импульсов. Все импульсы одинаковы по длительности. Интервалы между последовательными импульсами также одинаковы. Временной интервал между началом одного импульса и началом следующего называется временем такта. Частота импульсов обычно составляет от 1 до 500 МГц, что соответствует времени такта от 1000 до 2 нс. Частота тактового генератора обычно контролируется кварцевым генератором, позволяющим добиться высокой точности.
В компьютере за время одного такта может произойти множество событий. Если они должны осуществляться в определенном порядке, то такт следует разделить на подтакты. Чтобы достичь лучшего разрешения, чем у основного тактового генератора, нужно сделать ответвление от задающей линии тактового генератора и вставить схему с определенным временем задержки. Так порождается вторичный сигнал тактового генератора, сдвинутый по фазе относительно первичного (рис. 3.20, а). Временная диаграмма, показанная на рис. 3.20, б, предлагает четыре точки начала отсчета времени для дискретных событий:
Связав различные события с разными перепадами (фронтами и спадами), можно достичь требуемой последовательности выполнения действий. Если в пределах одного такта нужно более четырех точек начала отсчета, можно сделать еще несколько ответвлений от задающей линии с различным временем задержки.
В некоторых схемах важны временные интервалы, а не дискретные моменты времени. Например, некоторое событие может происходить не на фронте импульса, а в любое время, когда уровень импульса C1 высокий. Другое событие может происходить только в том случае, когда уровень импульса C2 высокий. Если необходимо более двух интервалов, нужно предоставить больше линий передачи синхронизирующих импульсов или сделать так, чтобы состояния с высоким уровнем импульса у двух тактовых генераторов частично пересекались во времени. В последнем случае можно выделить 4 отдельных интервала: Тактовые генераторы могут быть синхронными. В этом случае время существования импульса с высоким уровнем равно времени существования импульса с низким уровнем (см. рис. 3.20, б). Чтобы получить асинхронную серию импульсов (см. сигнал C на рис. 3.20, в), нужно сдвинуть сигнал задающего генератора, использовав цепь задержки. Затем нужно соединить полученный сигнал с изначальным сигналом с помощью логической функции И.
Память является необходимым компонентом любого компьютера. Без памяти не было бы компьютеров, по крайней мере таких, какие есть сейчас. Память используется для хранения как команд, так и данных. В следующих подразделах мы рассмотрим основные компоненты памяти, начиная с уровня вентилей. Мы увидим, как они работают, как из них можно построить память большой емкости.
Чтобы создать один бит памяти, нужна схема, которая каким-то образом "запоминает" предыдущие входные значения. Такую схему можно сконструировать из двух вентилей НЕ-ИЛИ, как показано на рис. 3.21, а. Аналогичные схемы можно построить из вентилей НЕ-И. Мы не будем упоминать эти схемы в дальнейшем, поскольку они, по существу, идентичны схемам с вентилями НЕ-ИЛИ.
Схема, изображенная на рис. 3.21, а, называется SR-защелкой. У нее есть два входа: S (Setting - установка) и R (Resetting - сброс). У нее также есть два комплиментарных выхода: Q и Чтобы понять, как работает защелка, предположим, что S = 0 и R = 0 (вообще сигнал на этих входах равен 0 большую часть времени). Предположим также, что Q=0. Так как Q возвращается в верхний вентиль НЕ-ИЛИ и оба входа этого вентиля равны 0, то его выход, А теперь давайте представим, что Q = 1, a R и S все еще равны 0. Верхний вентиль имеет входы 0 и 1 и выход Q (то есть 0), который возвращается в нижний вентиль. Такое положение вещей, изображенное на рис. 3.21, б, также состоятельно. Положение, когда оба выхода равны 0, не состоятельно, поскольку в этом случае оба вентиля имели бы на входе два нуля, что привело бы к единице на выходе, а не к нулю. Точно так же невозможно иметь оба выхода равные 1, поскольку это привело бы к входным сигналам 0 и 1, что вызывает на выходе 0, а не 1. Наш вывод прост: при R = S = 0 защелка имеет два устойчивых состояния, которые мы будем называть 0 и 1 в зависимости от Q.
А сейчас давайте рассмотрим действие входных сигналов на состояние защелки. Предположим, что S принимает значение 1, в то время как Q = 0. Тогда входные сигналы верхнего вентиля равны 1 и 0, что ведет к выходному сигналу Использовав подобную аргументацию, легко увидеть, что установка S в значение 1 при состоянии защелки 1 (то есть при Q = 1) не вызывает изменений, но установка R в значение 1 приводит к изменению состояния защелки. Таким образом, если S принимает значение 1, то Q равняется 1 независимо от предыдущего состояния защелки. Сходным образом переход R в значение 1 вызывает Q = 0. Схема "запоминает", какой сигнал был последним: S или R. Используя это свойство, мы можем строить компьютерную память.
Синхронные SR-защелки
Часто удобно, чтобы защелка меняла состояние только в определенные моменты. Чтобы достичь этой цели, немного изменим основную схему и получим синхронную SR-защелку (рис 3.22).
Эта схема имеет дополнительный синхронизирующий вход, который по большей части равен 0. Если этот вход равен 0, то оба выхода вентилей И равны 0, и независимо от значений S и R защелка не меняет свое состояние. Когда значение синхронизирующего входа равно 1, действие вентилей И прекращается, и состояние защелки становится зависимым от S и R. Для обозначения факта появления единицы на синхронизирующем входе часто используются термины включение и стробирование.
До сих пор мы не выясняли, что происходит, когда S = R = 1. И по понятным причинам: когда и R, и S в конце концов возвращаются к 0, схема становится недетерминированной. Единственное приемлемое состояние при S = R = 1 - это Q = Синхронные D-защелки
Чтобы разрешить ситуацию с неопределенностью SR-защелки (неопределенность возникает в случае, если S = R = 1), нужно не дать ей возникнуть. На рис. 3.23 изображена схема защелки только с одним входом D. Так как входной сигнал в нижний вентиль И всегда является обратным кодом входного сигнала в верхний вентиль И, ситуация, когда оба входа равны 1, никогда не возникает. Когда D = 1 и синхронизирующий вход равен 1, защелка переходит в состояние Q = 1. Когда D = 0 и синхронизирующий вход равен 1, защелка переходит в состояние Q = 0. Другими словами, когда синхронизирующий вход равен 1, текущее значение D отбирается и сохраняется в защелке. Такая схема, которая называется синхронной D-защелкой, представляет собой память объемом 1 бит. Сохраненное значение всегда доступно на выходе Q Чтобы загрузить в память текущее значение D нужно пустить положительный импульс по линии синхронизирующего сигнала.
Такая схема требует 11 транзисторов. Более сложные схемы (именно они обычно используются на практике) могут хранить 1 бит всего на 6 транзисторах.
Многие схемы при необходимости выбирают значение на определенной линии в заданный момент времени и запоминают его. В такой схеме, которая называется триггером (flip-flop), смена состояния происходит не тогда, когда синхронизирующий сигнал равен 1, а при переходе синхронизирующего сигнала с 0 на 1 (фронт) или с 1 на 0 (спад). Следовательно, длина синхронизирующего импульса не имеет значения, поскольку переходы происходят быстро.
Подчеркнем еще раз различие между триггером и защелкой. Триггер запускается перепадом сигнала, а защелка запускается уровнем сигнала. Обратите внимание, что в литературе эти термины часто путают. Многие авторы используют термин "триггер", когда речь идет о защелке, и наоборот2.
Существуют несколько подходов к разработке триггеров. Например, если бы существовал способ генерирования очень короткого импульса на фронте синхронизирующего сигнала, этот импульс можно было бы подавать в D-защелку. В действительности такой способ существует. Соответствующая схема показана на рис. 3.24, а.
На первый взгляд может показаться, что выход вентиля И всегда будет нулевым, поскольку функция И от любого сигнала с его инверсией дает 0, но на самом деле ситуация несколько сложнее. При прохождении сигнала через инвертор происходит небольшая, но все-таки не нулевая задержка. Данная схема работает именно благодаря этой задержке. Предположим, мы измеряем напряжение в четырех точках: a,b,c и d. Входной сигнал в точке представляет собой длинный синхронизирующий импульс (нижний график на рис. 3.24, б). Сигнал в точке b показан над ним. Отметим, что этот сигнал инвертирован и подается с некоторой задержкой. Время задержки зависит от типа инвертора и обычно составляет несколько наносекунд.
Сигнал в точке c тоже подается с задержкой, но эта задержка обусловлена только временем прохождения сигнала (со скоростью света). Если физическое расстояние между точками a и c составляет, например, 20 микрон, тогда задержка на распространение сигнала равна 0,0001 нс, что, конечно, незначительно по сравнению с временем прохождения сигнала через инвертор. Таким образом, сигнал в точке c практически идентичен сигналу в точке a.
Когда входные сигналы b и c подвергаются операции И, в результате получается короткий импульс, длина которого ( Стандартные обозначения защелок и триггеров показаны на рис. 3.26. На рис. 3.26, а изображена защелка, состояние которой загружается тогда, когда синхронизирующий сигнал CK (от слова clock) равен 1, в противоположность защелке, изображенной на рис. 3.26, б, у которой синхронизирующий сигнал обычно равен 1, но переходит на 0, чтобы загрузить состояние из линии D. На рис. 3.26, в и г изображены триггеры. О том, что это триггеры, а не защелки, говорит уголок на синхронизирующем входе. Триггер на рис. 3.26, в изменяет состояние на фронте синхронизирующего импульса (переход от 0 к 1), тогда как триггер на рис. 3.26, г изменяет состояние на спаде (переход от 0 к 1). Многие (хотя не все) защелки и триггеры также имеют выход Существуют различные конфигурации триггеров. На рис. 3.27, а изображена схема, содержащая два независимых D-триггера с сигналами предварительной установки и очистки. Хотя эти два триггера находятся на одной микросхеме с 14 выводами, они не связаны между собой. Совершенно по-другому устроен "восьмикратный" триггер, изображенный на рис. 3.27, б. Здесь, в отличие от предыдущей схемы, у восьми триггеров нет выхода Одна из причин объединения линий синхронизации и линий очистки в микросхеме на рис. 3.27, б - экономия выводов. В то же время микросхема данной конфигурации несколько отличается от восьми не связанных между собой триггеров и используется в качестве одного 8-разрядного регистра. Две такие микросхемы могут работать параллельно, образуя 16-разрядный регистр. Для этого нужно связать соответствующие выводы 1 и 11. Регистры и их применение мы рассмотрим более подробно в главе 4.
Хотя мы и совершили переход от простой памяти емкостью 1 бит (см. рис. 3.23) к 8-разрядной памяти (см. рис. 3.27, б), чтобы построить память большого объема, требуется другой способ организации, при котором можно обращаться к отдельным словам. Пример организации памяти, которая удовлетворяет этому критерию, показан на рис. 3.28. Эта память содержит четыре 3-разрядных слова. Каждая операция считывает или записывает целое 3-разрядное слово. Хотя общий объем памяти A2 бит) не намного больше, чем у 8-разрядного триггера, такая память требует меньшего количества выводов и, что особенно важно, подобная организация применима для построения памяти большого объема.
Хотя организация памяти, изображенной на рис. 3.28, может на первый взгляд показаться сложной, на самом деле она очень проста благодаря своей регулярной структуре. Микросхема содержит 8 входных линий, в частности 3 входа для данных - I0, I1 и I2; 2 входа для адресов - A0 и A1; 3 входа для управления - CS (Chip Select - выбор элемента памяти), RD (ReaD - чтение, этот сигнал позволяет отличать считывание от записи) и ОЕ (Output Enable - разрешение выдачи выходных сигналов), а также 3 выходные линии для данных - О0, О1 и О2. Такую память в принципе можно поместить в корпус с 14 выводами (включая питание и землю), а 8-разрядный триггер требует наличия 20 выводов.
Чтобы выбрать микросхему памяти, внешняя логика должна установить сигнал CS в 1, а также установить сигнал RD в 1 для чтения и в 0 для записи. Две адресные линии должны указывать, какое из четырех 3-разрядных слов нужно считывать или записывать. При считывании входные линии для данных не используются. Выбирается слово и помещается на выходные линии для данных. При записи биты, находящиеся на входных линиях для данных, загружаются в выбранное слово памяти; выходные линии при этом не используются.
А теперь давайте посмотрим, как работает память, изображенная на рис. 3.28. Четыре вентиля И для выбора слов в левой части схемы формируют декодер. Входные инверторы расположены так, что каждый вентиль запускается определенным адресом. Каждый вентиль приводит в действие линию выбора слов (для слов 0, 1, 2 и 3). Когда микросхема должна производить запись, вертикальная линия CS- Процесс считывания сходен с процессом записи. Декодирование адреса происходит точно так же, как и при записи. Но в данном случае линия CS- Мы могли бы разработать схему, в которой три вентиля ИЛИ соединялись бы с тремя линиями вывода данных, но это вызвало бы некоторые проблемы. Мы рассматривали линии ввода данных и линии вывода данных как разные линии. На практике же используются одни и те же линии. Если бы мы связали вентили ИЛИ с линиями вывода данных, микросхема пыталась бы выводить данные (то есть задавать каждой линии определенную величину) даже в процессе записи, мешая нормальному вводу данных. По этой причине желательно каким-то образом соединять вентили ИЛИ с линиями вывода данных при считывании и полностью разъединять их при записи. Все, что нам нужно, - электронный переключатель, который может устанавливать и разрывать связь за несколько наносекунд.
К счастью, такие переключатели существуют. На рис. 3.29, а показано символическое изображение так называемого буферного элемента без инверсии. Он содержит входную линию для данных, выходную линию для данных и входную линию для управления. Когда управляющий вход равен 1, буферный элемент работает как проводник (рис. 3.29, б). Когда управляющий вход равен 0, буферный элемент работает как изолятор (рис. 3.29, в), как будто кто-то отрезает выход для данных от остальной части схемы кусачками. Соединение может быть восстановлено за несколько наносекунд, если сделать сигнал управления равным 1.
На рис. 3.29, г показан буферный элемент с инверсией, который действует как обычный инвертор, когда сигнал управления равен 1, и отделяет выход от остальной части схемы, когда сигнал управления равен 0. Оба буферных элемента представляют собой устройства с тремя состояниями, поскольку могут выдавать нулевой сигнал, единичный сигнал или вообще не выдавать никакого сигнала (случай разомкнутой цепи). Буферные элементы, кроме того, усиливают сигналы, поэтому они могут справляться с большим количеством сигналов одновременно. Иногда они используются в схемах именно в качестве усилителей.
Теперь вам уже должно быть понятно, для чего нужны три буферных элемента без инверсии на линиях вывода данных. Когда сигналы CS, RD и ОЕ равны 1, сигнал разрешения выдачи выходных данных также равен 1, в результате запускаются буферные элементы и слово помещается на выходные линии. Когда один из сигналов CS, RD и ОЕ равен 0, выходы отсоединяются от остальной части схемы.
Преимущество памяти, изображенной на рис. 3.28, состоит в том, что подобная структура применима при разработке памяти большого объема. На рисунке показана схема 4 x 3 (для четырех слов по 3 бита каждое). Чтобы расширить ее до размеров 4 x 8, нужно добавить еще 5 колонок триггеров по 4 триггера в каждой, а также 5 входных и 5 выходных линий. Чтобы перейти от схемы 4 х 3 к схеме 8 x 3, требуется добавить еще четыре ряда триггеров по три триггера в каждом, а также адресную линию A2. При такой структуре число слов в памяти должно быть степенью двойки для максимальной эффективности, а число битов в слове может быть любым.
Технология изготовления интегральных схем идеально соответствует регулярной структуре микросхем памяти. С развитием технологии число битов, которое можно вместить в одной микросхеме, постоянно растет, обычно в два раза каждые 18 месяцев (закон Мура). С появлением больших микросхем маленькие микросхемы не всегда сразу устаревают, поскольку всегда существует компромисс между емкостью, быстродействием, мощностью, ценой и удобством сопряжения. Обычно самые большие современные микросхемы пользуются огромным спросом и, следовательно, стоят гораздо дороже в расчете за 1 бит, чем микросхемы небольшого размера.
При любом объеме памяти существуют несколько вариантов организации микросхемы. На рис. 3.30 показаны две возможные структуры микросхемы емкостью 4 Мбит: 512 К х 8 и 4096 К х 1 (размеры микросхем памяти обычно даются в битах, а не в байтах, поэтому здесь мы будем придерживаться этого соглашения). На рис. 3.30, а можно видеть 19 адресных линий для обращения к одному из 219 байт и 8 линий данных для загрузки или хранения выбранного байта.
Сделаем небольшое замечание по поводу терминологии. На одних выводах высокое напряжение вызывает какое-либо действие, на других остается низкое напряжение. Чтобы избежать путаницы, мы будем употреблять термин установить сигнал, когда вызывается какое-то действие, вместо того, чтобы говорить, что напряжение повышается или понижается. Таким образом, для одних выводов установка сигнала означает установку единицы, для других - установку нуля. Названия выводов, которые устанавливаются в 0, содержат сверху черту. То есть сигнал CS - это единица, сигнал А теперь вернемся к нашей микросхеме. Поскольку обычно компьютер содержит много микросхем памяти, нужен сигнал для выбора необходимой микросхемы, такой, чтобы нужная нам микросхема реагировала на вызов, а остальные нет.
Сигнал На рис. 3.30, б используется другая схема адресации. Микросхема представляет собой матрицу размером 2048 х 2048 однобитовых ячеек, что составляет 4 Мбит. Чтобы обратиться к микросхеме, сначала нужно выбрать строку. Для этого 11-разрядный номер этой строки подается на адресные выводы. Затем устанавливается сигнал Большие микросхемы памяти часто производятся в виде матриц размером m х n, обращение к которым происходит по строкам и столбцам. Такая организация памяти сокращает число необходимых выводов, но, с другой стороны, замедляет обращение к микросхеме, поскольку требуется два цикла адресации: один для строки, другой для столбца. Чтобы ускорить этот процесс, в некоторых микросхемах можно вызывать адрес строки, а затем несколько адресов столбцов для доступа к последовательным битам строки.
Много лет назад самые большие микросхемы памяти обычно были устроены так, как показано на рис. 3.30, б. Поскольку размер слов увеличился от 8 до 32 бит и выше, использовать подобные микросхемы стало неудобно. Чтобы из микросхем 4096 К х 1 построить память с 32-разрядными словами, требуется 32 микросхемы, работающие параллельно. Эти 32 микросхемы имеют общий объем по крайней мере 16 Мбайт. Если использовать микросхемы 512 К х 8, то потребуется всего 4 микросхемы, но при этом объем памяти составит 2 Мбайт. Чтобы не возиться с 32 микросхемами, большинство производителей выпускают семейства микросхем с длиной слов 1, 4, 8 и 16 бит. Ситуация с 64-разрядными словами, естественно, еще хуже.
Примеры современных микросхем объемом 512 Мбит показаны на рис. 3.31. В каждой такой микросхеме содержится четыре внутренних банка памяти по 128 Мбит; соответственно, для определения банка требуются две линии выбора банка. На микросхеме 32 М х 16, показанной на рис. 3.31, я, 13 линий выделено для сигналов Эти примеры наглядно демонстрируют значимость двух не связанных друг с другом проблем в процессе конструирования микросхем памяти. Первая из них касается ширины выхода (в битах) - иначе говоря, количества битов (1, 4, 8, 16 и пр.) в выходном сигнале. Вторая проблема заключается в способе представления битов адреса; здесь есть два варианта: во-первых, биты адресов могут быть представлены одновременно на разных выводах, во-вторых, может быть последовательное представление строк и столбцов - так, как показано на рис. 3.31. Прежде чем приступать к проектированию микросхемы, специалист должен определиться с решением обеих этих проблем.
Все виды памяти, которые мы рассматривали до сих пор, имеют одно общее свойство: они позволяют и записывать, и считывать информацию. Такая память называется ОЗУ (оперативное запоминающее устройство), или RAM (Random Access Memory - оперативная память). Существует два типа ОЗУ: статическое и динамическое. Статическое ОЗУ (Static RAM, SRAM) конструируется с использованием D-триггеров. Информация в ОЗУ сохраняется на протяжении всего времени, пока к нему подается питание: секунды, минуты, часы и даже дни. Статическое ОЗУ работает очень быстро. Обычно время доступа составляет несколько наносекунд. По этой причине статическое ОЗУ часто используется в качестве кэш-памяти второго уровня.
В динамическом ОЗУ (Dynamic RAM, DRAM), напротив, триггеры не используются. Динамическое ОЗУ представляет собой массив ячеек, каждая из которых содержит транзистор и крошечный конденсатор. Конденсаторы могут быть заряженными и разряженными, что позволяет хранить нули и единицы. Поскольку электрический заряд имеет тенденцию исчезать, каждый бит в динамическом ОЗУ должен обновляться (перезаряжаться) каждые несколько миллисекунд, чтобы предотвратить утечку данных. Поскольку об обновлении должна заботиться внешняя логика, динамическое ОЗУ требует более сложного сопряжения, чем статическое, хотя этот недостаток компенсируется большим объемом.
Поскольку динамическому ОЗУ нужен только 1 транзистор и 1 конденсатор на бит (статическому ОЗУ требуется в лучшем случае 6 транзисторов на бит), динамическое ОЗУ имеет очень высокую плотность записи (много битов на одну микросхему). По этой причине основная память почти всегда строится на основе динамических ОЗУ. Однако динамические ОЗУ работают очень медленно (время доступа занимает десятки наносекунд). Таким образом, сочетание кэш-памяти на основе статического ОЗУ и основной памяти на основе динамического ОЗУ соединяет в себе преимущества обоих устройств.
Существует несколько типов динамических ОЗУ. Самый древний тип, который все еще используется, - FPM (Fast Page Mode - быстрый постраничный режим). Это ОЗУ представляет собой матрицу битов. Аппаратное обеспечение представляет адрес строки, а затем - адреса столбцов (мы описывали этот процесс, когда говорили об устройстве памяти, показанном на рис. 3.31, б). Явные сигналы обеспечивают асинхронную работу памяти и главного тактового генератора системы.
FPM постепенно замещается памятью EDO (Extended Data Output - память с расширенными возможностями вывода3, которая позволяет обращаться к памяти еще до того, как закончилось предыдущее обращение. Такой конвейерный режим, хотя и не ускоряет доступ к памяти, повышает пропускную способность, позволяя получить больше слов в секунду.
Память типа FPM и EDO сохраняла актуальность в те времена, когда продолжительность цикла работы микросхем памяти не превышала 12 нc. Впоследствии, с увеличением быстродействия процессоров, сформировалась потребность в более быстрых микросхемах памяти, и тогда на смену асинхронным режимам FPM и EDO пришли синхронные динамические ОЗУ (Synchronous DRAM, SDRAM). Синхронное динамическое ОЗУ управляется одним синхронизирующим сигналом. Данное устройство представляет собой гибрид статического и динамического ОЗУ. Основное преимущество синхронного динамического ОЗУ состоит в том, что оно исключает зависимость микросхемы памяти от управляющих сигналов. ЦП сообщает памяти, сколько циклов следует выполнить, а затем запускает эти циклы. Каждый цикл на выходе дает 4, 8 или 16 бит в зависимости от количества выходных строк. Устранение зависимости от управляющих сигналов приводит к увеличению скорости передачи данных между ЦП и памятью.
Следующим этапом в развитии памяти SDRAM стала память DDR (Double Data Rate - передача данных с двойной скоростью). Эта технология предусматривает вывод данных как на фронте, так и на спаде импульса, вследствие чего скорость передачи увеличивается вдвое. Например, 8-разрядная микросхема такого типа, работающая с частотой 200 МГц, дает на выходе два 8-разрядных значения 200 млн раз в секунду (разумеется, такая скорость удерживается в течение небольшого периода времени); таким образом, теоретически кратковременная скорость может достигать 3,2 Гбайт/с.
Энергонезависимая память
ОЗУ - не единственный тип микросхем памяти. Во многих случаях данные должны сохраняться, даже если питание отключено (например, если речь идет об игрушках, различных приборах и машинах). Более того, после установки ни программы, ни данные не должны изменяться. Эти требования привели к появлению ПЗУ (постоянных запоминающих устройств), или ROM (Read-Only Memory - постоянная память). ПЗУ не позволяют изменять и стирать хранящуюся в них информацию (ни умышленно, ни случайно). Данные записываются в ПЗУ в процессе производства. Для этого изготавливается трафарет с определенным набором битов, который накладывается на фоточувствительный материал, а затем открытые (или закрытые) части поверхности вытравливаются. Единственный способ изменить программу в ПЗУ - поменять всю микросхему.
ПЗУ стоят гораздо дешевле ОЗУ, если заказывать их большими партиями, чтобы оплатить расходы на изготовление трафарета. Однако они не допускают изменений после выпуска с производства, а между подачей заказа на ПЗУ и его выполнением может пройти несколько недель. Чтобы компаниям было проще разрабатывать новые устройства, основанные на ПЗУ, были выпущены программируемые ПЗУ (Programmable ROM, PROM). В отличие от обычных ПЗУ, их можно программировать в условиях эксплуатации, что позволяет сократить время выполнения заказа. Многие программируемые ПЗУ содержат массив крошечных плавких перемычек. Чтобы пережечь определенную перемычку, нужно выбрать требуемые строку и столбец, а затем приложить высокое напряжение к определенному выводу микросхемы.
Следующая разработка этой линии - стираемое программируемое ПЗУ (Erasable PROM, EPROM), которое можно программировать в условиях эксплуатации, а также стирать с него информацию. Если кварцевое окно в данном ПЗУ подвергать воздействию сильного ультрафиолетового света в течение 15 минут, все биты установятся в 1. Если нужно сделать много изменений во время одного этапа проектирования, стираемые ПЗУ гораздо экономичнее, чем обычные программируемые ПЗУ, поскольку их можно использовать многократно. Стираемые программируемые ПЗУ обычно устроены так же, как статические ОЗУ. Например, микросхема 27С040 имеет структуру, которая показана на рис. 3.31, а, а такая структура типична для статического ОЗУ.
Следующий этап - электронно-перепрограммируемое ПЗУ (Electronically EPROM, EEPROM), с которого можно стирать информацию, прилагая к нему импульсы, и которое не нужно для этого помещать в специальную камеру, чтобы подвергнуть воздействию ультрафиолетовых лучей. Кроме того, чтобы перепрограммировать данное устройство, его не нужно вставлять в специальный аппарат для программирования, в отличие от стираемого программируемого ПЗУ. В то же время самые большие электронно-перепрограммируемые ПЗУ в 64 раза меньше обычных стираемых ПЗУ, и работают они в два раза медленнее. Электронно-перепрограммируемые ПЗУ не могут конкурировать с динамическими и статическими ОЗУ, поскольку работают в 10 раз медленнее, их емкость в 100 раз меньше, и они стоят гораздо дороже. Они используются только в тех ситуациях, когда необходимо сохранять информацию при выключении питания.
Более современный тип электронно-перепрограммируемого ПЗУ - флэш-память. В отличие от стираемого ПЗУ, которое стирается под воздействием ультрафиолетовых лучей, и от электронно-перепрограммируемого ПЗУ, которое стирается по байтам, флэш-память стирается и записывается блоками. Многие изготовители производят небольшие печатные платы, содержащие сотни байтов флэш-памяти. Они используются для хранения изображений в цифровых камерах и для других целей. Возможно, когда-нибудь флэш-память вытеснит диски, что будет грандиозным шагом вперед, учитывая время доступа в 50 нс. Основной технической проблемой в данный момент является то, что флэш-память изнашивается после 100 000 операций стирания, а диски могут служить годами независимо от того, сколько раз они перезаписывались. Краткое описание различных типов памяти дано в табл. 3.2.
Таблица 3.2. Характеристики различных типов памяти
Двоичные сигналы, которые выдают устройства компьютера, часто недостаточно интенсивны, чтобы активизировать шину, особенно если она достаточно длинная и если к ней подсоединено много устройств. По этой причине большинство задающих устройств шины обычно связаны с ней через микросхему, которая называется драйвером шины и, по существу, является двоичным усилителем. Сходным образом большинство подчиненных устройств связаны с шиной приемником шины. Для устройств, которые могут быть и задающим, и подчиненным устройством, используется приемопередатчик, или трансивер, шины. Эти микросхемы, предназначенные для взаимодействия с шиной, часто являются устройствами с тремя состояниями, что дает им возможность отсоединяться, когда они не нужны. Иногда они подключаются через открытый коллектор, что дает сходный эффект. Когда одно или несколько устройств на открытом коллекторе требуют доступа к шине в одно и то же время, результатом является булева операция ИЛИ над всеми этими сигналами. Такое соглашение называется монтажным ИЛИ. В большинстве шин одни линии являются устройствами с тремя состояниями, а другие, которым требуется свойство монтажного ИЛИ, -открытым коллектором.
Как и процессор, шина имеет адресные, информационные линии и управляющие линии. Тем не менее между выводами процессора и сигналами шины может и не быть взаимно однозначного соответствия. Например, некоторые процессоры содержат три вывода, которые выдают сигнал чтения из памяти или записи в память, чтения с устройства ввода-вывода, записи на устройство ввода-вывода или выполнения какой-либо другой операции. Обычная шина может содержать одну линию для чтения из памяти, вторую - для записи в память, третью - для чтения с устройства ввода-вывода, четвертую - для записи на устройство ввода-вывода и т. д. Тогда связывать процессор с такой шиной должна микросхема-декодер, призванная преобразовывать 3-разрядный кодированный сигнал в отдельные сигналы, которые могут управлять линиями шины.
Разработка шин и принципы действия шин - это достаточно сложные вопросы, и по этому поводу написан ряд книг [11, 193]. Принципиальными вопросами в разработке являются ширина шины, синхронизация шины, арбитраж шины и функционирование шины. Все эти параметры существенно влияют на пропускную способность шины. В следующих четырех подразделах мы рассмотрим каждый из них.
Ширина шины (количество адресных линий) - самый очевидный параметр при разработке. Чем больше адресных линий содержит шина, тем к большему объему памяти может обращаться процессор. Если шина содержит nадресных линий, то процессор может использовать ее для обращения к 2n различным ячейкам памяти. Для памяти большой емкости необходимо много адресных линий. Это звучит достаточно просто.
Проблема заключается в том, что для широких шин требуется больше проводов, чем для узких. Они занимают больше физического пространства (например, на материнской плате), и для них нужны разъемы большего размера. Все эти факторы делают шину дорогостоящей. Следовательно, необходим компромисс между максимальным объемом доступной памяти и стоимостью системы. Система с шиной, содержащей 64 адресные линии, и памятью в 232 байт будет стоить дороже, чем система с шиной, содержащей 32 адресные линии, и такой же памятью в 232 байт. Дальнейшее расширение не бесплатное.
Многие разработчики систем оказались недальновидными, что привело к неприятным последствиям. Первая модель IBM PC содержала процессор 8088 и 20-разрядную адресную шину (рис. 3.34, а). Шина позволяла обращаться к 1 Мбайт памяти.
Когда появился следующий процессор (80286), компания Intel решила увеличить адресное пространство до 16 Мбайт, поэтому пришлось добавить еще 4 линии (не нарушая изначальные 20 по причинам совместимости с предыдущими версиями), как показано на рис. 3.34, б. К сожалению, пришлось также добавить управляющие линии для новых адресных линий. Когда появился процессор 80386, было добавлено еще 8 адресных линий и, естественно, несколько управляющих линий, как показано на рис. 3.34, в. В результате получилась шина EISA. Однако было бы лучше, если бы с самого начала имелось 32 линии.
С течением времени увеличивается не только число адресных линий, но и число информационных линий, хотя это происходит по другой причине. Можно увеличить пропускную способность шины двумя способами: сократить время цикла шины (сделать большее количество передач в секунду) или увеличить ширину шины данных (то есть увеличить количество битов, передаваемых за цикл). Можно повысить скорость работы шины, но сделать это довольно сложно, поскольку сигналы на разных линиях передаются с разной скоростью (это явление называется перекосом шины). Чем быстрее работает шина, тем больше перекос.
При увеличении скорости работы шины возникает еще одна проблема: в этом случае она становится несовместимой с предыдущими версиями. Старые платы, разработанные для более медленной шины, не могут работать с новой. Такая ситуация невыгодна для владельцев и производителей старых плат. Поэтому обычно для увеличения производительности просто добавляются новые линии, как показано на рис. 3.34. Как вы понимаете, в этом тоже есть свои недостатки. Компьютер IBM PC и его последователи, например, начали с 8 информационных линий, затем перешли к 16, потом - к 32 линиям, и все это в одной и той же шине.
Чтобы обойти эту проблему, разработчики иногда отдают предпочтение мультиплексной шине. В этой шине нет разделения на адресные и информационные линии. В ней может быть, например, 32 линии и для адресов, и для данных. Сначала эти линии используются для адресов, затем - для данных. Чтобы записать информацию в память, нужно сначала передавать в память адрес, а потом - данные. В случае с отдельными линиями адреса и данные могут передаваться вместе. Объединение линий сокращает ширину и стоимость шины, но система работает при этом медленнее. Поэтому разработчикам приходится взвешивать все за и против, прежде чем сделать выбор.
Шины можно разделить на две категории в зависимости от их синхронизации. Синхронная шина содержит линию, которая запускается кварцевым генератором. Сигнал на этой линии представляет собой меандр с частотой обычно от 5 до 100 МГц. Любое действие шины занимает целое число так называемых циклов шины. Асинхронная шина не содержит задающего генератора. Циклы шины могут быть произвольными и не обязательно одинаковыми для всех пар устройств. Далее мы рассмотрим каждый тип шины отдельно.
Синхронные шины
В качестве примера того, как работает асинхронная шина, рассмотрим временную диаграмму на рис. 3.35. В этом примере мы будем использовать задающий генератор на 100 МГц, который дает цикл шины в 10 нс. Хотя может показаться, что шина работает медленно по сравнению с процессорами на 3 ГГц и выше, не многие современные шины работают быстрее. Например, популярная шина PCI работает с частотой 33 МГц или 66 МГц. О причинах такой низкой скорости современных шин уже рассказывалось: к ним можно отнести такие технические проблемы, как перекос шины и необходимость совместимости.
В нашем примере мы предполагаем, что считывание информации из памяти занимает 15 нс с момента установки адреса. Как мы скоро увидим, понадобится три цикла шины, чтобы считать одно слово. Первый цикл начинается на фронте отрезка Т1 а третий заканчивается на фронте отрезка Т4, как показано на рис. 3.35. Отметим, что ни один из фронтов и спадов не нарисован вертикальным, потому что ни один электрический сигнал не может изменять свое значение за нулевое время. В нашем примере мы предполагаем, что для изменения сигнала требуется 1 нс. Генератор и линии адреса и данных, а также линии Начало T1 определяется фронтом генератора. За время Т1 центральный процессор помещает адрес нужного слово на адресные линии. Поскольку адрес представляет собой не одно значение (в отличие от генератора), мы не можем показать его в виде одной линии на схеме. Вместо этого мы показали его в виде двух линий с пересечениями там, где этот адрес меняется. Серый цвет на схеме показывает, что в этот момент не важно, какое значение принял сигнал. Используя то же соглашение, мы видим, что содержание линий данных не имеет значения до отрезка Т3.
После того как у адресных линий появляется возможность приобрести новое значение, устанавливаются сигналы Во время первой половины отрезка Т3 память помещает данные на информационные линии. На спаде отрезка Т3 центральный процессор стробирует (то есть считывает) информационные линии, сохраняя их значения во внутреннем регистре. Считав данные, центральный процессор сбрасывает сигналы Далее проясняется значение восьми символов на временной диаграмме (см. рис. 3.35) - они перечислены в табл. 3.4. TAD, например, - это временной интервал между фронтом T1 и установкой адресных линий. В соответствии с требованиями синхронизации TAD >= 4 нc. Это значит, что производитель процессора гарантирует, что во время любого цикла считывания центральный процессор сможет выдать требуемый адрес в пределах 11 нc от середины фронта Т1.
Таблица 3.4. Некоторые временные характеристики процесса считывания на синхронной шине
Условия синхронизации также требуют, чтобы данные поступали на информационные линии по крайней мере за 2 нc (TDS) до спада Т3, чтобы дать данным время установиться до того, как процессор начнет их стробировать. Сочетание ограничений на TAD и TDS означает, что в худшем случае в распоряжении памяти будет только 25 - 4 - 2 = 19 нc с момента появления адреса и до момента, когда нужно выдавать данные. Поскольку достаточно 10 нc, память даже в самом худшем случае может всегда ответить за период Т3. Если памяти для считывания требуется 20 нc, то необходимо ввести второй период ожидания, и тогда память ответит в течение Т4.
Требования синхронизации гарантируют, что адрес будет установлен по крайней мере за 2 нc до того, как появится сигнал Ограничения на ТM и TRL означают, что сигналы Интервалы ТMH и TRH определяют, сколько времени требуется на отмену сигналов Необходимо подчеркнуть, что наш пример представляет собой весьма упрощенную версию реальных временных ограничений. В действительности таких ограничений гораздо больше. Тем не менее этот пример наглядно демонстрирует, как работает синхронная шина.
Отметим, что сигналы управления могут задаваться низким или высоким напряжением. Что является более удобным в каждом конкретном случае, должен решать разработчик, хотя, по существу, выбор произволен. Такую свободу выбора можно назвать "аппаратным" аналогом ситуации, при которой программист может представить свободные дисковые блоки в битовом отображении как в виде нулей, так и в виде единиц.
Асинхронные шины
Хотя использовать синхронные шины благодаря дискретным временным интервалам достаточно удобно, здесь все же есть некоторые проблемы. Например, если процессор и память способны закончить передачу за 3,1 цикла, они вынуждены продлить ее до 4,0 циклов, поскольку неполные циклы запрещены.
Еще хуже то, что если однажды был выбран определенный цикл шины и в соответствии с ним разработана память и карты ввода-вывода, то в будущем трудно делать технологические усовершенствования. Например, предположим, что через несколько лет после выпуска системы, изображенной на рис. 3.35, появилась новая память с временем доступа не 15, а 8 нс. Это время позволяет избавиться от периода ожидания и увеличить скорость работы машины. А теперь представим, что появилась память с временем доступа 4 нс. При этом улучшения производительности уже не будет, поскольку в данной разработке минимальное время чтения - 2 цикла.
Если синхронная шина соединяет ряд устройств, одни из которых работают быстро, а другие - медленно, шина подстраивается под самое медленное устройство, а более быстрые не могут использовать свой потенциал полностью.
По этой причине были разработаны асинхронные шины, то есть шины без задающего генератора (рис. 3.36). Здесь ничего не привязывается к генератору.
Когда задающее устройство устанавливает адрес, сигнал Сигнал Стрелочки на временных диаграммах асинхронных шин (а иногда и синхронных шин) показывают причину и следствие какого-либо действия (см. рис. 3.36). Установка сигнала Набор таких взаимообусловленных сигналов называется полным квитированием. Здесь, в сущности, наблюдается 4 события:
Следует уяснить, что взаимообусловленность сигналов не является синхронной. Каждое событие вызывается предыдущим событием, а не импульсами генератора. Если какая-то пара устройств (задающее и подчиненное) работает медленно, это никак не влияет на другую пару устройств, которая может работать гораздо быстрее.
Преимущества асинхронной шины очевидны, хотя на самом деле большинство шин являются синхронными. Дело в том, что синхронную систему построить проще, чем асинхронную. Центральный процессор просто выдает сигналы, а память просто реагирует на них. Здесь нет никакой причинно-следственной связи, а если компоненты выбраны удачно, все работает и без квитирования. Кроме того, в разработку синхронных шин очень много вложено.
До этого момента мы неявно предполагали, что существует только одно задающее устройство шины - центральный процессор. В действительности микросхемы ввода-вывода могут становиться задающими устройствами при считывании информации из памяти и записи информации в память. Кроме того, они могут вызывать прерывания. Сопроцессоры также могут становиться задающими устройствами шины. Возникает вопрос: "Что происходит, когда задающим устройством шины становятся два или более устройства одновременно? " Чтобы предотвратить хаос, который может при этом возникнуть, нужен специальный механизм, называемый арбитражем шины.
Арбитраж может быть централизованным или децентрализованным. Рассмотрим сначала централизованный арбитраж. Простой пример централизованного арбитража показан на рис. 3.37, а. В данном примере один арбитр шины определяет, чья очередь следующая. Часто механизм арбитража встраивается в микросхему процессора, но иногда используется отдельная микросхема. Шина содержит одну линию запроса (монтажное ИЛИ), которая может запускаться одним или несколькими устройствами в любое время. Арбитр не может определить, сколько устройств запрашивают шину. Он может определить только факт наличия или отсутствия запросов.
Когда арбитр обнаруживает запрос шины, он устанавливает линию предоставления шины. Эта линия последовательно связывает все устройства ввода-вывода (как в елочной гирлянде). Когда физически ближайшее к арбитру устройство получает сигнал предоставления шины, это устройство проверяет, нет ли запроса шины. Если запрос есть, устройство пользуется шиной, но не распространяет сигнал предоставления дальше по линии. Если запроса нет, устройство передает сигнал предоставления шины следующему устройству. Это устройство тоже проверяет, есть ли запрос, и действует соответствующим образом в зависимости от наличия или отсутствия запроса. Передача сигнала предоставления шины продолжается до тех пор, пока какое-нибудь устройство не воспользуется предоставленной шиной. Такая система называется системой последовательного опроса. При этом приоритеты устройств зависят от того, насколько близко они находятся к арбитру. Ближайшее к арбитру устройство обладает наивысшим приоритетом.
Чтобы приоритеты устройств не зависели от расстояния до арбитра, в некоторых шинах поддерживается несколько уровней приоритета. На каждом уровне приоритета есть линия запроса шины и линия предоставления шины. На рис. 3.37, б изображено 2 уровня (хотя в действительности шины обычно поддерживают 4, 8 или 16 уровней). Каждое устройство связано с одним из уровней запроса шины, причем, чем выше уровень приоритета, тем больше устройств привязано к этому уровню. На рис. 3.37, б можно видеть, что устройства 1, 2 и 4 обладают приоритетом уровня 1, а устройства 3 и 5 - приоритетом уровня 2.
Если одновременно запрашивается несколько уровней приоритета, арбитр предоставляет шину самому высокому уровню. Среди устройств одинакового приоритета реализуется система последовательного опроса. На рис. 3.37, б видно, что в случае конфликта устройство 2 "побеждает" устройство 4, а устройство 4 "побеждает" устройство 3. Устройство 5 имеет низший приоритет, поскольку оно находится в самом конце самого нижнего уровня.
Линия предоставления шины уровня 2 нс обязательно должна последовательно связывать устройства 1 и 2, поскольку они не могут посылать на нее запросы. Однако гораздо проще провести все линии предоставления шины через все устройства, чем соединять устройства особым образом в зависимости от их приоритетов.
Некоторые арбитры содержат третью линию, которая устанавливается, как только устройство принимает сигнал предоставления шины, и получает шину в свое распоряжение. Как только эта линия подтверждения приема устанавливается, линии запроса и предоставления шины могут быть сброшены. В результате другие устройства могут запрашивать шину, пока первое устройство ее использует. К тому моменту, когда закончится текущая передача, следующее задающее устройство уже будет выбрано. Это устройство может начать работу, как только будет сброшена линия подтверждения приема. С этого момента начинается следующий цикл арбитража. Такая структура требует дополнительной линии и большего количества логических схем в каждом устройстве, но зато при этом циклы шины используются рациональнее.
В системах, где память связана с главной шиной, центральный процессор должен завершать работу со всеми устройствами ввода-вывода практически на каждом цикле шины. Чтобы решить эту проблему, можно предоставить центральному процессору самый низкий приоритет. При этом шина будет тавляться процессору только в том случае, если она не нужна другому устройству. Центральный процессор всегда может подождать, а устройства ввода-вывода должны получить доступ к шине как можно быстрее, чтобы не потерять данные. Например, диски, вращающиеся с высокой скоростью, не могут ждать. Во многих современных компьютерах память помещается на одну шину, а устройства ввода-вывода - на другую, поэтому им не приходится завершать работу, чтобы предоставить доступ к шине.
Возможен также децентрализованный арбитраж шины. Например, компьютер может содержать 16 приоритетных линий запроса шины. Когда устройству нужна шина, оно устанавливает свою линию запроса. Все устройства контролируют все линии запроса, поэтому в конце каждого цикла шины каждое устройство может определить, обладает ли оно в данный момент наивысшим приоритетом и, следовательно, разрешено ли ему пользоваться шиной в следующем цикле. Такой метод требует большего количества линий, но зато исключается арбитр. В этом случае число устройств ограничивается числом линий запроса.
При другом типе децентрализованного арбитража используются только три линии независимо от того, сколько устройств имеется в наличии (рис. 3.38). Первая линия - монтажное ИЛИ. Она требуется для запроса шины. Вторая линия называется BUSY и означает занятость. Она запускается текущим задающим устройством шины. Третья линия служит для арбитража шины. Она последовательно соединяет все устройства. Начало цепи связано с источником питания с напряжением 5 В.
Когда шина не требуется ни одному из устройств, линия арбитража передает сигнал всем устройствам. Чтобы получить доступ к шине, устройство сначала проверяет, свободна ли шина, и установлен ли сигнал арбитража IN. Если сигнал IN не установлен, устройство не может стать задающим устройством шины. В этом случае оно сбрасывает сигнал OUT. Если сигнал IN установлен, устройство также сбрасывает сигнал OUT, в результате чего следующее устройство не получает сигнала IN и, в свою очередь, сбрасывает сигнал OUT. Следовательно, все следующие по цепи устройства не получают сигнал IN и сбрасывают сигнал OUT. В результате остается только одно устройство, у которого сигнал IN установлен, а сигнал OUT сброшен. Оно становится задающим устройством шины, устанавливает линию BUSY и сигнал OUT, после чего начинает передачу данных.
Немного поразмыслив, можно обнаружить, что из всех устройств, которым нужна шина, доступ к шине получает самое левое. Такая система напоминает систему последовательного опроса, только в данном случае нет арбитра, поэтому она стоит дешевле и работает быстрее. К тому же не возникает проблем со сбоями арбитра.
До этого момента мы обсуждали только обычные циклы шины, когда задающее устройство (обычно центральный процессор) считывает информацию из подчиненного устройства (обычно из памяти) или записывает в него информацию. Однако существуют еще несколько типов циклов шины. Давайте рассмотрим некоторые из них.
Обычно за раз передается одно слово. При использовании кэш-памяти желательно сразу вызывать всю строку кэш-памяти (то есть 16 последовательных 32-разрядных слов). Однако часто передача блоками может быть более эффективна, чем такая последовательная передача информации. Когда начинается чтение блока, задающее устройство сообщает подчиненному устройству, сколько слов нужно передать (например, помещая общее число слов на информационные линии в период Т1). Вместо того чтобы выдать в ответ одно слово, задающее устройство выдает одно слово в течение каждого цикла до тех пор, пока не будет передано требуемое количество слов. На рис. 3.39 изображена такая же схема, как и на рис. 3.35, только с дополнительным сигналом Существуют также другие типы циклов шины. Например, если речь идет о системах с двумя или несколькими центральными процессорами на одной шине, нужно быть уверенным, что в конкретный момент только один центральный процессор может использовать определенную структуру данных в памяти. Чтобы упорядочить этот процесс, в памяти должна содержаться переменная, которая принимает значение 0, когда центральный процессор использует структуру данных, и 1, когда структура данных не используется. Если центральному процессору нужно получить доступ к структуре данных, он должен считать переменную и, если она равна 0, придать ей значение 1. Проблема заключается в том, что два центральных процессора могут считывать переменную на последовательных циклах шины. Если каждый процессор обнаружит, что переменная равна 0, а затем поменяет значение переменной на 1, как будто только он один использует эту структуру данных, то такая последовательность событий приведет к хаосу.
Чтобы не допустить подобной ситуации, в многопроцессорных системах предусмотрен специальный цикл шинВентили и булева алгебра
Вентили

Рис. 3.1. Транзисторный инвертор (а); вентиль НЕ И (б); вентиль НЕ ИЛИ (в)

Рис. 3.2. Значки для изображения пяти основных вентилей. Режимы работы функции для каждого вентиля
Булева алгебра

Рис. 3.3. Таблица истинности для функции большинства от трех переменных (а); схема реализации этой функции (б)
C принимает значение 1, только если A = 1, B = 0 и C=1. Кроме того, A
+
C принимает значение 1, только если (A = 1 и B = 0) или (B = 1 и C = 0). В таблице на рис. 3.3, а функция принимает значение 1 в четырех строках:
BC, A
C, AB
и ABC, Функция M принимает значение истины (то есть 1), если одно из этих четырех условий истинно. Следовательно, мы можем написать
BC + A
C + AB
+ ABC.
C + ABC.
Реализация булевых функций

Рис. 3.4. Конструирование вентилей НЕ (а), И (б) и ИЛИ (в) только на базе вентиля НЕ-И или НЕ-ИЛИ
Эквивалентность схем

=
+
+
.

Рис. 3.5. Две эквивалентные функции: АВ + АС (а); А(В + С) (б)
Соотношение
И
ИЛИ Соотношение тождества
1A = A
0 + A = A Соотношение нуля
0A = 0
1 + A = 1 Соотношение идемпотентности
AA = A
A+ A = A Соотношение инверсии
A
= 0
A +
= 1Соотношение коммутативности
AB = BA
A + B = B + A Ассоциативное соотношение
(AB)С = A(BC)
(A + B) + C = A + (B + C) Дистрибутивное соотношение
A + BC = (A + B)( A + C)
A (B + С) = AB + AC Соотношение поглощения
A(A + B) =A
A + AB = A Соотношение Де Моргана

=
+ 
+
= 


Рис. 3.6. Альтернативные представления некоторых вентилей: НЕ-И (а); НЕ-ИЛИ (б); И (в); ИЛИ (г)

Рис. 3.7. Таблица истинности для функции ИСКЛЮЧАЮЩЕЕ ИЛИ (а). Три схемы для вычисления этой функции (б), (б), (г)
и
можно получить из A и B, использовав вентили НЕ-И или НЕ-ИЛИ с объединенными входами. Отметим, что инвертирующие входы (выходы) можно по желанию перемещать вдоль линии связи, например, от выходов входных вентилей ко входам выходного вентиля.

Рис. 3.8. Электрические характеристики устройства (а); позитивная логика (б); негативная логика (в)
Основные цифровые логические схемы
Интегральные схемы

Рис. 3.9. МИС из четырех вентилей
Комбинаторные схемы

Рис. 3.10. Схема восьмивходового мультиплексора

Рис. 3.11. Мультиплексор, построенный на СИС (а); тот же мультиплексор, смонтированный для вычисления функции большинства (б)

Рис. 3.12. Схема декодера, содержащего 3 входа и 8 выходов
, второй - B или
, третий - C или
. Каждый вентиль запускается различной комбинацией входов: D0 - сочетанием 

, D1 - сочетанием 
C и т. д.

Рис.3.13. Простой 4-разрядный компаратор
BC, A
C, AB
и ABC; вентиль ИЛИ принимает эти 4 произведения в качестве входных данных.) Можно сделать так, чтобы та же программируемая логическая матрица вычисляла одновременно сумму четырех функций одинаковой сложности. Для простых функций ограничивающим фактором является число входных переменных, для более сложных -вентили И и ИЛИ.

Рис. 3.14. Программируемая логическая матрица с 12 входами и 6 выходами. Маленькие квадратики - плавкие перемычки, выжигаемые для получения нужной функции. Плавкие перемычки упорядочиваются в двух матрицах, верхняя матрица - для вентилей И, нижняя - для вентилей ИЛИ
Арифметические схемы

Рис. 3.15. Схема сдвига

Рис. 3.16. Таблица истинности для сложения одноразрядных чисел (а); схема полусумматора (б)

Рис. 3.17. Таблица истинности для полного сумматора (а); схема для полного сумматора (б)
или A + B. Выбор функции зависит от того, какие сигналы поступают на линии F0 и F1: 00, 01, 10 или 11 (в двоичной системе счисления). Отметим, что здесь A + B означает арифметическую сумму A и B, а не логическую операцию И.

Рис. 3.18. Одноразрядное АЛУ
, но только один из этих результатов проходит через последний вентиль ИЛИ в зависимости от того, какую из линий разрешения выбрал декодер. Так как ровно один из выходных сигналов декодера может быть равен 1, то и запускаться будет ровно один из четырех вентилей И. Остальные три вентиля будут выдавать 0 независимо от значений A и B.

Рис. 3.19. Восемь одноразрядных секций, соединенных в 8-разрядное АЛУ. Для упрощения схемы сигналы разрешения и инверсии не показаны
Тактовые генераторы

Рис. 3.20. Тактовый генератор (а); временная диаграмма тактового генератора (б); порождение асинхронных тактовых импульсов (в)
1 И
2,
1 И C2 C1 И
2 и C1 И C2.
Память
Защелки

Рис. 3.21. Защелка НЕ-ИЛИ в состоянии 0 (а); защелка НЕ-ИЛИ в состоянии 1 (б); таблица истинности для функции НЕ-ИЛИ (в)
. В отличие от комбинаторной схемы, выходные сигналы защелки не определяются текущими входными сигналами.
, равен 1. Единица возвращается в нижний вентиль, у которого в итоге один вход равен 0, другой - 1, а на выходе получается Q = 0. Такое положение вещей, по крайней мере, состоятельно (см. рис. 3.21, а).
=0. Это изменение делает оба входа в нижний вентиль равными 0, и, следовательно, выходной сигнал равняется 1. Таким образом, установка S в значение 1 переключает состояние с 0 на 1. Установка R в значение 1, когда защелка находится в состоянии 0, не вызывает изменений, поскольку выход нижнего вентиля НЕ-ИЛИ равен 0 как для входов 10, так и для входов 11.

Рис. 3.22. Синхронная SR-защелка
= 0, но как только оба входа возвращаются к 0, защелка должна перейти в одно из двух устойчивых состояний. Если один из входов принимает значение 0 раньше, чем другой, оставшийся в состоянии 1 "побеждает", потому что именно единичный вход управляет состоянием защелки. Если оба входа переходят к 0 одновременно (что очень маловероятно), защелка выбирает одно из своих устойчивых состояний произвольным образом.

Рис. 3.23. Синхронная D-защелка
Триггеры

Рис. 3.24. Генератор импульса (а); временная диаграмма для четырех точек на схеме (б)
) равна вентильной задержке инвертора (обычно 5 нс и ниже). Выходной сигнал вентиля И - данный импульс, сдвинутый из-за задержки вентиля И (верхний график на рис. 3.24, б). Этот временной сдвиг означает только то, что D-защелка активизируется с определенной задержкой после фронта синхронизирующего импульса. Он никак не влияет на длину импульса. В памяти со временем цикла в 50 нс импульс в 5 нс (который сообщает, когда нужно выбирать линию D) достаточно короткий, и в этом случае полная схема может быть такой, как на рис. 3.25. Следует упомянуть, что такая схема триггера проста для понимания, но на практике обычно используются более сложные триггеры.

Рис. 3.25. D-триггер
, а у некоторых есть два дополнительных входа: Set (установка) или Preset (предварительная установка) и Reset (сброс) или Clear (очистка). Первый вход (Set или Preset) устанавливает Q = 1, а второй (Reset или Clear) - Q = 0.

Рис. 3.26. D-защелки и D-триггеры
Регистры
и линий предварительной установки, а все синхронизирующие линии связаны вместе и управляются выводом И. Сами триггеры того же типа, что и на рис. 3.26, г, но инвертирующие входы аннулируются инвертором, связанным с выводом 11, поэтому триггеры запускаются при переходе от 0 к 1. Все восемь сигналов очистки тоже объединены, поэтому когда вывод 1 переходит в состояние 0, все триггеры переходят в состояние 0. Если вам не понятно, почему вывод 11 инвертируется на входе, а затем инвертируется снова при каждом сигнале CK, то ответ прост: входной сигнал не имеет достаточной мощности, чтобы запустить все восемь триггеров; входной инвертор на самом деле используется в качестве усилителя.
Организация памяти

Рис. 3.27. Сдвоенный D-триггер (а), "восьмикратный" триггер (б)

Рис. 3.28. Логическая блок-схема для памяти 4x3. Каждый ряд представляет одно из 3-разрядных слов. При считывании и записи всегда считывается или записывается целое слово
получает значение 1, запуская один из четырех вентилей записи. Выбор вентиля зависит от того, какая именно линия выбора слов равна 1. Выходной сигнал вентиля записи приводит в действие все сигналы CK для выбранного слова, загружая входные данные в триггеры для этого слова. Запись производится только в том случае, если сигнал CS равен 1, a RD - 0, при этом записывается только слово, выбранное адресами A0 и A1; остальные слова не меняются.
принимает значение 0, поэтому все вентили записи блокируются, и ни один из триггеров не меняется. Вместо этого линия выбора слов запускает вентили И, связанные с битами Q выбранного слова. Таким образом, выбранное слово передает свои данные в 4-входовые вентили ИЛИ, расположенные в нижней части схемы, а остальные три слова выдают 0. Следовательно, выход вентилей ИЛИ идентичен значению, сохраненному в данном слове. Остальные три слова никак не влияют на выходные данные.

Рис. 3.29. Буферный элемент без инверсии (а); представление буферного элемента без инверсии, когда сигнал управления равен 1 (б); представление буферного элемента без инверсии, когда сигнал управления равен 0 (в); буферный элемент с инверсией (г)
Микросхемы памяти

Рис. 3.30. Два способа организации памяти объемом 4 Мбит
- ноль. Противоположный термин - сбросить.
(Chip Select - выбор элемента памяти) используется именно для этой цели. Он устанавливается, чтобы запустить микросхему. Кроме того, нужен способ, чтобы отличать считывания от записи. Сигнал
(Write Enable -разрешение записи) указывает на то, что данные должны записываться, а не считываться. Наконец, сигнал
(Output Enable - разрешение вывода) устанавливается для выдачи выходных сигналов. Когда этого сигнала нет, выход отсоединяется от остальной части схемы.
(Row Address Strobe - строб адреса строки). После этого на адресные выводы подается номер столбца и устанавливается сигнал
(Column Address Strobe - строб адреса столбца). Микросхема реагирует на сигнал, принимая или выдавая 1 бит данных.
, 10 - для сигналов
и 2 линии - для выбора банка. Взятые в целом, 25 сигналов обеспечивают возможность адресации 225 внутренних 16-разрядных ячеек. На микросхеме 128 М х 4, изображенной на рис. 3.31, б, для сигналов
выделено 13 линий, для
- 12 линий, для выбора банка - 2 линии. Таким образом, 27 сигналов делают возможной адресацию любой из 227 внутренних 4-разрядных ячеек. Количество строк и столбцов в микросхемах определяется на основании инженерных факторов. Матрица не обязательно должна быть квадратной.

Рис. 3.31. Два способа организации микросхемы памяти объемом 512 Мбит
ОЗУ и ПЗУ
Тип
запоминающего
устройства
Категория
Стирание
информации
Изменение
информации
по байтамНеобходимость
питанияПрименение
SRAM
Чтение и запись
Электрическое
Да
Да
Кэш-память второго уровня
DRAM
Чтение и запись
Электрическое
Да
Да
Основная память (старые модели)
SDRAM
Чтение и запись
Электрическое
Да
Да
Основная память (новые модели)
ROM
Только чтение
Невозможно
Нет
Нет
Устройства большого объема
PROM
Только чтение
Невозможно
Нет
Нет
Устройства небольшого объема
EPROM
Преимуществен но чтение
Ультрафиолетовый свет
Нет
Нет
Моделирование устройств
EEPROM
Преимущественно чтение
Электрическое
Да
Нет
Моделирование устройств
Флэш-память
Чтение и запись
Электрическое
Нет
Нет
Цифровые камеры
Микросхемы процессоров и шины
Задающее устройство
Подчиненное устройство
Пример Центральный процессор
Память
Вызов команд и данных Центральный процессор
Устройство ввода-вывода
Инициализация передачи данных Центральный процессор
Сопроцессор
Передача команды от процессора к сопроцессору Устройство ввода-вывода
Память
Прямой доступ к памяти Сопроцессор
Центральный процессор
Вызов сопроцессором операндов из центрального процессора Ширина шины

Рис. 3.34. Расширение адресной шины с течением времени
Синхронизация шины
,
,
показаны в том же масштабе времени.

Рис. 3.35. Временная диаграмма процесса считывания на синхронной шине
и
. Первый указывает, что осуществляется доступ к памяти, а не к устройству ввода-вывода, а второй - что осуществляется чтение, а не запись. Поскольку после установки адреса считывание информации из памяти занимает 15 нс (часть первого цикла), память не может передать требуемые данные за период Т2. Чтобы центральный процессор не ожидал поступления данных, память устанавливает сигнал
в начале отрезка Т2. Это означает ввод периодов ожидания (дополнительных циклов шины) до тех пор, пока память не сбросит сигнал
. В нашем примере вводится один период ожидания (Т2), поскольку память работает слишком медленно. В начале отрезка Т3, когда есть уверенность в том, что память получит данные в течение текущего цикла, сигнал
сбрасывается.
и
. В случае необходимости на следующем фронте может начаться еще один цикл памяти. Эта последовательность может повторяться бесконечно.
Символ
Значение
Минимум
Максимум
Единицы
измеренияTAD
Задержка выдачи адреса
4
нс TML
Промежуток между стабилизацией адреса и установкой сигнала
2
нс TM
Промежуток между спадом синхронизирующего сигнала в цикле T1 и установкой сигнала
3
нс TRL
Промежуток между спадом синхронизирующего сигнала в цикле T1 и установкой сигнала
3
нс TDS
Период передачи данных до спада синхронизирующего сигнала
2
нс TMH
Промежуток между спадом синхронизирующего сигнала в цикле T3 и сбросом сигнала
3
нс TRH
Промежуток между спадом синхронизирующего сигнала в цикле T3 и сбросом сигнала
3
нс TDH
Период продолжения передачи данных с момента сброса сигнала
0
нс
. Это время может быть важно в том случае, если
инициирует выбор элемента памяти, поскольку некоторые типы памяти требуют определенного времени на установку адреса до выбора элемента памяти. Ясно, что разработчику системы не следует выбирать микросхему памяти, которой нужно 3 нc на установку.
и
будут установлены в пределах 3 нc от спада T1. В худшем случае у микросхемы памяти после установки сигналов
и
останется всего 10 + 10 - 3 - 2 = 15 нc на передачу данных по шине. Это ограничение вводится дополнительно по отношению к интервалу в 15нс и не зависит от него.
и
после того, как данные стробированы. Наконец, интервал TDH определяет, сколько времени память должна держать данные на шине после снятия сигнала
. В нашем примере при данном процессоре память может удалить данные с шины, как только сбрасывается сигнал
; в случае других процессоров данные могут сохраняться еще некоторое время.
,
или любой другой требуемый сигнал, оно выдает специальный синхронизирующий сигнал
(Master SYNchronization). Когда подчиненное устройство получает этот сигнал, оно начинает выполнять свою работу настолько быстро, насколько это возможно. Когда работа заканчивается, подчиненное устройство выдает сигнал
(Slave SYNchronization).

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

Рис. 3.37. Одноуровневый централизованный арбитраж шины с последовательным опросом (а); двухуровневый централизованный арбитраж (б)

Рис. 3.38. Децентрализованный арбитраж шины
Принципы работы шины
, который указывает, что запрашивается передача блока. В данном примере считывание блока из 4 слов занимает 6 циклов вместо 12.

Рис. 3.39. Передача блока данных