Русский
Русский
English
Статистика
Реклама

Nanoprocessor

Перевод HP Nanoprocessor, часть II реверс-инжиниринг цепей на основе фотошаблонов

06.10.2020 14:22:26 | Автор: admin
Первая часть

В 1974 году Hewlett-Packard разработала микропроцессор для управления различными функциями в собственных продуктах они дисководов для гибких магнитных дисков до вольтметров. Этот простой процессор не дотягивал до обычных микропроцессоров он даже не поддерживал сложение или вычитание поэтому его назвали нанопроцессор. Ключевыми особенностями Nanoprocessor были низкая стоимость и высокая скорость работы: по сравнению с современным ему Motorola 6800 стоимостью $360, Nanoprocessor стоил $15, а операции управления выполнял на порядок быстрее.

Хоть у него и не было операции сложения, Nanoprocessor мог (медленно) складывать числа путём повторного инкремента или декремента (операций, которые он поддерживал). В иных случаях, например, с вольтметром от Hewlett-Packard, к продукту добавляли чипы АЛУ (74LS181), которые занимались быстрым сложением доступ к ним осуществлялся, как к устройствам ввода/вывода. Естественно, будучи полным по Тьюрингу, Nanoprocessor теоретически мог делать всё от вычисления функций с плавающей запятой до запуска игры Crysis; это просто было бы очень медленно.

Фотошаблон процессора можно скачать по ссылке (122 МБ PSD).


HP Nanoprocessor, номер части 1820-1691. Напряжение смещения, -2,5 В, написано от руки оно меняется от экземпляра к экземпляру. Последняя цифра номера части тоже написана от руки, и обозначает скорость работы чипа.

В последующие десятилетия процессор оставался неизвестным, до тех пор, пока его разработчик, Ларри Бауэр, не поделился недавно фотошаблонами и документацией на чип с проектом The CPU Shack. Там отсканировали фотошаблоны и написали статью про Nanoprocessor. После того, как Антуан Берковичи сшил изображения в одно, я написал обзор Nanoprocessor на его основе. Это вторая часть статьи, где я обсуждаю некоторые подробности схемы Nanoprocessor, проводя реверс-инжиниринг на основе фотошаблонов. Функциональные блоки Nanoprocessor интересно изучать, поскольку он обходится минимальной реализацией необходимых функций, оставаясь при этом полезным микропроцессором.

Внутри Nanoprocessor


Как и большинство процессоров той эпохи, Nanoprocessor восьмибитный. Однако он не поддерживает память произвольного доступа, а код исполняет из внешнего двухкилобайтного ПЗУ. У него есть 16 8-битных регистров больше, чем у большинства процессоров, и достаточно, чтобы восполнить отсутствие памяти для многих приложений. У Nanoprocessor было 48 команд значительно меньше, чем 72 команды у Motorola 6800. Однако у Nanoprocessor был удобный набор операций по установке, очистке и проверке битов, которых не хватало другим процессорам того времени. Также у него было несколько команд ввода/вывода, поддерживавших как порты ввода/вывода, так и контакты ввода/вывода общего назначения, благодаря чему с его помощью было легко управлять другими устройствами.

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


Комбинированные фотошаблоны Nanoprocessor (кликабельно)

По изображению фотошаблона, приведённому выше, можно сделать вывод о простоте Nanoprocessor. Синие линии это металлические проводники сверху чипа, зелёные кремний с примесями. Чёрные квадраты по периметру 40 площадок для связи с внешними контактами ИС. Небольшие чёрные участки внутри транзисторы. Если как следует приглядеться, можно насчитать их 4639 штук.

Если учитывать, что декодер команд состоит из пар мелких транзисторов, что сделано для удобства расположения компонентов, и считать эти пары за один, то получится 3829 транзисторов. Из них 1061 подтягивающие вверх, а 2668 активные. Для сравнения, у микропроцессора 6502 было 4237 транзисторов, 3218 из которых активные. У 8008-го было 3500 транзисторов, а у Motorola 6800 4100.

На блок-схеме снизу показана внутренняя структура Nanoprocessor. В середине находятся 16 регистров хранения. Компаратор позволяет сравнивать две величины для обеспечения условного ветвления. Устройство управляющей логики занимается инкрементом, декрементом, сдвигом и битовыми операциями аккумулятора. У него нет арифметических и логических операций стандартного АЛУ. Счётчик программ (справа) извлекает команду из регистра команд (слева); у прерываний и вызовов подпрограмм есть свои стеки длиной в один элемент для хранения адресов возврата.


Блок-схема работы из инструкции к Nanoprocessor

Подчеркну, что, несмотря на свою простоту и отсутствие арифметических операций, Nanoprocessor это не какой-то игрушечный процессор, переключающий линии управления. Это быстрый и мощный процессор, использовавшийся для выполнения сложных операций. К примеру, модуль часов реального времени HP 98035 использовал Nanoprocessor для обработки двух десятков разных управляющих ASCII-строк, а также для подсчёта количества дней в месяце.

Интересным проектом для развлечения может стать создание FPGA-версии Nanoprocessor поскольку Nanoprocessor, пожалуй, является наиболее простым вариантом настоящего коммерческого процессора. В инструкции к нему описаны все команды и даются примеры кода, который можно выполнять.

Регистры


На фото кристалла ниже видно, что значительную часть Nanoprocessor занимают его 16 регистров. С остальными компонентами они общаются посредством шины данных. Цепи сверху выбирают конкретный регистр. Регистр R0, справа, рядом с компаратором.


Значительную часть Nanoprocessor занимают его 16 регистров

Строительный блок регистра два инвертора в цепи обратной связи, хранящие один бит так, как показано ниже. Если на верхнем проводнике 0, правый инвертор выдаст на нижний проводник 1. Тогда левый инвертор выдаст 0 на верхний проводник, завершая цикл. Цепь остаётся стабильной, помня 0. Таким же образом, если на верхнем проводнике 1, он инвертируется в 0 на нижнем, и обратно в 1 на верхнем. Цепь может хранить 0 или 1 таким способом, формируя 1-битовую ячейку памяти.


