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

А на видео ниже вы можете взглянуть на чип в действии. Откройте видео, чтобы услышать, как он воспроизводит Jingle Bells, Santa Claus is Coming to Town и We Wish You a Merry Christmas.
Как уже говорилось выше, микросхема упакована в 3-контактный корпус, похожий на транзистор. Я растворил эпоксидную оболочку в кипящей серной кислоте, чтобы обнажить кремниевую матрицу. Это был мой первый опыт кислотной декапсуляции. Она прошла отлично, если не считать пары царапин на матрице. На составной фотографии выше показан CMOS чип под микроскопом. Характеристики у него не самые лучшие, даже для того времени; металлические дорожки имеют ширину около 3,3 мкм, а кремниевые - около 5,4 мкм.

Кремниевая матрица очень маленькая, примерно 1,8 мм × 1,8 мм. Фотография ниже дает представление о ее масштабе.

Я пометил фото матрицы функциональными блоками. Микросхема, благодаря которой воспроизводятся мелодии - это небольшая оптимизированная конструкция. Она построена из триггеров и логических вентилей, а не из микроконтроллера, как вы могли предполагать.

Микросхема имеет 3 пина, но всего на матрице можно найти 8 площадок. Остальные контакты, по-видимому, используются для тестирования. Например, активировав один из них, можно перевести чип в тестовый режим. В тестовом режиме песни исполняются со скоростью 512×, поэтому чип можно быстро протестировать, не дожидаясь проигрывания мелодий в обычном темпе. Другие тестовые контакты, по-видимому, открывают другие внутренние возможности для тестирования.
На блок-схеме ниже показана структура микросхемы. Основная идея заключается в том, что "программный счетчик" перебирает 64 ноты, хранящиеся в ПЗУ мелодий. Четыре первых бита формируют индекс высоты тона ноты, а два других бита формируют длительность ноты. ПЗУ шкалы и генератор тона используются для преобразования индекса высоты тона в желаемый выходной тон. ПЗУ ритма преобразует 2-битную длительность ноты в 4-битное значение, указывающее на длительность ноты.

Микросхема построена из CMOS, как и большинство современных ИС. На фотографии ниже показан инвертор: транзистор PMOS слева и транзистор NMOS справа. Транзистор PMOS включается при 0 на входе и вытягивает выходной сигнал на высокий уровень. NMOS-транзистор включается при подаче на вход 1, вытягиваяя выходной сигнал на низкий уровень. Таким образом, два транзистора реализуют желаемое поведение инвертора.

ПЗУ мелодии
64 ноты хранятся в ПЗУ 64×6, как это можно увидеть на изображении ниже. Каждая нота - это 4 бита, обозначающих частоту и 2, обозначающих длительность ноты. Овалы - это транзисторные вентили; биты хранятся в схеме подключения транзисторов, либо слева, либо справа. Вертикальные линии выбора столбцов сверху выбирают один столбец в ПЗУ. Вертикальные линии снизу отключают транзистор.
Физически ПЗУ хранит четыре ноты в каждом столбце, поэтому в нем 16 столбцов по 24 бита. В верхней части ПЗУ находится двоичный дешифратор, который подает напряжение на один из 16 столбцов в зависимости от входного значения. Транзисторы в левой части ПЗУ выбирают один бит из каждых четырех, чтобы получить желаемое 6-битное слово. Эти 6 битов фиксируются. Затем 4 бита используются для генерации желаемой частоты ноты, а два бита выбирают длительность ноты (половинная, четверть или восьмая нота).

На приведенной выше схеме цифры показывают расположение первых четырех слов. Первое слово - 000100, стартовый код. Следующие два слова - 011100; 0111 обозначает ноту E5, а 00 - короткую длительность.1 Следующее слово - 011101, обозначающее более длинную E5. Таким образом, указанные слова хранят первые три ноты песни "Jingle Bells".
Металлический слой интегральной микросхемы может быть относительно легко изменен. Изменяя металлический слой, можно производить различные версии микросхемы с различными ПЗУ, воспроизводя различные песни. (Микросхема также может быть изготовлена с различными диапазонами нот, темпом и битами, что обеспечивает большую гибкость). В таблице ниже представлены доступные песни.

Генерация частоты ноты
В ПЗУ мелодии частота ноты не задается напрямую, а имеет значение от 0 до 15. Второе ПЗУ, ПЗУ шкалы, имеет отображение для преобразования значения ноты в частоту. В частности, выходная частота равна 32768÷N, где N - значение в ПЗУ шкалы. Разрешение частоты при этом не очень высокое, поэтому некоторые ноты заметно отклоняются от тональности, но для данного приложения этого вполне достаточно.

