Проект “PCM в каждый дом” – Часть 2. Разработка PCM-кодера

Рассказывает Михаил Царёв

Собрав в кучу весь объем проделанной работы и трезво оценив сроки, было решено перед тем как создавать полноценный РСМ-процессор, выпустить PCM Coder как самостоятельное устройство. Несмотря на урезанный функционал, такое устройство даст возможность записывать PCM на видеокассету, подавая звук напрямую с S/PDIF. Кроме того, он позволит подавать S/PDIF на любой PCM-процессор без необходимости его модернизации, чтобы использовать его как полноценный ЦАП. Следующим этапом нужно было развести плату, которую мы могли бы отправить на производство.

Разработка платы у нас началась с выбора корпуса. После недолгих поисков мы нашли в Китае недорогой корпус глубиной 100 мм. Этот размер нам был очень на руку, т.к. позволяет заказывать в Китае платы по минимальной цене. Максимальная ширина платы в этом корпусе ограничивалась 75-76 мм. Нам этого показалось вполне достаточным (забегая вперед, скажу, что места хватило в самый раз) и мы приступили к… Нет, не к трассировке, а проработке дизайна передней и задней панелей. Ведь именно дизайн должен диктовать расположение разъемов и органов управления на печатной плате, а не наоборот.

На задней панели должны были располагаться как минимум разъем питания, входы S/PDIF (оптика и коаксиал) и выход композитного видео. На передней панели нужны были: кнопка питания, переключатель входа, переключатель 14/16 бит, переключатель режима 525/625 (этого функционала у нас на тот момент не было, но мы его решили заложить на будущее). Кроме того нам хотелось управлять битами в заголовке кадра вместе с переключением уровней системы коррекции ошибок. Один из первых набросков выглядел так:

Один из первых набросков PCM-кодера