Два инвертора в стабильной цепи, хранящей бит

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


Хранение одного бита в Nanoprocessor. Каждый бит реализован на 6 транзисторах (ячейка 6T SRAM).

Набор регистров состоит из матрицы таких битовых ячеек. Шина выбора регистра выбирает один регистр (один столбец) для чтения или записи. После этого верхний и нижний проходные транзисторы соединяют инверторы с соответствующими горизонтальными битовыми шинами. Для чтения верхняя битовая шина обеспечивает значение, хранящееся в ячейке; для восьми хранящихся в регистре битов есть восемь битовых шин. Для записи значение передаётся на верхнюю битовую шину, а инвертированное значение передаётся на нижнюю. Эти значения заменяют сигналы инверторов, заставляя их принимать нужное значение и хранить этот бит. Таким образом сетка горизонтальных битовых шин и вертикальных шин выбора позволяет считывать или записывать значение в конкретный регистр.

Декодирование команд


Декодирующие цепи занимаются тем, что принимают двоичный код команды (к примеру, 01101010), и определяют, что это за команда (в данном случае загрузить аккумулятор из регистра 10). По сравнению с многими процессорами, команды у Nanoprocessor довольно просты: у него их относительно немного (48), а код команды всегда один байт. На диаграмме ниже показано, что логика декодирования команд (красная) занимает значительную часть чипа. Регистр команд (зелёный) это набор из восьми защёлок, в которых хранится текущая инструкция. Командный регистр находятся рядом с контактами данных, на которые приходит команда из ПЗУ. В данном разделе мы разберём цепь декодирования, показанную жёлтым.



Декодирование осуществляется NOR-вентилями. Каждый NOR-вентиль распознаёт определённую команду или группу команд. NOR-вентиль принимает на вход биты команды или их дополнения. Когда все входящие биты нулевые, NOR-вентиль сообщает о совпадении. Это позволяет искать совпадения как во всей команде целиком, так и в части команды. К примеру, команда загрузить аккумулятор из регистра R имеет двоичный формат 0110rrrr, в котором четыре последних бита обозначают нужный регистр. NOR-вентиль (bit7 + bit6' + bit5' + bit4)' совпадёт с такой командой.

Структурированный таким образом декодер команд хорош тем, что его можно собрать из компактных и повторяющихся цепей. Его часто называют ПЛМ (программируемая логическая матрица). Идея в том, что входящие сигналы на матрицу подаются по горизонталям, а выходящие по вертикалям. На каждом пересечении может находиться транзистор, и тогда входящий сигнал является частью затвора; если транзистора нет, этот входящий сигнал игнорируется. В итоге получаются компактно расположенные NOR-вентили. В ранних микропроцессорах декодер часто делали из матрицы NOR-вентилей к примеру, так было у 6502-го.

На диаграмме ниже с правой стороны показаны три увеличенных декодера, которые обведены жёлтым на диаграмме выше. Эта схема соответствует самому левому декодеру. Обратите внимание на соответствие транзисторов на схеме розовым пятнам транзисторов на раскладке. Идея в том, что если любой входящий сигнал активирует транзистор, то транзистор подтягивает выходной сигнал к земле. Иначе выход подтягивается вверх резистором. Инверторы снизу усиливают сигнал, благодаря чему тока оказывается достаточно, чтобы питать все восемь частей аккумулятора. Интересно, что в данной раскладке используются пары транзисторов с соединёнными землёй и выходом я не вижу преимуществ перед простым использованием единственного транзистора. В любом случае, обратите внимание, как ПЛМ обеспечивает плотное расположение декодеров.

Обратите внимание, что инвертор в декодере команд подтягивается до 12 В, а не до 5 В. Это оттого, что в Nanoprocessor используются транзисторы с металлическим затвором вместо более передовых транзисторов с кремниевым затвором, как у других микропроцессоров той эпохи. Недостаток транзистора с металлическим затвором повышенное пороговое напряжение, поэтому выходное напряжение транзистора получается значительно ниже, чем напряжение на затворе. Выход с обычного инвертора слишком мал для того, чтобы питать затвор проходного транзистора, поскольку у него на выходе напряжение опять упадёт. Решение использовать для инвертеров декодера, управляющего проходными транзисторами аккумулятора, питание с 12 В. Тогда у сигналов будет достаточно напряжения для активации проходных транзисторов. Иначе говоря, Nanoprocessor нужно дополнительные 12+ В, поскольку в нём используются транзисторы с металлическим затвором вместо более передовых транзисторов с кремниевым затвором.


Одна из цепей декодера Nanoprocessor. Схема слева соответствует самому левому декодеру из трёх, показанных справа.

Данная цепь генерирует сигнал инкремента/декремента, который подаётся в цепь аккумулятора. Цепь обнаруживает совпадение, когда уровень сигналов генератора тактовой частоты, запроса, 6-го бита команды и 2-го бита команды низкий совпадение обнаруживается в виде x0xxx0xx во время фазы выполнения. Среди таких команд Increment Binary (00000000), Increment BCD (00000010), Decrement Binary (00000001) и Decrement BCD (00000011).

Показанная на диаграмме цепь ищет совпадения с командами вида x0xxx0xx, поэтому совпадение находится с гораздо большим количеством команд, чем только инкремент и декремент. Почему же не ищется полное совпадение? Причина в том, что если аккумулятор не используется, то активация сигнала инкремента/декремента значения не имеет. Расширяя список вариантов совпадений, разработчики могли избавиться от некоторых транзисторов в схеме. Важно, что цепь отвергает другие команды, связанные с аккумулятором вроде Clear accumulator (00000100) или Load accumulator from register (0110rrrr).

Компаратор