На изображении выше показано ПЗУ шкалы, настроенное на воспроизведение нот от G4 до C6 в ключе C. (Различные версии микросхемы могут генерировать разные ноты, изменяя ПЗУ шкалы). Как и в случае с ПЗУ мелодии, двоичные значения генерируются путем подключения металлического слоя к транзисторам. Например, нота B5 имеет биты 0,1,0,0,0,1,0,1 (снизу вверх). Ниже ПЗУ декодер активирует одну из 16 столбцовых линий на основе 4-битного значения ноты. (Обратите внимание на двоичную схему расположения транзисторов в декодере: верхние строки чередуются, следующие строки - каждые 2, затем каждые 4 и каждые 8.
Микросхема использует необычную технику для генерации выходной частоты. Стандартный способ заключается в делении тактовой частоты на масштабный коэффициент с помощью счетчика, но вместо этого микросхема использует необычный подход, чтобы сэкономить несколько транзисторов. В ней используется 7-битный сдвиговый регистр с линейной обратной связью. Конструкция регистра сдвига с линейной обратной связью такова, что на вход подается XOR двух последних битов. Он будет перебирать все 127 значений псевдослучайным образом.
Хитрость в микросхеме заключается в том, чтобы инициализировать сдвиговый регистр определенным значением, загруженным из ПЗУ, и выполнять последовательность до тех пор, пока не будет достигнуто значение 1000000. Выбрав правильное начальное значение, можно получить желаемое количество отсчетов. Приведенная ниже диаграмма иллюстрирует работу регистра сдвига со входом B5 0100101. При таком начальном значении для достижения конечного двоичного значения 1000000 требуется 34 шага. Обратите внимание, что на каждом шаге биты сдвигаются вправо, а новый бит вставляется слева.
0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0
Поскольку это занимает 34 шага, тактовая частота делится на 34, и выходная частота составляет 32768 ÷ 34 = 963 Герц, что близко к желаемой частоте 997 Герц. В качестве еще одного примера, G4 начинает с 1001010 и работает в течение 84 отсчетов, давая на выходе частоту 392 Герц. Таким образом, ПЗУ управляет частотой воспроизводимых нот. Обратите внимание, что начальные значения не коррелируют с частотой; они зависят от последовательности, генерируемой сдвиговым регистром с линейной обратной связью. (Эта последовательность называется псевдослучайной, поскольку она детерминирована, но выглядит как случайная).
Далее я обсужу реализацию регистра сдвига. На фотографии ниже показан один из этапов регистра сдвига. Он получает входные данные от нижележащего каскада и передает свой выходной сигнал вышележащему каскаду. Каскад построен из 26 транзисторов: 13 транзисторов PMOS слева и 13 транзисторов NMOS справа. Транзисторы ориентированы вертикально вдоль розовых областей легированного кремния. Затворы транзисторов находятся там, где металлические линии расширяются. Обратите внимание, что транзисторы в столбце соединены кремнием.

На схеме ниже показано, как подключены транзисторы

На более высоком уровне схема состоит из инверторов и мультиплексоров5 , как показано ниже. Каждый цикл из двух инверторов удерживает один бит. Первый мультиплексор выбирает вход: либо значение из ПЗУ, которое загружается в сдвиговый регистр, либо значение с предыдущего этапа. Когда тактовый генератор переходит на высокий уровень, это значение загружается в первый цикл инвертора. Когда тактовый генератор переходит на низкий уровень, значение из первого инвертирующего цикла передается во второй инвертирующий цикл и, таким образом, на выход. Таким образом, для сдвига бита на одну ступень в регистре сдвига требуется один полный тактовый цикл (низкий и высокий уровень).

Часы
Микросхема работает на 64-килогерцовом тактовом генераторе. Эти часы генерируются простым резисторно-конденсаторно-инверторным осциллятором внутри микросхемы, что позволяет обойтись без внешних компонентов. Поскольку конденсатору требуется некоторое время для зарядки через резистор, скорость осцилляции контролируется.
На фотографии матрицы ниже показан осциллятор крупным планом. Белый прямоугольник - это конденсатор. Зеленый зигзаг - резистор. Обратите внимание, что сопротивление можно регулировать, замыкая часть резистора в металлическом слое. Белые зигзаги - это затворы транзисторов инвертора. Эти транзисторы больше, чем типичные логические транзисторы.

Осциллятор R-C на кристалле дешев, но неточен, в отличие от кварцевого генератора. При изменении напряжения меняется частота. На видео ниже я понижаю и повышаю напряжение, и вы можете услышать, как изменяется частота.
Тайминг
64-килогерцовый генератор проходит через цепочку делителей, чтобы разделить частоту на 512. Этот делитель состоит из девяти перекидных переключателей, каждый из которых делит частоту на 2. Эти переключатели построены из инверторов и мультиплексоров, аналогичных переключателям регистра сдвига, но подключены к перекидному переключателю. Это питает генератор тактов, который регулирует время для четвертных, восьмых и т.д. нот. В нем используется сдвиговый регистр с линейной обратной связью, аналогичный тональному генератору, но с четырьмя каскадами сдвигового регистра. Сдвиговый регистр загружается значением из ПЗУ ритма, которое определяет длительность ноты.
Выход генератора тактов поступает на генератор темпа, который делит свой вход на заданное значение (от 1 до 15) для создания темпа от 128 до 1920 ударов в минуту. Генератор темпа также представляет собой 4-битный сдвиговый регистр с линейной обратной связью. Вход сдвигового регистра жестко подключен для установки фиксированного темпа. На фотографии ниже показан один каскад, подключенный к 1. Небольшое изменение металлического слоя приведет к тому, что вместо 1 будет подключен 0.

Программный счетчик отсчитывает 64 ноты, предоставляя адрес ПЗУ мелодии. Он построен из перекидных триггеров, соединенных вместе для создания 6-битного счетчика. Перекидные триггеры имеют линию сброса для инициализации счетчика в 0 в начале работы. Микросхема имеет несколько десятков логических вентилей для отслеживания текущего состояния, обработки запуска, тестового режима и так далее.
Заключение
Эта микросхема мелодии использует простые схемы для создания песен гибким способом. В микросхему встроены все необходимые схемы, включая R-C осциллятор, поэтому потребовались только батарея и динамик. В наше время микроконтроллер был бы самым простым способом реализовать это. Однако эта микросхема 1980-х годов использует небольшие ПЗУ и простые счетчики для создания мелодий. В заключение приведу цитату из Джона Нолана: "Ничто так не говорит о Рождестве, как обезглавливание микрочипа, который играет рождественские песни не в такт".