В тот момент, когда почти все типы ЦАП изготовлены и отслушаны, пощупаны и попробованы на вкус, возникает вопрос: «А что дальше-то?»
Статья подготовительная и теоретическая — первое знакомство со средой Quartus, ПЛИС (он же PLD) и их возможностями.
Проект ЦАПа только вскользь упоминается, его описание запланировано дальше.
Проект ЦАПа только вскользь упоминается, его описание запланировано дальше.
С малых лет у меня была особенность — мне интересен процесс, а не результат. Поэтому все мои поделки либо раздаются, либо разбираются, либо глубоко модернизируются.
Естественно возникла шальная идея: а почему бы мне не попробовать ПЛИС?
Содержание статьи / Table Of Contents
Это интересно. И не так уж сложно. Достаточно иметь нужный набор инструментов, который стал доступен практически каждому, и желание пробовать и экспериментировать.
↑ Небольшое вступление: CPLD она же ПЛИС
ПЛИС, что расшифровывается как Программируемая Логическая Интегральная Схема, по буржуйски — CPLD, что означает Complex Programmable Logic Device, в цапостроении применяется уже давно. А в мире цифровых устройств еще раньше.Один из моих самосборных компьютеров «Орион-128» имел в стартовом комплекте печатную плату и прошитую ПЛИС, без которой плата бы никогда не запустилась бы. А это было… Ох, уже и не вспомню.
Но давно.
ПЛИС бывают разные. Основные производители на данный момент — это Xilinx и Altera, ну может кто-то еще — не вдавался. Бывают они разной структуры, назначения, ёмкости. Всего не перечислить. Технологии-то уже более 20 лет… Не беда, лампы вон до сих пор в цене:)
↑ Однако, приступим!
Когда я искал материал по ПЛИС, наткнулся на статью моего тёзки с ником Lexus. Называется она «Использование ПЛИС в DAC». За статью автору огромное спасибо! Возможно это единственный материал, где подробно разжёвано всё от начала и почти до конца. Всёе остальное, включая документацию от производителей, довольно тяжело осваивать «в лоб». Вот на базе этого материала я и расскажу о своём опыте работы с ПЛИС. Я конечно постараюсь покороче, ну, а вы готовьте помидоры и изучайте.Для начала нужно определиться, для чего и как будем использовать этот самый ПЛИС. Задача конвертации RJ в I2S, описанная в вышеуказанной статье — это просто, и как то меня она минула за ненадобностью, а вот коммутация входов, деление частоты на костыле из 3 корпусов 74НС74, переключение генераторов — вот минимальная задача, ради которой стоит начать знакомство с этой технологией.
Поэтому за основу был взят готовый ЦАП на AK4137, описанный в моей предыдущей статье.
Следующий шаг — обеспечить себя необходимым окружением. Для этого качаем из сети рекомендованный Лексусом Quartus II 9.1 SP 2. Я для интереса скачал самый новый. Не знаю, на любителя. Например, в новой версии отсутствует поддержка устаревших версий ПЛИС (а именно — нужной нам ЕРМ3064), обилие наворотов и обязательная регистрация перед скачиванием (и так спам девать некуда) мне не понравились.
Далее покупаем программатор. Или собираем на коленке.
Мне оказалось проще купить: USB Blaster (Altera CPLD/FPGA programmer)
Можно сначала купить — потом качать Quartus, не важно. У меня например было время немного освоить этот Quartus, пока мой программатор пинали ногами на транзитных пунктах китайской почты.
Ну и естественно — сам ПЛИС. Как же без него? Для своего проекта выбираем EPM3064ATC44-10N. Это ПЛИС с питанием 3,3 В, на 64 логических ячейки, с возможностью программирования через JTAG, в корпусе TQFP44 (аккурат как у АК4399, паять несложно) и с грейдом 10. Половина этой странной инфы нам не нужна. Важно лишь питание и рабочая частота.
Для этой микросхемы она равна 150 МГц, что в принципе хватит за глаза и выше. Другие подробности есть в даташите, там же есть масса инфы, которую я еще не переварил, да и, как выяснилось, эта инфа избыточна для наших задач.
↑ Задача в подробностях
Теперь более подробно расскажу о поставленной перед нами задаче.Итак: простая схема взаимодействия блоков и модулей в среднестатистическом ЦАП показана на рисунке:
Художник из меня просто шедевральный, поэтому прокомментирую это чудо.
Самое интересное в красном квадрате в центре.
Сигнал со входов I2S или SPDIF/I2S в формате I2S через мультиплексор подается на вход ЦАП.
После мультиплексора выдергивается сигнал MCLK и идет на модуль CLOCK, в котором находится два генератора для сетки частот 44х и 48х и несколько буферных элементов.
Задача модуля — если ЦАП работает в режиме MASTER, поглядеть какая сетка частот используется и отдать ЦАП клок с нужного генератора, а также отдать этот клок источнику.
Если ЦАП в режиме SLAVE, то просто пропустить через себя тот клок, что пришел к нему от мультиплексора. Сигнал сетки просто игнорируется.
А еще выдать для измерения частоту LRCK для PCM или DSDCLK для DSD.
За всем этим бдительно следит контроллер.
Естественно все это мной уже реализованно на рассыпной логике.
Так вот задача в принципе проста — все функции красного квадрата возложить на ПЛИС, и адаптировать схему под работу с проверенным мной AK4137.
Как-то так вот:
↑ Теперь можно ставить софт и готовить проект
Особенностей установки нет никаких, просто после установки нужно выбрать тип Quartus II для внешнего вида программы. Пути установки по умолчанию.Далее заходим в меню File→New-Project-Wizard.
Далее идем по списку:
Здесь задаем имя проекта и рабочие каталоги. Желательно сильно не самодельничать, хотя софт умный, если накосячим — подскажет где.
Отвечаем на странные вопросы.
Далее проходим без остановок.
Пока не подходим к самому интересному! Тут обязательно выбрать именно тот тип ПЛИС, с которым будем работать. Их там шибко много, но нужный найти можно.
Далее тоже ничего пока не нужно:
Ну и почти все.
Проверяем, если накосячили, еще можно уехать назад.
И вот оно. Маленькое наше счастье. Все создалось и загрузилось.
Но не спешите радоваться — нам нужна схема! Для этого идем далее в меню File→New.
Откроется это окно:
Это наша будущая схема.
Схемный редактор конечно не фонтан, особенно если привык к Splan, но работать можно.
Теперь нужно сохранить файл внутри нашего проекта.
С названием не мудрствую, чтоб не путаться.
Получится так:
↑ Все готово. Теперь можно творить!
Для того чтобыВ составе набора готовых компонентов есть почти вся логика серии 74, а также масса виртуальных компонентов. Для обычного проекта этого хватает с головой, но если нужно что-то серьезнее, нужно качать дополнительные компоненты. Но помните, даже из имеющихся, не все компоненты смогут работать в составе выбранной серии ПЛИС.
Но об этом нам сообщит компилятор в процессе.
Но об этом нам сообщит компилятор в процессе.
В поле «Name» набираем 74257. Это мультиплексор 2×4. Далее, обязательно нужно накидать входы и выходы. Для входа набираем input, для выхода — output.
По даташиту смотрим логику работы ног (например здесь для разрешения работы надо на OE (или GN) подать лог 0), и подключаем куда надо vcc или gnd. Все это также набирается в поле «Name».
Ну и рисуем соединения согласно выбранной схемы. Обязательно нужно дать уникальные имена входам и выходам, чтоб потом не запутаться. Я их назвал по имени сигнала с которым они работают.
Должно получиться примерно так:
Я сделал проще — я сначала нарисовал схему,
и по ней именовал ноги.
Так получилось более наглядно.
После этого нужно скомпилить проект. Для этого вверху в меню есть треугольный значок с названием «Start compilation».
Результат получается примерно такой:
Это нормально, главное чтоб не было ошибок и проект скомпилировался.
Предупреждения можно игнорировать, они, как правило, связаны с невозможностью провести моделирование поведения схемы. А если полезло красненькое — то косяк серьезный, работать не будет. Здесь же видна суммарная информация — сколько занято ячеек и сколько использовано ног.
После этого надо назначить ноги, точнее привязать ноги к конкретным пинам ПЛИС. Для этого лучше использовать рисунок платы:
Следует иметь в виду, что ноги для программатора нужно развести на разъем программатора, специальные и неиспользованные ноги нужно оставить висеть в воздухе. Во избежании казусов. В даташите на выбранный тип ПЛИС ноги описаны.
Для привязке физических ног к виртуальным используется функция Pin Planner. Это самое шикарное во всем процессе. Не надо думать как и куда развести ноги на плате, просто накидал при разводке платы и назначил в процессе!
Pin Planner находится левее кнопки компилятора (чип с карандашом и символом пина).
Вот такое окошко:
Тут видно наш выбранный в начале проекта чип и его доступные для назначения ноги. Они обозначены кружочками.
Внизу список наших имеющихся виртуальных ног.
Просто берем node name из левой колонки и назначаем ему location. При этом назначенный пин станет темно красным на рисунке.
Вот так.
После привязки всех ног окончательная схема выглядит так:
Возле входов и выходов появились номера физических ног микросхемы.
Тут я поигрался немного с разными типами делителей. И отдельно вывел выход мониторинга шины DATA или DSDL. По ней стоит делитель с нереальным коэффициентом деления аж 262144 на пяти счетчиках 7493. Теперь у меня весело мигает светодиод при передаче данных. Оно конечно нафиг не нужно, но получилось наглядно.
Все, готово. Еще раз компилим проект. Если все хорошо — можно пробовать шить, или прошивать нашу плис. Естественно она должна быть припаяна в схему.
И на нее надо подать питание.
Подключить программатор.
Сам программатор можно поставить в систему заранее, драйвера есть в папке с программой %\altera\91sp2\quartus\drivers\usb-blaster, но питание его выходного буфера производится от платы с ПЛИС, поэтому без питания работать он не будет.
Теперь, когда все готово, идем в меню с программатором. Оно тоже вверху.
Вот такое окно:
Кнопкой Hardware Setup выбираем USB Blaster, тип загрузки — JTAG.
Внизу наш проект. Галочками отмечаем нужные опции.
Включаем питание ПЛИС и дрожащей рукой нажимаем Start…
Процесс идет очень быстро, я даже испугаться не успел. Если что-то прошилось, то внизу в логе будет такое:
Можно выдохнуть.
Девайс умный. Сам читает тип ПЛИС, так что другой проект просто не зашьется.
Также в случае перепутанных/не припаяных ногах программатора будет грязная ругань, что девайс не опознан или проблема программатора.
Но это не значит что все заработало как надо. Возможно потребуются коррективы схемы, изменение логики и повторная прошивка.
Производителем заявлено 100 циклов перезаписи ПЛИС, мой личный рекорд в этом проекте — 6!
А все потому, что я считал например, что у буфера с именем btri, что я использовал как логический аналог 74lvc1g125, вход разрешения работы OE имеет активное состояние лог 1, а оказалось, что это полный аналог 125 го буфера, и OE у него активно при лог 0.
Прошивать можно в любой момент, даже в процессе работы ЦАП. Ничего страшного не происходит.
Возможное количество прошивок больше 100, но производитель не гарантирует работоспособность ПЛИС при превышении этого порога. Реально можно шить больше и чаще, специалисты проверяли.
Но о сотне всегда помнишь и много раз подумаешь, прежде жать кнопку «Старт».
При назначении выводов ПЛИС не предусмотрено подключение «подпорок», или подтягивающих резисторов на плюс или минус питания, как это сделано в микроконтроллерах.
Также не предусмотрены прочие «аналоговые» заморочки для подключения к стандартной логике. Поэтому все времязадающие конденсаторы, подтягивающие резисторы, и любые другие «аналоговые» компоненты в логике ПЛИС отсутствуют. Все это необходимо предусмотреть заранее — подключить внешние «подтяжки» на нужные ноги ПЛИС или вывести конденсаторы времязадающих цепей на внешние ноги.
Иначе никак.
Настоящие разработчики делают еще одну «фишку» — формирование SPI для управления ЦАП с помощью ПЛИС.
Я, как неспециалист, конечно попытался реализовать подобное на макетной плате на базе EPM240, но получилось немного не так, как хотелось. Точнее получилось г*, и я сразу потерял интерес к этому процессу.
Но оно и понятно, тут уже нужно использовать не логические элементы, а описание логики работы на hardware description language (HDL). Он чем то напоминает старый добрый Basic, но моих знаний пока недостаточно для его освоения. К тому же формировать SPI управление на том же STM32/Arduino оказалось проще с точки зрения количества задействованных ног у контроллера и количества проводов в связке ЦАП-МК.
То есть выигрыш в формировании SPI в ПЛИС оказался лично для меня пока сомнительным удовольствием. Может потом и освою, а пока по старинке используем контроллер.
Ну, а если, к примеру, наш проект окажется большего размера, и не хватит нам ног или ёмкости ПЛИС, можно использовать что-нибудь из серии MAX-II, например EPM240T100C5.
Шаг ног там конечно поменьше, зато ног побольше и емкость уже 240 ячеек. Я их зачем-то заказал, но смог нагрузить только на 20%, поэтому, чтоб не валялись, пришлось применять. Вон она, слева от генераторов притаилась.
↑ Итого
Как вы понимаете, применение ПЛИС не ограничивается ЦАП. Наоборот, эту технологию активно применяют там, где нужно сэкономить место и заменить десятки корпусов обычной логики на один корпус ПЛИС.Любой конечный автомат, вроде блока управления вертушкой, механикой, или какие-нибудь электронные часы — это само простое, что пришло в голову.
Думаю, данный материал будет полезен многим.
Ну, а у меня на сегодня все.
Продолжение следует!
С уважением, Алексей.
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.