Важная цепь Nanoprocessor компаратор, сравнивающий хранящееся в аккумуляторе значение со значением из регистра R0. Компаратор использует единственную, но хитрую цепь для их сравнения. По сути, алгоритм сравнивает два числа, начиная со старших битов. Если биты равны, продолжаем двигаться к более младшим. Первое различие в битах определяет, какое значение больше (к примеру, в случае с 10101010 и 10100111 это определяет 4-й бит справа).

Алгоритм реализован в восемь ступеней, по этапу на бит, начиная с самого старшего бита внизу. Каждая ступень состоит из двух симметричных частей одна определяет, выполняется ли неравенство A > R0, а её дополнительная часть проверяет неравенство A < R0. Если числа пока были равны, но на этой ступени обнаружилась разница, ступень генерирует сигнал больше или меньше. Иначе она передаёт решение на более нижнюю ступень. Итоговое решение принимает самая верхняя ступень. Обратите внимание, что сравнение на равенство в компараторе происходит нахаляву если на выходе нет сигналов больше или меньше, значит, значения равны.


Одна из ступеней 8-битного компаратора

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


Две ступени компаратора так, как это задаётся на фотошаблоне

Команды условного ветвления Nanoprocessor могут проверять выходные данные компаратора. Цепи условного ветвления устроены довольно просто: несколько битов команды ветвления выбирают определённую проверку через мультиплексор. Затем 7-й бит команды решает, выбрать эту ветку, если истина или эту ветку, если ложь. В отличие от большинства процессоров, Nanoprocessor не позволяет проводить ветвление на любой адрес. Он просто пропускает два байта команд, если условие удовлетворено (а обычно в двух этих байтах содержится команда перехода к нужной цели, но иногда там бывают и другие команды). Схема пропуска проста: программный счётчик вызывается повторно, при этом увеличивает значение не на 1, а на 2, пропуская две команды. Получается, что в Nanoprocessor реализован широкий спектр условных проверок на относительно небольшом количестве цепей.

У Nanoprocessor есть большой набор условий для ветвления удивительно большой для такого простого процессора. Можно проверять следующие условия: A > R0, A >= R0, A < R0, A <= R0, A == R0 или A != R0. Кроме того, условное ветвление может зависеть от того, нулевое значение в аккумуляторе, или нет, равен ли нулю конкретный бит хранящегося в аккумуляторе значения, взведён ли флаг переполнения, установлен ли определённый бит регистра ввода/вывода.

Аккумулятор и устройство управляющей логики


Аккумулятор особый 8-битный регистр, в котором хранится байт, обрабатывающийся в данный момент. Операции с аккумулятором проводит устройство управляющей логики (УЛУ), который в инструкции к процессору называют сердцем Nanoprocessor. УЛУ эквивалент арифметико-логического устройства (АЛУ) в большинстве процессоров, только оно не проводит арифметических или логических операций. При этом УЛУ не такое бесполезное, как кажется с первого взгляда. Оно может увеличивать или уменьшать значение в аккумуляторе, как в двоичном, так и в двоично-десятичном коде (BCD). В BCD в одном байте хранятся два десятичных разряда. Это очень полезный режим для ввода/вывода или дисплеев. Также УЛУ может находить двоичное дополнение аккумулятора или сбрасывать его, а также устанавливать и сбрасывать определённый бит. Наконец, оно поддерживает операции сдвига влево и вправо.


Цепи, относящиеся к аккумулятору

На диаграмме выше показаны схемы аккумулятора и УЛУ. На первом участке расположены различные цепи, определяющие нулевое значение, поддерживающие BCD, и обеспечивающие проскок переноса быструю генерацию переноса из 4-х младших битов. На втором участке находится основной аккумулятор и цепи УЛУ. Третий участок распределяет управляющие сигналы от декодирующей логики выше к восьми частям аккумулятора. Последний участок содержит логику декодирования команд, которая декодирует битовые операции и отправляет сигнал нужной части аккумулятора.

Основная часть аккумулятора/УЛУ состоит из 8 частей, по одной на бит, и младший бит расположен сверху. Мы рассмотрим четыре цепи из каждой части: генератор переноса для операций инкремента/декремента, генератор бита для операций инкремента/декремента, мультиплексор для выбора нового значения аккумулятора, и защёлку, где хранится значение аккумулятора.

Каждая часть устройства инкремента/декремента (ниже) реализуется при помощи полусумматора. Направление цепи инкремента/декремента определяет код операции: 0 в младшем бите кода операции говорит, что нужно делать инкремент, а 1 декремент. Цепь переноса слева генерирует сигнал переноса. Для инкремента нужно создавать выходной сигнал переноса, если поступил входной сигнал переноса, и текущий бит равен 1 (поскольку тогда он будет увеличен до двоичного 10). Для декремента линия переноса сигнализирует о заёме, поэтому выходной сигнал переноса генерируется, когда есть входной сигнал переноса (то есть, заём), а текущий бит равен 0.


Одна часть цепи инкремента/декремента

Цепь справа обновляет текущий бит при инкременте или декременте. Текущий бит переключается при наличии входного сигнала переноса по сути, реализация XOR через три NOR-вентиля. Одна из сложностей подстройка под BCD. Для операции инкремента BCD перенос происходит при инкременте цифры 9, а для операции декремента BCD цифра 0 уменьшается до 9, а не до двоичной 1111.

Различными операциями аккумулятора заведует мультиплексор. В зависимости от операции активируется один проходной транзистор, выбирающий нужную величину. К примеру, для операции инкремента/декремента верхний транзистор выбирает выходной сигнал с цепи инкремента/декремента, описанной выше. Транзистор активирует описанный ранее декодер команд, нашедший соответствующую команду инкремента/декремента. Сходным образом команда сдвига вправо активирует проходной транзистор сдвига вправо, подавая n+1 бит аккумулятора в каждую из частей аккумулятора для сдвига значения.


Схема защёлки, хранящей один бит аккумулятора, и мультиплексора, выбирающего входной сигнал для аккумулятора

