Безумный MAX3032: генератор зла

Mar 26, 2022 20:20

Тут в мои шаловливые ручки попало три микросхемки Altera MAX3032 - это оочень маленькая ПЛИС (по импортной терминологии CPLD, тогда как более крупные это обычно FPGA) на 32 макроблока.



Захотелось немного с ними поиграться. Первым делом запаял его на макетную платку, воткнул LDO-стабилизатор на 3,3 вольта и подключил JTAG. Увидел устройство "в цепи" (по нажатию Auto Detect) - уже радостно.



Следующий этап, традиционно - помигать светодиодиком. Но для этого нужна тактовая частота, притом не шибко большая, а то все 32 макроблока только на это и уйдут. По комбинаторной части макроблок из CPLD гораздо "ёмче" одного ЛЭ из FPGA, но вот по регистровой всё так же: один макроблок = 1 бит памяти!

Первая мысль была, здесь же "налепить" мультивибратор на паре КТ315. Потом подумалось: а можно латрёшку воткнуть (легендарную 155ЛА3, у меня их целый "мешок"), раз уж на входе 5 вольт. Даже по такому поводу стряхнул пыль со старого доброго Шила "Популярные цифровые микросхемы".

СТОП! А зачем мне латрёшка, если у меня СКОЛЬКО УГОДНО ЛОГИКИ! У меня же ПРОГРАММИРУЕМАЯ ЛОГИЧЕСКАЯ ИНТЕГРАЛЬНАЯ СХЕМА! Воткну на её ножки RC-цепочку, правильно сконфигурирую - вот и будет мне генератор!

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





Правда, светодиод почему-то стал мигать вчетверо быстрее, чем я ожидал, так что всё оказалось несколько сложнее... Ещё спустя 2 дня я понял, что там происходило, и опробовал другие две схемы. Одна оказалась ещё менее удачной, а вот третья заработала как надо!

Не уверен, что от этого есть какая-то польза, но интересно было посмотреть работу ПЛИС "в аналоговом режиме", начинаешь чуть лучше понимать, как оно всё устроено, и что ожидать...


Начал с классической схемы:



Резистор, воткнутый между входом и выходом инвертора, заставляет его перейти в линейный режим, "между нулём и единицей". В этот же линейный режим попадает и второй инвертор. Но когда здесь появляется конденсатор, он создаёт положительную обратную связь. Стоит напряжению на выходе по какой-то причине чуть возрасти (буквально на микровольт, а шум там обязательно будет в линейном режиме), как на ту же величину оно возрастает на левой обкладке, проходит через 2 инвертора (а в таком режиме они обязательно обладают усилением, хоть и не очень большим) - и тем увеличивают напряжение на правой обкладке ещё сильнее. Этот процесс идёт лавинообразно и заканчивается переключением в лог. "1". В этот момент, между двумя инверторами появляется лог. "0", и левая обкладка конденсатора начинает через резистор разряжаться. Как только инверторы снова входят в линейный режим, напряжение на правой обкладке чуть-чуть снижается (до этого оно стояло неизменным, равным почти плюсу питания), и это приводит к лавинообразному переключению в лог. "0". Тут конденсатор начинает заряжаться от лог "1", сидящей посередине - и всё повторяется. Никогда не подводило! До этого момента.

Так выглядела "схема" в Квартусе :) Я выделил отдельную ножку на выход первого инвертора и на вход второго - чтобы Квартус не попытался "оптимизировать" схему, решив, "если здесь стоит два инвертора подряд, то можно просто выход второго соединить с входом первого", а это будет уже не то, что мы задумали.



