Как работает микропроцессор

08.04.21

[Домашняя]

 

Как работает микропроцессор.

Анатомия микропроцессора

В предыдущей главе было сказано, что любой алгоритм можно реализовать через память. Но память сама по себе ничего не делает — нужно некое устройство, которое бы занималось именно реализацией этого алгоритма шаг за шагом по времени. В примере с дешифратором-преобразователем десятичного кода в семисегментный роль такого устройства играет источник входного кода. А в общем случае?

Так возникла идея процессора — универсального логического устройства, которое, руководствуясь командами, поступающими из памяти, осуществляло бы нужные действия. Хочется отметить, что в музыкальных автоматах, механических счетных машинах или, скажем, в ткацких станках Жаккарда (начало XIX века, они явились первым в истории примером станков с ЧПУ) процессора как такового не было — или, если угодно, все устройство можно считать специализированным процессором. Особенностью всех этих устройств было то, что они спроектированы для производства совершенно определенных действий, в то время как процессор — универсальная вещь. В аналитической машине Бэббиджа, которая была настоящим компьютером, процессор уже был, как и в первых ЭВМ на дискретных элементах, но по настоящему этот термин стал ключевым, когда выделение единицы под названием "процессор" на основе функционального признака совпало с выделением по признаку физическому — в виде отдельной микросхемы. Первоначально корпорация Intel не помышляла ни о каких процессорах и занималась разработкой и продажами микросхем памяти, на которые тогда как раз начиналось увеличение спроса. В 1969 г. в Intel появились несколько человек из Busicom— молодой японской компании, занимающейся производством калькуляторов. Им требовался набор из 12 интегральных схем в качестве основного элемента нового дешевого настольного калькулятора. Проект был разработай Масатоши Шима, который и представлял японскую сторону. Тед Хофф (Marcian Е. "Ted" Hoff, p. 1937), руководитель отдела, занимавшегося разработкой применений для продукции Intel, ознакомившись с проектом, понял, что вместо того, чтобы создать калькулятор с некоторыми возможностями программирования, можно сделать наоборот, компьютер, программируемый для работы в качестве калькулятора. Развивая идею, в течение осени 1969 г. Хофф определился с архитектурой будущего микропроцессора. Весной в отдел Хоффа пришел (все из той же уже известной нам Fairchild) новый сотрудник Фредерик Фэггин (Federico Faggin), который и придумал название для всей системы: "семейство 4000". Семейство состояло из четырех 16-выводных микросхем: 4001 содержал ROM на 2 Кбайта; 4002 содержал RAM с 4-битным выходным портом для загрузки программ; 4003 представлял собой 10-битный расширитель ввода-вывода с последовательным вводом и параллельным выводом для связи с клавиатурой, индикатором и другими внешними устройствами; наконец 4004 был 4-битным ЦПУ (центральным процессорным устройством).