Защёлка хранит один бит для аккумулятора. При активации транзистора удержания аккумулятора два NOR-вентиля формируют петлю, удерживающую значение. Если вместо этого активируется транзистор загрузки аккумулятора, аккумулятор загружает нужное значение из мультиплексора. Линии сброса бита n и установки бита n позволяют командам изменять отдельные биты аккумулятора; при этом мультиплексор обновляет все биты аккумулятора сразу.

Счётчик и адресация программ


Ещё один большой блок цепей 11-битный счётчик программ, расположенный в левом нижнем углу Nanoprocessor. Также в этом блоке находится защёлка, хранящая адрес возврата из подпрограммы, и ещё одна защёлка, хранящая счётчик программы после прерывания. Их можно представлять себе, как стек длиной в один элемент. В программном счётчике есть устройство инкремента, отвечающее за переход к следующей команде. Оно также умеет делать инкремент сразу на два, позволяя командам условного ветвления пропускать две команды (такое устройство инкремента реализовано просто через увеличение 1-го бита вместо 0-го). Для ускорения работы устройства инкремента у него есть функция проскока переноса; если все шесть младших битов равны 1, он увеличит сразу 6-й бит, не ожидая, пока перенос пройдёт через все младшие биты.

Контроль и тактовая частота


Последняя часть Nanoprocessor схема управления. По сравнению с другими микропроцессорами, схема управления Nanoprocessor кажется почти тривиальной: процессор переходит от такта запроса к такту выполнения и обратно (с периодическими прерываниями). Схема управления представляет собой просто парочку триггеров и вентилей, поэтому о ней особенно сказать нечего.

Заключение


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

Nanoprocessor использовал транзисторы с металлическими затворами, в то время, как другие микропроцессоры уже несколько лет как начали переходить на транзисторы с кремниевыми затворами. Разница может показаться непонятной, однако на расположение компонентов она оказывает существенное влияние: при изготовлении транзистора с кремниевыми затворами добавляется слой поликремния с проводниками. В результате располагать компоненты становится гораздо легче, поскольку у вас в распоряжении оказывается два слоя с проводниками, способными проходить соседний слой насквозь. Если у вас есть только металлический слой, располагать компоненты гораздо труднее, поскольку проводники мешаются друг другу. В других изученных мною чипах, где применялась технология транзисторов с металлическими затворами, расположение компонентов было отвратительным куча спутанных проводников, доводящих сигналы до каждого транзистора, приводила к тому, что плотность транзисторов оставалась небольшой. Функциональные блоки Nanoprocessor, наоборот, очень тщательно спроектированы, и все сигналы прекрасно ладят. Есть немного лишнего пространства, к примеру, для шины данных, но в целом я впечатлён плотностью раскладки Nanoprocessor.


Функциональные компоненты Nanoprocessor на основе моего реверс-инжиниринга

Nanoprocessor процессор необычный. По первому впечатлению он даже показался мне ненастоящим процессором, из-за отсутствия базовых арифметических операций. Однако, изучив его подробнее, я всё же впечатлился. Его простая конструкция позволяет ему работать быстрее других процессоров того времени. Набор команд умеет больше, чем кажется на первый взгляд. Hewlett-Packard использовала Nanoprocessor во многих своих продуктах в 1970-х и 1980-х, на более сложных ролях, чем можно было бы ожидать к примеру, для разбора строк и выполнения вычислений. После того, как были опубликованы его маски, мы можем узнать все секреты цепей, благодаря которым Nanoprocessor работал.


Nanoprocessor (белый чип) как часть модуля точного времени Hewlett-Packard. Обратите внимание на написанное вручную напряжение; каждому чипу требовалось своё напряжение смещения.
Подробнее..

Перевод Внутренности HP Nanoprocessor высокоскоростной процессор, не умеющий складывать

22.09.2020 16:11:47 | Автор: admin

Комбинированные фотошбалоны Nanoprocessor. GLB слева от шины данных инициалы разработчиков Джорджа Лэтема и Ларри Бауэра.

HP Nanoprocessor почти забытый процессор, разработанный компанией Hewlett-Packard in 1974 году (подробнее по ссылкам "The Forgotten Ones: HP Nanoprocessor", HP9825.com и The HP 9845 Project) в качестве микроконтроллера для различной продукции компании. Странно, что этот процессор не умел даже складывать или вычитать возможно, поэтому его решили назвать не процессором, а нанопроцессором. Несмотря на эти ограничения, Nanoprocessor управлял различными устройствами от Hewlett-Packard, от интерфейсных панелей и вольтметров до анализаторов спектра и терминалов сбора данных.

Я определил, что Nanoprocessor, в частности, использовался в следующих продуктах от Hewlett-Packard: анализаторы спектра HP 9845B, HP 3585A, синтезатор/генератор функций HP 3325A, дисковод для гибких дисков HP 9885, терминал для сбора данных HP 3070B, HP 98034 HPIB интерфейс для калькулятора HP 9825, таймер реального времени HP 98035 для компьютера HP 9825, интерфейс плёночного накопителя HP 7970E, маршрутизатор HP 4262A, анализатор спектра HP 3852, вольтметр HP 3455A. Пол-Хеннинг Кэмп также рассказал мне, что Nanoprocessor использовался в синтезаторе/генераторе функций HP 3336 и контроллере коммутатора HP 9411.

Ключевой особенностью Nanoprocessor была низкая стоимость и высокая скорость работы: по сравнению с современным ему Motorola 6800, Nanoprocessor стоил $15, а не $360, и справлялся с задачами по управлению на порядок быстрее.

Интересно, что конкурентом Nanoprocessor при его разработке был именно Motorola 6800, а не процессор от Intel. Главное, чем мог похвастаться Nanoprocessor, была скорость: он работал на 4 МГц, учитывая, что 6800-й работал на 1 МГц. У обоих процессоров уходило 2 такта на выполнение базовой команды, при этом у 6800 уходило до 7 тактов на выполнение более сложных команд.