На осциллограммах в начале поста видно, что схема обладает асимметрией. Вместо того, чтобы устанавливаться ровно "на середине" между нулём и единицей, т.е на +1,65 вольтах, "равновесное напряжение" смещено вниз. Вызвано это тем, что 3,3-вольтовые схемы решили сделать совместимыми с ТТЛ логикой (если в Quartus'е посмотреть, там все ножки по умолчанию настроены в LVTTL), лог "0" считается от 0 до +0,8 вольт, лог "1" - всё, что выше 2 вольт. То есть, "середина" несколько сдвинута вниз. И мы видим, как при переключении выхода схемы из лог "1" в лог "0" напряжение на левой обкладке опускается ниже нуля, так что уже открывается защитный диод входной ножки. Поскольку в этот момент величина тока ограничена только мощностью выходного каскада, тот ощутимо "проседает", как можно увидеть на второй осциллограмме. Это может привести к недопустимо медленному спаду тактовой частоты. Впрочем, я собирался использовать исключительно фронт, а он вроде чистенький, так что особых проблем я не видел.

Когда светодиод замигал чересчур быстро, я подумал, что именно этот спад и виноват. Это здесь он выглядит не особо злым, но это потому что частота предельно малая, всего 5 кГц. А ПЛИС у нас быстродействующая, она "привыкла" к фронтам и спадам порядка ЕДИНИЦ НАНОСЕКУНД! Небось, именно зависание тактовой частоты "между небом и землёй" вызвало к каким-то нехорошим процессам...

Что ж, похоже товарищ Шило с подобным столкнулся в своё время на КМОП-схемах (хотя странно, древние КМОП 176 и 561 серии вроде бы были максимально симметричными) и изобразил на входе инвертора дополнительный резистор:



Раньше, когда я на это смотрел, в упор не понимал, нахрена он нужен, ведь входное сопротивление КМОП элемента: ГИГАОМЫ, ёмкость есть, но тоже не шибко заметная, ну 10 пФ, что такого-то! А оказывается, это нужно, чтобы ограничить ток через защитные диоды, когда напряжение немножко выходит за напряжение питания. Тем самым, не нагружается чрезмерно выходной каскад, и фронты, и спады у него чистенькие, все счастливы.

В кои-то веки расчехлил свой аналоговый осциллограф, чтобы уж всё увидеть, а то цифровые могут всякие "самовозбуды" вообще не показать. И да, всё чинно-мирно-благородно:



Вот только светодиод так и продолжил мигать слишком быстро, ничего не поменялось.

Тогда я предположил, что ровно в момент переключения у нас возникает "звон", причём на удивление предсказуемый, и вместо одного фронта он успевает сосчитать все четыре. Частота "запредельная", тут и на аналоговом осциллографе не увидишь ничего, слишком оно "быстротечно".

И наконец-то решил проверить САМУЮ ПРОСТУЮ СХЕМУ ГЕНЕРАЦИИ НА ПЛИС:



У одного-единственного инвертора соединить вход с выходом!

Когда такое делаешь на "жёсткой логике", "рассыпухе" (на тех же 155ЛА3, 155ЛН1, 561ЛА7 и пр.), такое соединение НИКОГДА не приведёт к генерации! В первом приближении, логический элемент содержит ФНЧ первого порядка, "интегрирующую RC-цепочку", и она способна на высокой частоте повернуть фазу максимум на 90 градусов (π/2). Этого недостаточно для того, чтобы отрицательная обратная связь превратилась в положительную. Да, на каких-то очень высоких частотах там и другие запаздывания выползут, в кои-то веки проявится индуктивность дорожек, но к тому времени усиление упадёт настолько ниже плинтуса, что генерация снова не случится, схема УСТОЙЧИВА.

Но похоже, что когда такой инвертор "реализуешь на ПЛИС", там одним физическим инвертором дело не ограничивается, их там как минимум ТРИ. Наверняка, первый инвертор - это входной буфер, последний инвертор - выходной буфер, а чтобы всё-таки инверсия случилась, на основе макроблока делается-таки инвертор посередине!

А вот три инвертора - это уже 3 RC-цепочки, каждая способна повернуть фазу на 90°. Значит, втроём они могут повернуть фазу на 180° на частоте ещё очень далекой от "бесконечности", лишь самую чуточку выше частоты среза (где сигнал ослабляется на 3 дБ, а фаза крутится на 45°). В то же самое время, петлевое усиление схемы из 3 инверторов ощутимо больше, чем в схеме на 1 инверторе. Поэтому на частоте, где фаза уже повернулась на 180°, усиления вполне себе хватает, чтобы началась генерация!

И действительно, когда я попробовал так сделать - "убрал всё лишнее", оставил один инвертор, у которого вход соединён с выходом, генерацию я получил. Мой осциллограф так и не смог нормально отобразить её непосредственно на инверторе (он и сам не шибко высокочастотчный, да и для таких частот неплохо и кабель подходящий, импедансы согласовать и всё в этом духе), но на выходе к светодиоду, где тактовая частота поделена 14 раз (т.е в 214), я увидел следующее:



Период 150 мкс, то есть частота 6,67 кГц, а тактовая, следовательно, 109 МГЦ.

Так что если нужна очень высокая частота, можно её получить вот так, вообще без единой дополнительной детали! (и да, это довольно-таки известная метода. Если научиться перебарывать синтезатор в Квартусе, можно даже ноги наружу не выводить, пущай внутри себя правильно соединит - и привет) Но мне такая частота великовата, это ж я уже 15 ЛЭ истратил и получил мигание на 6,67 кГц, мне нужно ещё 13 ЛЭ, чтобы он начал мигать с периодом около секунды, итого уже 28 ЛЭ. Останется ещё 4 ЛЭ на выполнение какой-то целевой задачи :)

