![]() |
Главы из книги «Параллельная обработка данных».Глава 11. Как создаются цифровые электронные устройства.При создании цифрового электронного устройства, как и при разработке программного приложения, используется вполне определенная, устоявшаяся за многие годы, система уровней иерархии представления схемы. На самом нижнем уровне иерархии находится транзистор. Это аналоговый электронный прибор, функционирование которого описывается рядом плавных, совсем «не цифровых», зависимостей. Количество транзисторов в цифровых схемах таково, что понимание этих схем человеком непосредственно в терминах вольт–амперных характеристик транзисторов невозможно. Никому еще не удавалось понять, как работает процессор, прослеживая непосредственно взаимные зависимости токов и напряжений составляющих его транзисторов, подобно тому, как радиолюбитель «разбирает схему» транзисторного приемника с двухкаскадным усилителем сигнала. Тем более, в этих терминах процессор или аналогичное по сложности цифровое устройство невозможно спроектировать. По этой причине, вводится следующий уровень иерархии – уровень логических элементов, или вентилей. Это тот уровень представления, на котором происходит переход от аналоговой модели к цифровой. Вводится понятие логического уровня сигнала, «логического нуля» и «логической единицы», и говорится, что в правильно спроектированной схеме сигнал в определенные моменты времени не будет принимать промежуточных значений. А что такое «правильно спроектированная схема»? Это схема, построенная из вентилей, то есть совсем небольших электронных приборов, каждый из которых реализует некоторую функцию алгебры логики. Например, вентиль «И», вентиль «ИЛИ», вентиль «НЕ». Каждый вид вентиля строится из небольшого числа транзисторов (или диодов) совершенно определенным, фиксированным способом, и при дальнейшем рассмотрении схемы о «транзисторном происхождении» вентилей забывают. Схема рисуется как состоящая из вентилей, то есть выполняется рисуется как состоящая из вентилей, то есть выполняется логическое проектирование схемы. Из основных положений алгебры логики известно, что для построения любой функции алгебры логики путем суперпозиции логических элементов надо обладать полным базисом то есть некоторым набором видов таких элементов. В частности, набор из трех видов элементов: «И», «ИЛИ» и «НЕ», образует полный базис. Способы построения произвольной функции алгебры логики из таких элементов по ее таблице истинности просты и хорошо известны: например, канонический способ построения дизъюнктивной нормальной формы. Таким образом, располагая базисным набором вентилей, мы легко можем построить любую комбинационную схему, то есть схему, выходы которой реализуют некоторую функцию алгебры логики от своих входов. Некоторые примеры построения таких комбинационных схем, реально применяемых в сложных цифровых устройствах, приводятся в приложении 2. Однако, применяемые на практике сложные цифровые схемы редко бывают комбинационными. Значения выходов комбинационной схемы зависят от значений ее входов в данный момент времени, то есть комбинационная схема «ничего не помнит», по определению не содержит в себе элементов памяти. Любая память, даже объемом в один – единственный бит, комбинационной схемой не является. Для завершения построения «картины мира» логической схемотехники нам требуется ввести еще два связанных между собой понятия – понятие элемента памяти и понятие дискретного времени. Простейшим элементом памяти, то есть цифровой схемой, значения выходов которой зависят от значений ее входов в прошлом, является RS-триггер Такой триггер получается, если соединить два вентиля «И» и два вентиля «НЕ» таким образом: ![]() рис. 11.1. RS-триггер Вертикальная черта над названием сигнала обозначает его инверсию: надчеркнутое «S» читается как «не S». Входы вентилей слева, выходы – справа. Входы этого триггера – это инверсные сигналы установки (S) и сброса (R). Если оба они равны 1, то есть не активны, то триггер сохраняет значение, которое имел ранее, что представлено в прямом виде на первом выходе и в инверсном – на втором. Если вход R равен 0, то есть активен, а вход S – не активен, то триггер запоминает нуль. Если активен вход S, а вход R – нет, то триггер запоминает единицу. Наконец, если активны оба входа, то после их деактивации триггер будет вести себя, как аналоговая схема, то есть в терминах логики (а не физики транзисторов, проводов и диодов, из которых сделаны вентили) о его последующем состоянии ничего сказать нельзя. Правильная схема, использующая такой триггер, должна быть построена так, чтобы эта ситуация никогда не возникала. Этот простейший пример показывает, что схемы с последействием, то есть со свойствами элементов памяти, в принципе тоже строятся из вентилей, как и комбинационные схемы. Однако, возникает вопрос о том, что такое «прошлое» и «настоящее», как учесть время переходных процессов в сложных схемах. Ведь во время перехода вентилей из одного состояния в другое они уж точно не подчиняются законам логики. В это время совершенно неизбежны и промежуточные (не логические) уровни сигналов, и затухающие колебательные процессы, и много других неприятностей. Для решения этих вопросов вводится понятие дискретного времени. В состав схемы включается специальное устройство – генератор синхроимпульсов определенной частоты. Система элементов памяти разного типа, построенных обычно на основе RS-триггера но с добавлением дополнительных вентилей, строится таким образом, чтобы все передачи сигналов с выходов одних элементов памяти на входы других происходили, например, только в момент появления очередного синхроимпульса, как говорят, «по переднему фронту». рабочая частота выбирается таким образом, чтобы за время от одного переднего фронта синхроимпульса до другого все переходные процессы в транзисторах и диодах, из которых сделаны вентили, успели завершиться. Таким образом, время измеряется в синхроимпульсах. Прошлое – это время, после которого прошел хотя бы один синхроимпульс. Состояние схемы в промежутках между синхроимпульсами при логическом проектировании не рассматривается. Все это вместе позволяет говорить действительно о логическом проектировании, без привлечения каких-либо понятий физической реализации, вроде той же вольт – амперной характеристики транзистора. В соответствии с вполне очевидными принципами структурного проектирования, вводится следующий, еще более высокий, уровень иерархии, а именно уровень типовых логических узлов. Самым очевидным примером такого узла является регистр – набор триггеров, управляемых и тактируемых совместно. Функционально регистр представляет собой отдельную ячейку памяти определенной разрядности. В проектировании в терминах типовых логических узлов иногда говорят как о проектировании «в регистрах». Пока мы не видим ничего такого, что делало бы процесс проектирования цифровых электронных схем заметно более сложным, чем, скажем, системное программирование. Почему же, в таком случае, программирование издавна считается в чем-то более простой, а главное – осуществимой гораздо более быстро, работой? Попробуем представить себе, как разработка цифровой схемы происходит на практике. Для начала забудем об изделиях современной микроэлектроники, сам физический процесс изготовления которых подразумевает «монтаж» чуть ли не отдельных молекул. Поставим себя мысленно на место проектировщика конца 70-х, когда типовые логические узлы были отдельными микросхемами, то есть регистр можно было взять в руки, установить на плату и припаять обычным низковольтным паяльником. Приступая к разработке, например, процессора, схемотехник сначала рисовал его схему «в регистрах». В этот момент схема, скорее всего, содержала в себе примерно столько же чисто логических ошибок, сколько имеется в тексте только что написанной, но еще не отлаженной, программы. Схему, как и программу, требуется отладить. Для этого схему собирали на макетной плате, то есть на плате, в которой имеется очень много монтажных позиций для ножек микросхем, никак не связанных друг с другом. Установив на макетную плату все необходимые микросхемы, разработчик выполнял необходимые соединения обычным проводом при помощи паяльника. Схема готова и, конечно же, не работает. Если сравнивать этот процесс с процессом разработки программы, в первую очередь бросается в глаза физическая трудоемкость изготовления опытного образца. Программу, в отличие от схемы, не надо паять. Если она существует в виде файла на диске, ее уже можно считать «физически реализованной». В действительности, главное отличие (и главная проблема) вовсе не в этом. В конце концов, в современных условиях «монтаж» внутренней структуры микросхемы все равно делает некоторый автомат, и, скорее всего, он делает это довольно быстро, и без вмешательства человека. Но вернемся к нашему опытному образцу. Главное его отличие от еще не отлаженной программы состоит в том, что он, вообще говоря, вовсе не ведет себя как цифровая, то есть описываемая законами логики, схема. В самом деле, из того, что два транзистора вместе ведут себя как вентиль, а четыре вентиля вместе – как триггер, вовсе не следует то, что аналогичные рассуждения верны для соединенных проводами тысяч и тысяч транзисторов. В такой большой системе присутствуют «просадки» сигналов и возрастание времени переходных процессов на длинных комбинационных цепочках, тепловые шумы, помехи, «наводки» и прочие эффекты, имеющие совершенно не логическое происхождение. Соединенные вместе в большом количестве, вентили постоянно рискуют перестать быть вентилями, то есть начать вести себя не логически, а электрически некорректно. Конечно, наш воображаемый разработчик стремился все это учесть, «разбавив» схему должным числом резисторов и емкостей. Но ведь и в расстановке этих совсем не логических элементов он, скорее всего, где-то ошибся – схема – то еще не отлажена! Итак, разработчик установил, что схема ведет себя неправильно, и даже понял, как именно. Где ошибка – «в логике» или «в электричестве»? Понять это по внешним проявлениям ошибки зачастую практически невозможно. Искать любую ошибку приходится сразу по двум направлениям. В этом и заключается отличие нашего воображаемого схемотехника от программиста. Он и хотел бы мыслить исключительно на уровне логики, как того требует сложность задачи – да не может. Ему постоянно приходится быть «немножко радиомастером», то есть держать в голове и логические, и электрические свойства своего изделия. Именно эта принципиальная невозможность гарантированно разделить уровни иерархии, абстрагироваться от нижележащих и сосредоточиться исключительно на своем, и делала работу схемотехников прошлого такой трудоемкой, так отличной от работы программиста. В самом деле, вряд ли можно даже представить себе, сколько времени у программиста заняла бы, например, реализация надежно работающего Интернет – приложения на заведомо неисправном процессоре. Теперь попробуем мысленно вернуться в наши дни. Место макетной (или не макетной, а печатной, готовой к серийному выпуску) платы заняла миниатюрная пластина кремния, припаять к которой дополнительный вентиль довольно затруднительно. Запускать же процесс изготовления новой пластины при всякой необходимости разорвать одно соединение и сделать два новых – баснословно дорого. При этом «электрические» проблемы никуда не исчезли – они просто переместились на микроуровень, то есть их стало гораздо труднее обнаруживать. Как следует поступить, чтобы разработка новых микросхем вообще стала возможной? Выход был найден в 1983 году, с появлением микросхем программируемой логики. Такая микросхема представляет собой, фактически, миниатюрную «макетную плату», на которой установлено громадное – порядка миллионов – количество вентилей. Вентили эти сами по себе никак не связаны друг с другом, но их можно связать практически любым необходимым способом, загрузив карту необходимых связей в специальную конфигурационную память микросхемы. Переворот в логическом проектировании произошел тогда, когда эту память удалось сделать оперативной, то есть не «прожигаемой» однократно, а перезаписываемой неограниченное число раз. Это сделало процесс физической реализации как угодно сложной схемы на кристалле программируемой логики столь же простым, быстрым и дешевым, как запуск исполняемого файла программы на универсальном процессоре. Появление микросхем программируемой логики гигантски облегчило разработку сложных схем, в том числе – предназначенных для последующей реализации в обычных, не программируемых, кристаллах. Однако, при этом частично «повисал в воздухе» вопрос электрической корректности – ведь схема, электрически корректная в конкретном кристалле программируемой логики, запросто могла оказаться «плохой», будучи перенесена на «настоящую» пластину кремния для серийного выпуска. Вопрос был успешно решен развитием систем автоматизированного проектирования. Пыли разработаны и реализованы в рамках соответствующих САПР методы достоверного расчета такой «раскладки» логической схемы на конкретном кристалле, не важно, программируемом или «настоящем», чтобы все вентили всегда оставались вентилями, не превращаясь в причудливые аналоговые структуры из составляющих их транзисторов. Это позволило возложить обеспечение электрически корректной реализации схемы, представленной «в регистрах», на САПР, и дать, наконец, схемотехнику мыслить, то есть и создавать, и отлаживать схемы, в терминах логики, безо всякой примеси «радиолюбительства». Тем самым, последнее принципиальное отличие схемотехника от программиста было ликвидировано. И тот, и другой отныне мыслят логическими понятиями, и практически не ограничены в числе попыток при отладке своих изделий. Длительность и цена каждой из таких попыток при этом также оказывается сходной. Теперь мы видим, что поставленная нами выше задача разработки проблемно – ориентированных вычислительных устройств – «машин одной задачи» – является вполне осуществимой в принципе. Однако, как не уставали повторять схемотехники времен паяльников и макетных плат, «работать должно не в принципе, а в корпусе». Постановка этой задачи в практической плоскости вскрыла такой пласт системных, методических проблем фундаментального характера, что по сравнению с ним состоявшийся 20 лет назад переход от традиционных процессоров к многопроцессорным вычислительным системам кажется мелким, незначительным эпизодом. Прежде чем переходить к рассмотрению этих проблем, поговорим несколько более подробно о том, как конкретно выглядят сегодня технологии применения изделий программируемой логики. Глава 12. Технологии программируемой логики сегодня.► |
|
||||||||||||||||||||||||||||||||
| Тел. +7(499)220-79-72; E-mail: inform@kiam.ru | ||||||||||||||||||||||||||||||||||