Разработчики Nanoprocessor составили сравнение скорости работы, и предположили, что Nanoprocessor может считать в шесть раз быстрее 6800, и обрабатывать прерывания более чем в 16 раз быстрее. Однако тогда предполагалось, что Nanoprocessor будет работать на 5 МГц, и реальный чип немного не дотянул до этой планки со своими 4 МГц. Предварительной ценой Nanoprocessor называли $15 против $360 за Motorola 6800.

Я не совсем согласен с тем, что Nanoprocessor можно называть микроконтроллером, поскольку он использует внешнее ПЗУ с программой, тогда как у микроконтроллера обычно всё, включая ПЗУ, находится на одном чипе (в данном аспекте он похож на Intel 4004). Однако почти по всем параметрам Nanoprocessor напоминает микроконтроллер: он разработан для встроенного применения, его гарвардская архитектура и набор команд оптимизированы для I/O, он запускает программы из ПЗУ с минимальным хранением данных.

Что касается компьютеров, не умевших складывать компьютер IBM 1620 размером со стол от 1959 года не имел операции сложения, а использовал для этого таблицу результатов. Его кодовое имя было CADET, и люди в шутку расшифровывали его, как Can't Add, Doesn't Even Try [не умеет складывать, и даже не пытается].

Недавно разработчик чипа Ларри Бауэр опубликовал шесть фотошаблонов, использовавшихся для производства Nanoprocessor, вместе с подробностями об их разработке. Фотошаблоны были очищены и просканированы в The CPU Shack, а потом очищены Антуаном Берковичи (PSD-файл объёмом 122 Мб можно скачать по ссылке). На композитном изображении фотошаблонов ниже видны внутренние цепи ИС. Голубой слой верхний металлический слой чипа, зелёный нижний, кремниевый. Чёрные квадраты по периметру 40 площадок для связи с внешними контактами ИС. Эти фотошаблоны я использовал для реверс-инжиниринга процессора, чтобы понять его простую, но хитроумную схему, похожую на RISC.

Nanoprocessor во многом напоминает процессор RISC (Reduced Instruction Set Computer) [компьютер с набором простых команд], хотя он и появился за несколько лет до появления такой концепции. В частности, Nanoprocessor разработан с простой системой команд, все команды выполняются за один такт (после такта выборки), набор регистров большой и ортогональный, а адресация проста. Эти характеристики, присущие RISC, дали высокую тактовую частоту по сравнению с более сложными процессорами.

Nanoprocessor разработали в 1974 году, тогда же, когда были объявлены классические процессоры Intel 8080 and Motorola 6800. Однако технология кремниевого производственного процесса Nanoprocessor отставала на несколько лет они использовали транзисторы с металлическим затвором вместо кремниевых, разработанных в конце 1960-х. Разница кажется непонятной, однако кремниевые затворы были лучше по нескольким статьям. Во-первых, они меньше, быстрее и надёжнее. Во-вторых, у них был поликремниевый слой с проводниками, кроме металлического; в результате разводка чипа была почти в два раза плотнее. В-третьих, транзисторам с металлическим затвором требовалось дополнительное питание в +12 В. Процессор Intel 4004 использовал кремниевые затворы в 1971 году, поэтому я удивлён, что HP ещё использовали металл в 1974.

Учитывая эти ограничения, я впечатлён плотностью разводки Nanoprocessor один слой металла, никакого поликремния. Я поискал другие чипы с металлическими затворами, и их разводки ужасно неэффективны там больше проводников, чем транзисторов. При этом цепи Nanoprocessor расположены эффективно и не тратят лишнего места.

Технология производства Nanoprocessor опережала технологии Intel 8080 и Motorola 6800 в одном: она использовала подтягивающие транзисторы с собственным каналом [depletion-mode pull-up transistors], более передовые, чем транзисторы с индуцированным каналом [enhancement-mode transistors], использовавшиеся в 8080 и 6800. Первая технология даёт логические вентили, работающие быстрее и потребляющие меньше, но требует дополнительного шага в производстве. У Nanoprocessor на этом шаге использовали фотошаблон 3 (серый). Таким процессорам, как MOS Technology 6502 и Zilog Z-80, подтягивающие транзисторы с собственным каналом позволяли работать на одном напряжении, а не на трёх. К сожалению, для Nanoprocessor всё ещё требовались разные напряжения из-за транзистора с металлическими затворами.

Очень странная характеристика Nanoprocessor переменное напряжение смещения подложки. Из соображений быстродействия многие микропроцессоры 1970-х подавали отрицательное напряжение на кремниевую подложку, с напряжением в -5 В, подававшимся через контакт смещения. У Nanoprocessor есть контакт смещения, однако странно, что напряжение смещение от чипа к чипу меняется, от -2 В до -5 В. Во время производства нужное напряжение писали на чипе вручную (см. ниже). Каждый Nanoprocessor нужно было устанавливать вместе с соответствующим резистором, чтобы он получал нужное напряжение. Если на плате меняли Nanoprocessor, надо было сменить и резистор. Переменное напряжение смещение выглядит как производственный недостаток не могу представить, чтобы Intel так делала процессоры.

Ранним чипам памяти DRAM и микропроцессорам часто требовалось три напряжения питания: +5 В (Vcc), +12 В (Vdd) и -5 В (Vbb) напряжение смещения. В конце 1970-х улучшения технологии производства позволили использовать единственное напряжение. Микроконтроллер Intel 8080 1974 года использовал транзисторы с индуцированным каналом, которым требовалось три напряжения, но улучшенная версия 8085 (1976) использовала транзистор с собственным каналом, и питалась от одного напряжения в +5 В. С конца 1970-х многие микропроцессоры использовали генераторы подкачки заряда, расположенные на чипе, для генерации отрицательного напряжения смещения.


HP Nanoprocessor, номер детали 1820-1691. Обратите внимание на написанное от руки напряжение: -2,5 В. Последняя цифра номера детали (1) тоже написана вручную, и обозначает скорость чипа.