Он состоял из 2300 транзисторов и работал с тактовой частотой 108 кГц. 15 ноября 1971 г. было объявлено о создании первого микропроцессора. Busicom приоб­рела разработку, заплатив Intel $60 000. Но в Intel решили возвратить Busicom эти деньги, чтобы вернуть себе права на микропроцессор. 14004 обладал вычислительной мощностью, сравнимой с первым электронным компьютером ENIAC. Свое первое практическое применение 4004-й нашел в таких системах, как устройства управления дорожными светофорами и анализаторы крови. Он использован в бортовой аппаратуре межпланетного зонда Pioneer-10, который поставил рекорд долгожительства среди подобных аппаратов: он был запущен NASA в 1972 г., а к 1 сентября 2001 г. Pioneer-10 удалился от Земли на 11,78 млрд км и все еще работал. Для того чтобы понять, как работает микропроцессор, зададим себе вопрос — а как он должен работать? Есть теория (в основном созданная пост­фактум: после того как первые ЭВМ были уже построены и функционировали), которая указывает, как именно строить алгоритмы и что процессор в соответствии с этим должен делать. Мы, естественно, углубляться в это не будем, просто констатируем, что любой алгоритм есть последовательность неких действий, записанных в виде набора последовательно выполняемых команд (операторов). При этом среди таких команд могут встречаться команды перехода, которые в некоторых случаях нарушают исходную последовательность выполнения операторов строго друг за другом. Среди прочих должны быть также команды ввода и вывода данных (программа должна как-то общаться с внешним миром?), а также команды выполнения арифметических и логических операций. Результаты выполнения одних команд должны быть доступны последующим командам. Команды должны где-то храниться, поэтому неотъемлемой частью всей системы должно быть устройство памяти. Где-то надо складывать и данные, как исходные, так и результаты работы программы, поэтому должно быть устройство памяти данных. Так как команды и данные, в конечном счете, все равно есть числа, то память может быть общая, только надо не забывать, где именно у нас команды, а где — данные. Это есть один из упомянутых в прошлой главе принципов фон Неймана, хотя и в микроконтроллерах, скажем, традиционно используют не фоннеймановскую, а так называемую гарвардскую архитектуру, когда память данных и программ разделены (это разделение, впрочем, может нарушаться в обе стороны). В соответствии со сказанным основной цикл работы процессора должен быть таким: выборка очередной команды (из памяти), если необходимо — выборка исходных данных для нее, выполнение команды, размещение результатов в памяти (опять же если это необходимо). Вся работа в этом цикле должна происходить автоматически по командам некоторого устройства управления, содержащего тактовый генератор — системные часы, по которым все син­хронизируется. Кроме того, где-то это все должно происходить — складирование данных, кода команды, выполнение действий и т. п., так что процессор должен содержать некий набор регистров, определенным образом связанных между собой, а также с устройством управления и АЛУ, которое неизбежно должно присутствовать. Заметим, что команды вместе с исходными данными, вообще говоря, могут быть неодинаковой длины. Так, часто используемая и присутствующая во всех микропроцессорных системах команда запрета внешних прерываний (т. е. реакции на события от внешних устройств), не требует указания каких- либо адресов или других данных для своего выполнения — это просто число (в тех системах, с которыми мы будем иметь дело, — однобайтовое число). Естественно, цикл работы при этом будет максимально упрощенным: выборка команды, ее выполнение и все-— можно приступать к выполнению следующей команды. Другой пример — команда, например, сдвига разрядов некоторого числа (что эквивалентно, как мы знаем из главы 19, умножению или делению на два в зависимости от направления сдвига). Эта команда (сама по себе— такое же число) требует загрузки операнда— адреса регистра, в котором хранится число, подлежащее сдвигу (в некоторых системах данная операция может быть упрощена, если заранее указать, что все подобные операции выполняются в одном и том же регистре). То есть процессор теперь должен загрузить команду, определить, что ей нужен операнд, загрузить этот операнд (адрес регистра, который, как правило, хранится в памяти сразу после собственно кода команды), потом только проделать нужные действия. Еще пример — сложение чисел, при котором нужно уже два операнда, адреса первого и второго слагаемых. Опять же в некоторых системах это может быть упрощено, если слагаемые могут находиться только в определенных регистрах. Но даже и в таких системах есть команда обмена с памятью, которая, как ни крути, требует указания адреса в памяти. В таких случаях возникает искушение сделать все команды одинаковой длины (например, по три байта), чтобы не тратить драгоценное процессорное время на определение типа команды и последующую дополнительную загрузку, а считывать сразу три байта, а там уже разбираться, все они нужны или нет. Легко понять, что время-то при этом экономится, а память— не очень. В микроконтроллерах АVR эта задача решена похожим способом — там все команды являются 16- разрядными словами, но сам код команды имеет переменную длину; другую часть этого слова занимают операнды. Правда, особо памятью там не разбрасываются, и все разряды обычно нужны для дела. Усложнение устройства управления позволило за один такт считывать команду и выполнять ее. Но это не касается обмена с памятью, который в таких случаях должен, как правило, осуществляться отдельно, и занимает больше тактов, чем операции с регистрами. Впрочем, в разных системах устроено по-разному, скажем, в популярном до сих пор процессоре 8051 команда обычно занимает 12 тактов, в Р1С-процессорах — четыре, а в микроконтроллерах Atmel AVR — всего один. Можно, конечно, просто завести 51-й процессор от тактовой частоты 24 МГц, PIC — от 8 МГц, а AVR — от 2 МГц и считать, что они работают одинаково быстро... Познакомившись теперь с тем, как процессор выполняет команды, мы можем нарисовать блок-схему типичного микропроцессора (МП). Она показана на рис. 29.2.