И теперь довольно легко предположить, что в первой схеме, когда мы проходим линейный регион, запускается такая вот генерация на 109 МГц, успевает выдать пару периодов - и тут мы наконец переходим в надёжный лог. "1" или "0", где никакой генерации нет.

Хорошо, попробуем другой подход. Если получить "чистый инвертор" (а не ТРИ инвертора друг за дружкой) мы не можем, может, попытаем счастья с ДВУМЯ ИНВЕРТОРАМИ, то бишь БУФЕРОМ, на основании которого мы сделаем триггер Шмитта, а уже из него легко будет сделать генератор:



За счёт положительной обратной связи образуется гистерезис переключения, т.е, чтобы переключить буфер из "1" в "0", надо подать напряжение чуть ниже, а чтобы из "0" в "1" - чуть выше. Благодаря этому мы можем надеяться, что возникнет устойчивая генерация НА НАШИХ УСЛОВИЯХ. Скажем, буфер сейчас в "1", на выходе инвертора "0", конденсатор разряжается, пока не дойдёт до порога переключения "вниз". Как только дойдёт - буфер скачкообразно переключится из "1" в "0", на выходе инвертора образуется "1", конденсатор начнёт заряжаться до порога переключения "вверх".

Действительно, генерация началась. На осциллографе посмотреть - как будто всё правильно идёт, хотя даже там виден "звон" во время переключения. А по поведению светодиода - "всё плохо". При периоде колебаний 75 мкс (по осциллографу) я получил период на светодиоде: 25 мкс, т.е разница в 300 раз примерно, тогда как частота должна была поделиться в 16384 раза! То есть, теперь звон уже не ограничивается 1-2 периодами на каждом переходе, а всё гораздо, гораздо серьёзнее...

И наконец, последняя схема. Раз уж с триггером Шмитта не склалось, может обычный триггер поможет?



Тут мы, по сути, копируем легендарную микросхемку 555, она же КР1006ВИ1, в том плане, что у неё есть входы R (сброс триггера) прямой, S (установка триггера) инверсный, причём порог срабатывания S установлен выше, что также даёт гистерезис переключения, если их соединить вместе.

Мне, чтобы разнести пороги срабатывания, пришлось поставить диод и резистор, это сдвигает уровень на 0,7 вольта вниз, понадеялся, что этого хватит для устойчивой работы.

Вот так выглядит мой проект в Квартусе:



Что приятно, "отжираются" всего 3 ножки, тогда как в первых вариантах нужно было использовать 4.

Но самое приятное, что такая схема заработала ровно так, как надо! Осциллограмма на конденсаторе:



Частота 11 кГц. Значит, после деления в 16384 раз мы должны получить частоту мигания светодиода в 2/3 Гц. А ну-ка:

image Click to view



Ну да, оно и есть! Так что если в проекте на ПЛИС осталось 3 лишних ножки и хоть один незадействованный ЛЭ, можно такой фокус провернуть.

странные девайсы, безумный MAX3032, ПЛИС

Previous post Next post
Up