Как большинство процессоров той эпохи, Nanoprocessor был 8-битным. Однако он не использовал память с произвольным доступом, а запускал код с внешнего ПЗУ на 2 КБ. В нём было 16 8-битных регистров больше, чем у большинства процессоров, и достаточно для компенсации отсутствия памяти во многих приложениях. По количеству транзисторов Nanoprocessor сложнее, чем Intel 8008 (1972) и чуть проще, чем 6800 (1974) или 6502 (1975).

По моим подсчётам, в Nanoprocessor 4639 транзистора. Декодер команд создан из пар небольших транзисторов исходя из соображений расположения элементов. Комбинация этих пар даёт 3829 уникальных транзисторов. Из них 1061 подтягивающие, а 2668 активные. Для сравнения, у 6502 было 4237 транзисторов, из которых активными были 3218. У 8008 было 3500 транзисторов, а у Motorola 6800 4100.

Но его архитектура использует транзисторы в других целях, по сравнению с этими процессорами. У Nanoprocessor отсутствует АЛУ, но вместо этого у него есть большой набор регистров, занимающий большую часть площади кристалла. У Nanoprocessor 48 команд, значительно меньше, чем у 6800 с его 72-мя командами. Однако у Nanoprocessor есть удобные операции установки, сброса и проверки битов, которых не было у упомянутых процессоров. Nanoprocessor поддерживает доступ к регистрам по индексам, но у него нет сложных режимов адресации, как у других процессоров.

У ранних микропроцессоров не было операций установки, сброса и проверки битов (хотя их можно реализовать через AND и OR). Z-80 (1976) добавил побитовые операции, однако они занимали по два байта и работали гораздо медленнее, чем у Nanoprocessor.

На блок-схеме ниже показана внутренняя структура Nanoprocessor. Главная особенность ввода/вывода 4-битный I/O Instruction Device Select, позволяющий 15-и устройствам получать команды ввода/вывода. Иначе говоря, выбранные контакты определяют, с какого ввода/вывода устройства производится чтение или запись по шинам данных. Внешние цепи используют эти сигналы для всего, что необходимо в конкретных приложениях хранения данных в защёлке, отправки в другую систему, чтения значений. Ещё больше операций ввода/вывода обеспечивается через контакты Direct Control I/O (контакты GPIO), пригодные для ввода и вывода. Если эти контакты не подсоединены к внешним цепям, они работают в качестве удобных битовых флагов; Nanoprocessor может установить значение, а потом прочесть его. В отсутствии арифметико-логического модуля модуль управляющей логики выполняет операции инкремента, декремента, сдвигов и битовые операции на сумматоре.


Блок-схема из руководства пользователя Nanoprocessor

Я проводил реверс-инжиниринг Nanoprocessor на основе фотошаблонов, и разметил размещение функциональных блоков на кристалле. Самый крупный элемент набор из 16 регистров слева от центра. Справа компаратор и сумматор, совместно со своими цепями инкремента, декремента, сдвига и дополнения. Декодер команд занимает большую часть места выше и правее компаратора с накопителем. Нижняя часть чипа в основном занята 11-битным счётчиком команд, а также стеком прерываний с одним входом и стеком подпрограммы. Управляющие цепи реализуют простейшую синхронизацию команд: за одним тактом извлечения следует один такт выполнения. У большинства микропроцессоров управляющие цепи занимают значительную часть чипа, но управляющие цепи Nanoprocessor представляют собой небольшой блок.

Nanoprocessor придерживается своей модели выполнения команд за один такт даже для двухбайтовых команд: второй байт запрашивается во время такта исполнения, поэтому общее время выполнения команды не меняется.


Функциональные компоненты HP Nanoprocessor

Разбираемся в фотошаблонах


Чип изготавливали при помощи шести фотошаблонов, каждый из которых использовался для производства одного из слоёв процессора посредством фотолитографии. На фото ниже показаны фотошаблоны. Каждая из них это лист майлара размером 47,239,8 см. Это увеличенные в 100 раз фотошаблоны, использовавшиеся для производства кремниевого кристалла размером 4,723,98 мм (что на 33% меньше кристалла 6800). На каждой 3-дюймовой кремниевой подложке находилось порядка 200 ИС, которые производили одновременно, потом тестировали, разрезали и помещали в корпус.



Чтобы объяснить роль масок, начну с описания МОП-структуры с металлическим затвором такие транзисторы использовались в Nanoprocessor. На схеме внизу два участка кремния (зелёные) при помощи примесей сделаны токопроводящими, и формируют исток и сток транзистора. Металлическая полоска между ними формирует затвор, отделённый от кремния тонким слоем изолирующего оксида (отсюда и название структуры Металл, Оксид, Полупроводник). Транзистор можно считать переключателем, которым управляет затвор. Также металлический слой обеспечивает основной метод соединения компонентов ИС проводниками, хотя некоторые проводники проходят и по кремниевому слою.


Схема МОП-структуры с металлическим затвором

Фотошаблоны ключевая часть процесса производства ИС, поскольку они определяют местоположение компонентов. На диаграмме ниже показано, как при помощи фотошаблонов к некоторым участкам кремния добавляются примеси. Сначала на кремниевой подложке формируется слой изолирующего оксида, затем добавляется светочувствительный фоторезист. Ультрафиолет (1) полимеризует и отверждает фоторезист везде, кроме тех мест, где фотошаблон блокирует прохождение света (2). Затем мягкий фоторезист, не подвергавшийся воздействию ультрафиолета, удаляют (3). Подложку подвергают воздействию фтористоводородной кислоты, удаляющей слой оксида там, где его не защищает фоторезист (4). В оксиде появляются отверстия, соответствующие рисунку на фотошаблоне. Затем подложку подвергают воздействию горячего газа, проникающего в незащищённые участки кремния и изменяющего его проводящие свойства (5). Этот процесс порождает небольшие участки кремния с примесями, соответствующие рисунку на фотошаблоне (6). Другие фотошаблоны используются для других этапов производства, однако для них используется такой же процесс с применением фоторезиста.