Сразу отметим, что мы включили в состав процессора память программ, которая у ПК-процессоров находится всегда отдельно— сами знаете, программы какого объема бывают в персональных компьютерах. В то же время в большинстве современных микроконтроллеров ПЗУ программ входит в состав чипа и обычно составляет от 1 до 8 кбайт, чего для подавляющего большинства применений вполне достаточно, а если вдруг не хватит — всегда можно подключить внешнюю память. А вот внутреннее ОЗУ в том или ином количестве имеется во всех современных процессорах, у процессоров для ПК это называется кэш-памятью (иногда— нескольких уровней). Типичный размер ОЗУ у микроконтроллеров — от 256 байт до 1 Кбайта. Главное устройство в МП, которое связывает все узлы в единую систему — внутренняя шина данных. По ней все устройства обмениваются сигналами. Например, если МП требуется обратиться к внешней памяти, то при исполнении соответствующей команды на шину данных выставляется нужный адрес, от устройства управления поступает через нее же запрос на обращение к нужным портам ввода/вывода. Если порты готовы, адрес поступает на выходы портов, затем принимающий порт выставляет на шину данных принятые из внешней памяти данные, которые загружаются в нужный регистр, после чего шина данных свободна. Для того чтобы все устройства не мешали друг другу, все это строго синхронизировано, при этом каждое устройство имеет, во-первых, собственный адрес, во-вторых, может находиться в трех состояниях — работать на ввод, на вывод или находиться в третьем состоянии, не мешая другим работать. Другой вариант организации общей шины, не требующий третьего состояния — так называемое "монтажное ИЛИ", когда активным является только низкий уровень. Микроконтроллер (МК) отличается от микропроцессора вообще тем, что он предназначен для управления другими устройствами, и поэтому имеет встроенную развитую систему ввода-вывода, но относительно более слабое АЛУ. Большинство микроконтроллеров — 8-разрядные, т. е. они оперируют данными в один байт, хотя есть и 16-разрядные типы. Если же необходимо увеличить разрядность, как при операциях умножения и деления, то приходится писать специальные подпрограммы с участием нескольких регистров. Разрядность регистров как раз и определяет разрядность МП, которая у ПК- процессоров, как известно, может достигать 32 и даже 64 разрядов. Интересная штука получилась с процессором 18086, который послужил, как известно, прототипом всех современных МП для Wintel-компьютеров. Разработчики IBМ PC в 1981 г. остановились сначала на восьмиразрядном 18088. К тому времени Intel уже год как выпускала и 16-разрядную модификацию под названием 8086, но то ли это показалось излишеством, то ли распространенные тогда повсеместно восьмиразрядные системы просто были роднее. Так что на самом деле прототипом то является он, а на 8086 выпускались только некоторые IBM-совместимые клоны. Однако это большой роли не играет, потому что разницы между 8086 и 8088 практически никакой нет— 16-разрядной у 8086 является только внутренняя шина данных, а по внешним выводам и системе команд они полностью совместимы. А вот данные, с которыми манипулировали операционные системы DOS и Windows 3.x, были 16-разрядными, и этому требованию отвечал 286 процессор. Число 65 536, естественно, маловато для практики, но первым 32-разрядным процессором стал только 386-й (любопытно, что при этом сами ОС оставались 16-разрядными довольно долго). С тех пор на этой величине ПК фактически и застряли = 4 294 967 296, и большее целое число требуется очень нечасто). 64-разрядные процессоры (например, Intel Itanium) пока еще используются исключительно в серверах, но с удешевлением МП и чипсетов, несомненно, в конце концов, окажутся у нас на столе. Только не совсем ясно — а надо ли? Если вернуться к микроконтроллерам, то в них 8-разрядные системы занимают, пожалуй, большую долю рынка. Число разрядов не имеет отношения к числу адресных линий, которое, в принципе, должно быть чем больше, тем лучше — оно определяет количе­ство внешней памяти, которое может адресовать процессор. Обычная ширина адресной линии для 8-разрядных МК— 16 разрядов, т. е. количество непо­средственно адресуемой внешней памяти (адресное пространство) может максимально составлять 64 Кбайт. Впрочем, большинство МК позволяют при нужде обойти это ограничение. А как вообще начинается работа МП при включении питания? Очень просто — большинство МП обращаются к ячейке номер 0 в памяти программ (последняя обычно организована так, что внутренняя и внешняя память имеют общее адресное пространство, в котором младшие адреса занимает внутренняя память, а по ее истечении начинается память внешняя, так что нулевая ячейка физически имеется всегда). Что именно бывает записано в этой ячейке — мы увидим далее, а сейчас укажем только на одно, но важное исключение. У микропроцессора 8088 и 8086 адресное пространство составляло 1 Мбайт (20 адресных линий), и разработчики заставили его после инициализации обращаться по адресу, расположенному за 16 байт до конца этого пространства: а именно по адресу FFFF0h, который был зарезервирован под BIOS. Зачем это было сделано — понятно, а именно затем, чтобы не отъедать BIOSom драгоценную основную память. На то, что в ПК будут устанавливать весь мегабайт полностью, они и не рассчитывали, поэтому, например, под видеоадаптер также отводились адреса ближе к концу адресного пространства. В МК все проще — обычно внутренняя и внешняя память программ имеют одно и то же адресное пространство, так что первые адреса внешней памяти "пропадают". Точно так же там обстоит дело с памятью данных (в ПК, напомним, они объединены) — регистры, порты ввода-вывода, внутренняя и внешняя SRAM имеют общую адресацию. А вот внутренняя EEPROM, если она имеется, имеет отдельное адресное пространство, и доступ к ней осуществляется через порты. Несколько слов о счетчике команд. Он автоматически устанавливается на ноль в начале работы, что соответствует начальному адресу памяти, и автоматически же инкременируется (т. е. увеличивается на единицу) с каждой выполненной командой. (В некоторых системах он инкременируется не на единицу, а на число байт, содержащихся в команде, но для нас это не существенно). Если по ходу дела порядок команд нарушается, например, встречается команда перехода (ветвления), то в счетчик загружается соответствующий номер команды (или, соответственно, байта) от начала программы. К счастью, нам самим фактически не придется иметь дело со счетчиком команд, потому что все указания на этот счет содержатся в самой команде и процессор все делает автоматически. Если подробности внутреннего функционирования МП нас волнуют не очень (достаточно иметь общее представление о структуре, чтобы понимать, что именно происходит при выполнении команд), то обмен с внешней средой нас как раз интересует во всех деталях. Для этого служат порты ввода/вывода? которые на схеме рис. 29.2 показаны в количестве трех — А, В и С.  В разных МП их может быть и больше, и меньше, еще важнее число выводов этих портов, которое чаще всего совпадает с разрядностью процессора (но не всегда, как это было у 8086). Если мы заставим эти порты общаться с внешней памятью, то на двух из них можно выставить 16-разрядный адрес, а на оставшемся — принимать данные. А как быть, если портов два или вообще один? (К примеру, в микроконтроллере AVR 2313 портов формально два, но один усеченный, так что общее число линий составляет 15.) Для этого все порты в МП всегда двунаправленные. Скажем, если портов два, то можно сначала выставить адрес, а затем переключить их на вход и принимать данные. Есте­ственно, для этого порты должны позволять работу на общую шину — т. е. либо иметь третье состояние, либо выход с общим коллектором для объединения в Монтажное ИЛИ. Варианты для обоих случаев организации выходной линии порта показаны на рис. 29.3, где приведены упрощенные схемы выходных линий микроконтроллеров (МК) семейства 8048— широко использовавшегося ранее (например, он был выбран в качестве контроллера клавиатуры в IBM PC) предшественника суперпопулярного МК 8051. В самом 8051 построение портов несколько сложнее (в частности, вместо резистора там полевой транзистор), но для уяснения принципов работы это несущественно. По первому варианту (рис. 293, а) в МК 8048 построены порты 1, 2 (всего там три порта). Когда в порт производится запись, то логический уровень поступает с прямого выхода защелки на статическом D-триггере на вход схемы И, а с инверсного— на затвор транзистора VT2. Если этот уровень равен лог. 0, то транзистор VT1 заперт, а VT2 открыт, на выходе также лог. 0. Если уровень равен лог. 1, то на время действия импульса "Запись" транзистор VT1 открывается, а транзистор VT2 запирается (они одинаковой полярности). На самом деле VT1 должен находиться в "непонятном" состоянии, т. к. при запертом VT2 неподключенный выход фактически "висит в воздухе". Если на выходе присутствует емкость (а она всегда имеется в виде распределенной емкости проводников и емкости входов других компонентов), то через VT1 протекает достаточно большой ток заряда этой емкости, позволяющий сформировать хороший фронт перехода из 0 в 1. Как только импульс "Запись" заканчивается, оба транзистора отключаются, и лог. 1 на выходе поддерживается резистором R1. Выходное сопротивление открытого транзистора VT1 примерно 5 кОм, а резистора — 50 кОм. Любое другое устройство, подключенное к этой шине, при работе на выход может лишь либо поддержать лог. 1, включив свой подобный резистор параллельно R1, либо занять линию своим логическим нулем — это, как видите, и есть схема Монтажное ИЛИ. При работе на вход состояние линии просто считывается со входного буфера (элемент "В" на рис. 29.3, а). Второй же вариант, по которому устроен порт 0, (рис. 29.3, б) есть обычный выходной каскад КМОП с третьим состоянием, т. е. такой порт может работать на выход, только полностью занимая линию, остальные подключенные к линии устройства при этом должны смиренно внимать монополисту, вос­принимая сигналы.