Далее началась сложная работа по поиску в Китае подходящих органов управления. Изначально переключение 14/16 бит и управление системой коррекции у нас были на разных переключателях, причем последнее мы прорисовали как DIP-переключатели. Но Миша (mihail2501#1900) предложил отличную идею совместить эти опции в одном 5-позиционном галетном переключателе. Также на отдельный галетник мы вывели управление битом эмфазиса, т.к. оно требовало трех положений. В качестве переключателя входа планировалось использовать обычный миниатюрный тумблер. А вот под переключатель ТВ-стандарта места на передней панели не осталось, и мы перенесли его назад, рассудив, что переключать его придется гораздо реже и, скорее всего, вместе с переключением кабелей. Это повлекло за собой катастрофическое уменьшение места на задней панели, и разъем USB-B в качестве питания уже никак не лез. Отказываться от одного из S/PDIF-входов или видео-входа для сквозной коммутации очень не хотелось. Оставались варианты поставить USB-разъем в формате Mini, Micro или Type-C. После недолгих обсуждений и споров мы остановились на USB Type-C вертикального монтажа (где-то горит без кулера один Fagear). Также мы вспомнили про кнопку REC MUTE, которая тоже обязательно должна быть в кодере. Прошерстив как следует Алиэкспресс, мы смогли найти движковый переключатель на два положения вертикального монтажа и именно его применили для переключения ТВ-стандарта.

Переработав дизайн, мы пришли к такому результату:

Предварительный дизайн PCM-кодера

Здесь можно заметить вокруг кнопки питания и переключателя входа светящиеся колечки. Они планировались двухцветными, и левое должно было служить индикатором питания, а правое – отображать статус входа. Этим мы сильно загорелись, хотя до конца не представляли технологии их изготовления.

Вот теперь, когда дизайн был процентов на 90 проработан и утвержден, можно было приступать к трассировке. При создании платы каких-либо особенностей и нюансов не было. Единственное, что хотелось расположить все детали с одной стороны платы, но у ПЛИС Cyclone IV три ветки питания и адекватно развести их, блокировочные конденсаторы и остальные сигнальные трассы на одной стороне не представлялось возможным. Поэтомы разводку питания мы перекинули на вторую сторону.

Трассировка питания ПЛИС на плате кодера

На этом скриншоте можно заметить, что управление битом защиты от копирования (COPY PRHBT) мы перенесли внутрь на плату, посчитав, что нет необходимости управлять им снаружи.

Напомню, что в первых попытках запустить схему мы использовали видео-ЦАП, скопированный из “микроволновки”. При разработке кодера мы проанализировали схемотехнические решения этого узла в других PCM-процессорах и значительно упростили его, взяв схему из Sansui PC-X1 / PC-X11.

Переднюю и заднюю панельки мы решили делать из текстолита, т.к. это довольно дешево, технологично и внешне очень симпатично. Причесав дизайн и разобравшись с трассировкой, мы заказали все платы и с нетерпением стали ждать их приезда…

Кстати говоря, тумблер входа на передней панели мы заменили на движковый и окончательно первая ревизия кодера должна была выглядеть вот так:

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

Получив долгожданные платы, я собрал первый прототип:

Плата прототипа PCM-кодера

Хоть схема уже и запускалась на отладочной плате и вполне успешно работала, момент включения был волнительным. Но все успешно запустилось и не пришлось делать ни одной доработки платы. Для Миши была собрана вторая плата и отправлена ему для отладки. Ведь все это происходило по-прежнему в дистанционном режиме.

Два первых экземпляра PCM-кодера

Напомню, что внутри ПЛИС все еще крутилась схема из “микроволновки”. Она представляла собой сложно дополняемый клубок из проводников и логических элементов. К тому же из-за особенностей ее построения Quartus время от времени компилировал ее в нерабочую конфигурацию, и приходилось вносить небольшие изменения, чтобы компиляция давала немного иной результат в размещении схемы на кристалле. Это помогало и схема запускалась нормально.

К этому времени по поводу PCM Format C у меня окончательно сложилась картинка в голове со всеми нюансами, и в какой-то момент я понял, что дальше с этой схемой мы будем только мучаться. Я принял решение написать алгоритм кодирования на Verilog. К тому же это будет максимально универсально и переносимо на другую платформу и минимальными правками под необходимую архитектуру ПЛИС.

Я создал новый проект и перенес туда все вспомогательные части, которые писал до этого – схемы формирования частот на основе PLL, сопряжения с S/PDIF и управления микросхемой WM8805 (S/PDIF приемопередатчик). Первой задачей было получить видеокадр с тишиной. Для этого нужно было создать схему формирования строк и кадров с VBI, который я прозвал видеодрайвером. С формированием строки вопросов не было, в ней должно было быть 168 бит, а вот строк в одном поле не целое количество. Поэтому пришлось ввести счетчик не целых строк, а их половинок, благо 168 делится на 2. Теперь можно было считать полустроки и на основе этого формировать поля. Я ввел несколько флагов, чтобы понимать к какой части поля относится текущая строка – VBI, заголовок или данные.

Схему вычисления CRC я тоже переписал на Verilog, но принцип работы у нее остался по-прежнему побитовым. Это дает возможность считать контрольную сумму на лету во время вывода строки, просто подставляя потом в конце рассчитанную CRC.

После отладки всех ошибок и неточностей я получил готовую картинку с тишиной на видеозахвате. Теперь можно было скорректировать видеодрайвер так, чтобы он мог переключаться в режим 625 строк. Для этого я изначально делал его универсальным, и теперь нужно было просто дописать различающиеся части кода.

Теперь у меня с одной стороны был модуль, выдающий с частотой 44,1 кГц парные слова данных для левого и правого каналов, а с другой – видеодрайвер, в строки которого нужно было с другой частотой сложить эти данные вместе с дополнительными словами системы коррекции ошибок и в соответствии со стандартом Format C. К тому же данные нужно сложить лесенкой – с интерливингом. То есть для их сопряжения нужен был дополнительный модуль – некий интерливер. А так как скорость поступления и скорость чтения отсчетов данных различная, интерливер должен содержать промежуточный накопительный буфер для их хранения.

В каждой строке поля располагаются 3 пары семплов и два слова системы коррекции ошибок. Для них я создал 8 линейных буферов, глубиной в 160 семплов (с небольшим избытком и универсальный для режимов 525/625), и 8 адресных указателей. Запись в них стартует с 32-го слова со смещением указателей друг относительно друга на 16 слов (как это подразумевает Format C). Когда в конкретном буфере запись доходит до конца, соответствующий адресный указатель перемещается на его начало, и далее все повторяется. Таким образом я упрощаю процесс чтения, т.к. при появлении сигнала запроса данных из видеодрайвера для очередной строки, можно извлечь данные из всех буферов по одному и тому же номеру, сложить в строку и побитово вывести в поле кадра, считая при этом CRC. Одновременно с укладыванием слов данных в буферы производится расчет слов P и Q для системы коррекции ошибок и запись в соответствующие буферы.

Остальные вспомогательные модули (переключение частот и перенастройка PLL, формирование сигналов сброса, переключение режимов кодера, управления битами в заголовке и т.п.) я описывать не буду, так как они не представляют особого интереса.

Таким образом, через несколько месяцев мы получили рабочую схему кодера, которая была написана с нуля, имела возможности для расширения и работала стабильно, в отличие от первого варианта из PCM-10.

Мы решили выпустить небольшую партию бета-кодеров среди участников сообщества, активно интересующихся PCM и имеющими оборудование для всевозможных тестов. Бета-тестерами стали userrft2#1654, -MiS-#2362, alex_wallace#8567 и, конечно же, VCD#9448, который изъявил желание сам спаять свой экземпляр, что и произошло на двух стримах совместно с mihail2501.

Алексей VCD протестировал процесс сборки, после которого стало понятно, что нужно будет написать в инструкции. Также Миша (mihail2501) протестировал у Леши кодер со всеми имеющимися у него на тот момент РСМ-процессорами.

-MiS- в процессе экспериментов нашел ошибки в работе выставления флагов эмфазиса и защиты от копирования и протестировал их в различных режимах.

userrft2 совместно с mihail2501 протестировал кодер в боевой ситуации, записав партию видеокассет, в том числе кассету с РСМ для Саши Коковина (kokovin93#7239). Также он всесторонне погонял кодер с дидовьей техникой (ВМ-12 и т.п.) и впоследствии наткнулся на неисправность в работе сброса схемы Format A (РСМ-1600/1610).

Так получилось, что alex_wallace получил свой экземпляр кодера самым последним, когда уже почти все ошибки были выловлены, и поэтому он много АОАОАО.

Часть 3. Небольшая серия кодеров