Как к участкам кремния добавляют примеси при помощи фотошаблонов

Увеличу один участок Nanoprocessor, чтобы показать, как из шести фотошаблонов формируется одна цепь (представляющая собой инвертер, меняющий двоичное значение, поступающее на вход). При помощи первого фотошаблона и описанного выше процесса фотолитографии участки кремния делают токопроводящими. Отмеченные зелёным участки с примесями сформируют истоки/стоки транзистора или соединение компонентов.


Первый фотошаблон создаёт участки токопроводящего кремния

Затем кристалл покрывают изолирующим слоем оксида. Второй фотошаблон (фиолетовый) используется для протравливания отверстий в оксиде, открывающих доступ к лежащему ниже кремнию. Эти отверстия можно использовать для создания затворов транзистора, а также соединения металлических проводников и кремния.


Второй фотошаблон создаёт отверстия в слое оксида

Третий фотошаблон (серый) обнажает участки для имплантации ионов, изменяющих свойства кремния и, следовательно, транзистора. Это превращает верхний транзистор в транзистор с собственным каналом, подтягивающий выход логического вентиля вверх.


Третий фотошаблон (серый) создаёт примеси в кремнии верхнего транзистора

Затем кремний покрывают дополнительным тонким слоем изолирующего оксида, формируя оксиды затворов для транзистора. Четвёртый фотошаблон (оранжевый) удаляет этот оксид с тех участков, которые станут контактами между кремнием и металлическим слоем. После этого шага большая часть кристалла покрывается толстым изолирующим оксидом. Над затворами транзистора (фиолетовый) слой оксида очень тонкий, и в нём есть отверстия для контактов от текущего фотошаблона (оранжевый).


Четвёртый фотошаблон создаёт отверстия в оксиде

Пятый фотошаблон (голубой) используется для создания металлических проводников сверху для этого сначала накладывается равномерный слой металла, а ненужные части потом вытравливаются. В тех местах, где четвёртый фотошаблон создал отверстии в оксиде, металлический слой соприкасается с кремнием и формирует токопроводящий контакт. В тех местах, где третий фотошаблон создал тонкий слой оксида, металлический слой формирует затвор транзистора между двумя участками кремния. Наконец, всю подложку покрывают защитным стекловидным слоем. Шестой фотошаблон используется для получения отверстии в этом слое над контактами по краям чипа. После разрезания всей подложки на отдельные кристаллы, к этим контактам припаиваются проволочная разварка, соединяющая их с внешними контактами.


Пятый фотошаблон создаёт металлическую разводку

На схеме ниже показано, как эта цепь формирует инвертер из двух транзисторов. Два символа транзистора соответствуют двум транзисторам, полученным благодаря фотошаблону. В отсутствие входящего сигнала верхний транзистор (соединённый с +5 В) притягивает выход наверх. Когда сигнал на входе высокий, он включает нижний транзистор. Это соединяет выход с землёй, притягивая выход вниз. Таким образом цепь инвертирует входящий сигнал.


Схема N-МОП инвертера, соответствующая шаблонам, приведённым выше

Хотя на приведённых выше диаграммах показан единственный инвертер, эти этапы с применением фотошаблонов позволяют создать процессор целиком, со всеми его 4639 транзисторами. На диаграмме ниже показана более крупная часть кристалла, на которой десятки транзисторов формируют более сложные затворы и цепи. Я заметил одну трогательную штуку на одном из фотошаблонов крохотное сердечко с буквами HP внутри, под номером чипа.

У Nanoprocessor два разных номера детали. 1820-1691 обозначает версию на 2,66 МГц, а 1820-1692 на 4 МГц. Последнюю цифру писали вручную на каждом чипе после проверки в деле. Номер детали не связан с номером чипа 9-4332A на кристалле.


Рисунки на чипе

Как Nanoprocessor управляет часами


Чтобы понять, как Nanoprocessor использовали на практике, я провёл реверс-инжиниринг кода из модуля часов HP 98035. Модуль подключался к настольному компьютеру HP 9825, и служил часами реального времени, а также мог отмерять интервалы и запускать периодические события с точностью до миллисекунд. Схема модуля часов была довольно необычной. Чтобы сохранять текущее время при выключенном компьютере, модуль часов был построен на базе чипа цифровых часов с запасным аккумулятором. Часовой чип не был предназначен для управления компьютером, что доставляло неудобства: он генерировал 7-сегментные сигналы для управления светодиодами, и настраивался тремя кнопками. Чтобы узнать время, Nanoprocessor приходилось преобразовывать выход с 7-сегментного дисплея обратно в цифры. Для установки времени Nanoprocessor приходилось эмулировать правильную последовательность нажатий кнопок.

HP 9825 был 16-битным настольным компьютером с поддержкой языка, похожего на BASIC. Представили его в 1976 году, за пять лет до IBM PC, и для своего времени это была довольно передовая система. Сзади у него было три разъёма для добавления таких модулей, как модуль часов реального времени.


HP 9825 со светодиодным дисплеем, плёночным накопителем и принтером

Для экономии энергии часовой чип от Texas Instruments реализован на интегрально-инжекционной логике (И2Л). Сегодня чипы с низким энергопотреблением использовали бы КМОП, но тогда это было редкостью. И2Л строилась на биполярных транзисторах, похожих на ТТЛ, но использовавших другие цепи с высокой плотностью и низким энергопотреблением. Возможно, это был чип X-902 в DIP-корпусе.


Nanoprocessor (белый чип) как часть часового модуля HP. Слева от него ПЗУ на 2 КБ. Справа два чипа памяти 256-битt4. Часовой чип Texas Instruments это крупный чёрный чип снизу от зелёного NiCad-аккумулятора