Это обычно не создает особых трудностей и схемотехнически даже предпочтительно (ввиду симметрии выходных сигналов и высокого сопротивления для входных). Единственная сложность возникает при сопряжении такого порта с линией, работающей по первому варианту, т. к. при лог. 1 на выходе могут возникнуть электрические конфликты, если кто-то попытается выдать в линию лог. 0. Для обеспечения работы трехстабильного порта по схеме "монтажное ИЛИ"  (в том числе для их параллельной работы) применяют хитрый прием: всю линию "подтягивают" к напряжению питания с помощью внешнего резистора (во многих МК существует встроенный отключаемый резистор, установленный аналогично R1 в схеме рис. 29.3, а), и нормальное состояние всех участвующих трехстабильных портов — работа на вход в третьем состоянии, тогда на линии всегда будет лог. 1. На выход же линию переключают только, когда надо выдать лог. 0, в этом случае, даже при одновременной активности нескольких портов, конфликтов не возникнет. Многих устройств, имеющихся в большинстве современных микропроцессоров, мы не показали. Для ПК-процессоров важным узлом является аппаратный блок производства операций с плавающей точкой — т. е. с действительными числами, который иногда оказывает решающее влияние на быстродействие всей системы. У микроконтроллеров подобные весьма сложные узлы обычно отсутствуют (кроме специализированных типов), зато имеются встроенные таймеры, последовательные порты, встроенный контроллер прерываний, АЦП и другие полезные дополнения, отчего МК еще часто называют микро- ЭВМ или "computer-on-chip". Чип МК является полнофункциональной системой, в принципе не требующей для своей работы других компонентов, кроме некоторых навесных деталей типа кварцевого резонатора. Для ПК- процессоров это совсем не так, они "заточены" под выполнение арифметико- логических операций, а весь обмен с внешней средой, включая память, возложен на окружение, называемое чипсетом. Потому чипсет и платы расщирения часто играют решающую роль в функциональности конкретного ПК, зато такая система является более гибкой и быстродействующей. Самый главный вопрос — как же программировать микропроцессор? К счастью, эта процедура в настоящее время значительно облегчена, и мы познакомимся с ней в главе 31. Но сначала рассмотрим более подробно устройство одного из самых распространенных типов микроконтроллеров — Atmel AVR.

Книга: Занимательная электроника

Домашняя

Дата последнего изменения этого узла 08.04.2021