Компьютер управлял модулем часов, отправляя ему ASCII строчки символов типа S 12:07:12:45:00, что должно было установить время на 12:45:00 7 декабря (или 12 июля в европейской нотации). Различные таймеры интервалов, будильники и счётчики модуля инициировались сходным образом, через команды типа Unit 2 Period 12345. Модуль поддерживал 24 команды, и Nanoprocessor нужно было их распознавать.

Вот отрывок кода, полученный реверс-инжинирингом с ПЗУ платы часов. Это код от обработчика прерываний, ежесекундно увеличивающего таймер и дату. Код определяет количество дней в месяце, чтобы знать, когда менять месяц на следующий. Столбцы байтовые значения, команды и мои пояснения.

d0 STR-0 Сохранить следующий байт (7) в регистре 0.
07
0c SLE Пропустить две следующих команды, если накопитель <= регистр 0.
03 DED Уменьшить накопитель на 1 в десятичном режиме
5f NOP Пауза
d0 STR-0 Сохранить следующий байт (0x31) в регистре 0
31
30 SBZ-0 Пропустить два байта команд, если бит 0 накопителя равен 0
81 JMP-1 Перейти на 0x1c9 (конец блока кода)
c9
a1 CBN-1 Сбросить бит 1 накопителя
d0 STR-0 Сохранить следующий байт (0x30) в регистре 0
30
0f SAN Пропустить два байта команд, если бит накопитель не равен 0
d0 STR-0 Сохранить следующий байт (0x28) в регистре 0
28


Этот код получает номер месяца (01-12 BCD), сохраняет его в накопителе, и возвращает в регистре 0 количество дней месяца (28, 30 или 31 BCD). Неплохо для 16 байт кода, несмотря на игнорирование високосных годов. Как он работает? Для месяцев после 7 (июль) он вычитает 1. Затем, если месяц нечётный, то в нём 31 день, а если чётный 30. Для обработки февраля код сбрасывает бит 1 месяца. Если месяц становится равным 0 (февраль), то в нём 28 дней.

Из кода видно, что даже если процессор без операции сложения кажется бесполезным, побитовые операции и инкремент/декремент Nanoprocessor позволяют вести больше вычислений, чем вы могли бы подумать.

В коде я наткнулся на место, где нужно сложить два числа BCD и сформировать один байт. Это делал цикл, уменьшавший одно число и увеличивавший другое. Когда первое число доходило до нуля, во втором получалась их сумма. Так что даже без АЛУ сложение проводить можно, хотя и медленно.

Также видно, что код Nanoprocessor компактный и эффективный. В одном байте можно сделать много всего, что в других процессорах занимает несколько байт. Большой набор регистров Nanoprocessor позволяет избежать муторной перестановки данных туда и сюда. Хотя некоторые считают Nanoprocessor больше конечным автоматом, чем микропроцессором, это будет преуменьшение возможностей и роли Nanoprocessor.

Хотя у Nanoprocessor нет АЛУ или команд для доступа к памяти с произвольным доступом, их можно подключить в качестве дополнительных I/O устройств. В часах имеется память с произвольным доступом на 256 байт, где хранятся значения счётчиков и таймеров, доступ к которым организован через порты ввода/вывода. В других продуктах добавляли АЛУ для поддержки арифметических операций.

На схеме платы часов показано, как два чипа 2564 RAM подключаются к Nanoprocessor. Порт ввода/вывода Nanoprocessor выбирает контакт и подсоединяется к 3-8 Decoder U5, выдающему отдельные сигналы для каждого из портов ввода/вывода. Три из них идут к управляющим контактам RAM чипа, а один управляет чипами защёлок данных U9 и U10, удерживающих записанные данные.



Все порты ввода/вывода используют шину данных Nanoprocessor (вверху) для обмена данными, поэтому шина подсоединяется и к адресным контактам чипов RAM, и к контактам данных. Для чтения адрес памяти пишется в чипы через один порт ввода/вывода, а потом данные читаются из памяти через другой порт. В обоих случаях значения проходят по шине данных, а сигнал от 3-8 Decoder показывает, что нужно делать со значениями. Для записи первая операция ввода/вывода сохраняет байтовое значение в защёлках, а потом вторая операция ввода/вывода отправляет адрес в чипы памяти. Может показаться, что это неуклюжий подход в стиле машины Голдберга, но на практике он хорошо работает, и чтение/запись можно осуществить двумя байтами команд.

Многие процессоры, такие, как 6502, используют ввод/вывод с отображением в памяти устройства отображаются в адресном пространстве памяти и доступ к ним идёт через операции чтения/записи. Nanoprocessor работает наоборот, подключая память в порт ввода/вывода и обращаясь к ней через операции ввода/вывода.

При добавлении АЛУ используется схожий подход так, как в вольтметре HP 3455A, использующем два Nanoprocessor. Вольтметр использует два АЛУ чипа 74LS181 для реализации 8-битного АЛУ, который он использует для масштабирования значений и вычисления процента ошибки. Два порта выхода обеспечивают аргументы, а ещё один определяет операцию. 8-битный результат читается из порта, а процессор считывает перенос через контакт GPIO (заставляет задуматься, не проще ли было использовать процессор с поддержкой арифметики).

Заключения


Nanoprocessor процессор необычный. По первому впечатлению он даже показался мне ненастоящим процессором, из-за отсутствия базовых арифметических операций. Чип создан на основе устаревшей технологии с металлическими затворами, отстававшей от других микропроцессоров на несколько лет. Самое странное, что каждому чипу требовалось своё напряжение, которое писали на корпусе вручную, что говорит о сложностях со стабильным качеством на производстве. Однако Nanoprocessor в роли микроконтроллера работал быстро, гораздо быстрее других современных ему процессоров. Hewlett-Packard использовала Nanoprocessor во многих продуктах в 1970-х и 1980-х, в ролях более сложных, чем можно было ожидать.

Хотя Nanoprocessor давно забыт, и о нём не написано даже в Википедии, недавно опубликованные его создателем фотошаблоны проливают свет на этот необычный уголок истории процессоров.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru