Счётчик Грея на прозрачных триггерах и тайны К561КТ3

топ 100 блогов nabbla110.12.2025 Уже третий раз этот шаблон использую!
больной ублюдок.jpg

(Первый раз негодовал, что самая популярная "в интернетах" реализация счётчика в кодах Грея - это обычный счётчик, выход которого КОМБИНАТОРНО переделывается в коды Грея, что приводит к абсурду - коды Грея с комбинаторными выбросами!!!

Второй раз просто хвастался, что у меня и кнуты есть, и латекс.)

Есть распространённое мнение, что счётчик может быть реализован только на триггерах, срабатывающих по фронту, они же непрозрачные триггеры, они же обычно - триггеры "мастер-помощник", т.е двухступенчатые триггеры. Взять хоть младший разряд счётчика - он должен заменить своё хранимое значение на противоположное. У самых простых, "прозрачных" триггеров, при clk=1 выход просто дублирует вход, поэтому вместо переключения у нас либо всё застрянет меж логических уровней, либо самовозбудится, пока clk не переключится в ноль, и что там будет - непонятно.

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

Счётчик Грея на прозрачных триггерах и тайны К561КТ3

Разве что в радиолюбительской практике были распространены делители частоты на двух транзисторах и двух конденсаторах, хотя даже их можно назвать двухступенчатыми, просто одна из ступеней - ДИНАМИЧЕСКАЯ.

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

Не знаю, описывались ли они раньше, не смог найти, всё завалено в много слоёв курсачами для студентов разных стран. Напишите, пожалуйста, если где-то встречали упоминания.

По ходу дела наткнулся на "особенности" работы аналогового ключа К561КТ3, припасены у него несколько подлянок.

Выпишем 2-битные коды Грея, и напротив них переключающийся clk:

00 0
01 1
11 0
10 1


Можно заметить: младший бит переключается, когда clk переходит с 0 в 1. А старший бит - наоборот, когда clk переходит с 1 в 0.

Пусть младший бит будет храниться в прозрачном триггере, который держит своё значение при clk=1, и транслирует на выход свой же вход при clk=0.
Старший бит - всё наоборот, пусть держит своё значение при clk=0 и "коммутирует вход на выход" при clk=1.

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209210003.jpg

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

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

На verilog оно выражается примерно так:
module AsyncGray2bit (input clk, input aclr, output [1:0] Q);

reg [1:0] rQ = 2'b00;
        
always @(*) begin
        rQ[0] <= aclr? 1'b0 : clk? ~rQ[1] : rQ[0];
        rQ[1] <= aclr? 1'b0 : clk? rQ[1] : rQ[0];
end
        
assign Q = rQ;

endmodule


Как ни странно, синтезируется оно вообще В ЧИСТУЮ КОМБИНАТОРИКУ!

Её же можно выразить напрямую, т.е всё тело модуля написать вот так:
wire [2:0] D = {Q, clk};

assign Q =  (D == 3'b000)? 2'b00 :
        (D == 3'b001)|(D == 3'b011)? 2'b01 :
        (D == 3'b010)|(D == 3'b110)? 2'b11 :
        (D == 3'b111)|(D == 3'b101)? 2'b10 :
                                        2'b00; //оставшийся вариант: 2'b100


А вот попытка описать это в точности как прозрачный триггер, срабатывающий по уровню clk, а не по фронту, почему-то синтезируется в полный бред:
always @(clk or aclr)
        rQ[0] <= aclr? 1'b0 : ~rQ[1];
        
always @(~clk or aclr)
        rQ[1] <= aclr? 1'b0 : rQ[0];


Счётчик Грея на прозрачных триггерах и тайны К561КТ3 QuartusIsDumb.png

В получившейся "схеме" clk вообще куда-то ушёл. Предупреждение было, Event control contains complex event expression. Не очень понимаю, видимо, по умолчанию Quartus закладывается на то, что делать что-либо мы должны по фронту/спаду (он это синтезирует, подключив clk правильной фазировки, и сформирует комбинаторную логику, подключённую к D), плюс, может быть, сделаем асинхронную установку или сброс (т.е ещё задействует входы асинхронной установки/сброса регистра). А вот два асинхронных события ему не переварить, поэтому он одно выкидывает, и выкинул он почему-то clk.

Ну и на симуляции подобной схеме сразу плохеет:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 Oscillation.png

Два предыдущих описания синтезировали одну и ту же правильную схему:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 CorrectCircuit.png

Довольно необычно описать счётчик, который использует только LUTы (комбинаторные части логических элементов), без регистров!

Чтобы симуляция показала что-то адекватное, АСИНХРОННЫЙ СБРОС ТУТ НЕОБХОДИМ. При использовании обычных счётчиков я как-то привык обходиться без него: при инициализации ПЛИС все регистры равны нулю, и симулятор об этом знает. А вот "случайно возникшие защёлки" он не знает, как инициализировать, они могут случайно установиться хоть так, хоть эдак, поэтому пока не сделаешь сброс, на всех выходах будет гореть X. Поначалу я даже подумал, он в принципе такие защёлки смоделировать не сможет.

Но нет, всё нормально:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 CorrectWaveform.png

Поясню ещё раз: используя непрозрачные (двухступенчатые, FF, flip-flop) триггеры, можно создавать последовательную логику с произвольной комбинаторной частью, и всё будет работать как ожидается. А если триггеры прозрачные, то на комбинаторную часть накладываются жёсткие ограничения. По сути, вход для каждого триггера надо организовать так, чтобы он не зависел от своего же собственного выхода, и вообще не зависел от тех триггеров, чьё состояние будет изменено вместе с ним. Коды Грея - случай, когда подобное поведение довольно легко описать.

Была у меня мысль, что подобная реализация на ПЛИС может быть полезной, чтобы "сэкономить регистры". Грубо говоря, нам нужен какой-то здоровенный сдвиговый регистр или FIFO, или стек (и память мы тоже уже всю забили), тогда пусть регистры там сами по себе будут соединены, а LUTы мы применим для счётчиков. Но на 5576ХС6 такое не работает, логический элемент организован так, что полностью отделить LUT от регистра не получается, не хватает каких-то интерконнекторов:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209175526.jpg

На ПЛИС 5578, функциональном аналоге Altera Cyclone III это может быть возможно (не зря же они начали по отдельности записывать, сколько регистров и сколько комбинаторики задействовано), но проверить я пока не смог. Тот же сдвиговый регистр, который должен был заполнить вообще все регистры, в итоге переместился в память, inferred megafunction altshift_taps. Да и так сильно бороться за регистры, память и комбинаторику на 5578 мне ещё не требовалось, пока они представляются мне "бездонными".

В целом, эта идея мне пришла в связи с троичными вычислителями. Я как раз остановился на троичных счётчиках, и когда триггеры приходится "паять вручную" на К561ЛН2 + К561КТ3, становится не по себе, насколько же они толстые, так и хочется понять - НЕУЖЕЛИ ПРОЩЕ НИКАК??? Придумывать нечто похожее на двоичный делитель частоты с конденсаторами не хотелось, т.к я хотел использовать ТЕХНОЛОГИЮ КМОП, в смутной надежде когда-нибудь переложить это на чип.

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

И всё же данная идея сослужила полезную службу. Я решил не собирать сразу троичный двухступенчатый триггер (Flip Flop, FF), а вместо этого - два прозрачных, один работает по clk, другой по ~clk. Соединив выход одного с входом другого, мы получим свой долгожданный FF.

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209073807.jpg

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

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251128193136.jpg

Внезапно нихрена не заработало, причём эта штука вообще как будто начала коротить мне питание. Первые мысли были - действительно что-то коротит, или я всё-таки пожёг КМОП статическим электричеством. Опробовал отдельно К561ЛН2 - всё правильно. А вот ключи К561КТ3 вели себя очень странно. Сами по себе они ничего не жрут, т.е какого-то пробоя там нет. Но когда ключ должен быть замкнут, вход как будто весьма крепко притянут к одной из шин питания.

Да, в книге Шило и затем повсюду на просторах интернета про данные ключи было сказано ИМЕННО ТАК: вход подключается либо к выходу, либо закорачивается на землю. И я слышал "жалобы", что так и происходит, хотя находил и противоположное мнение, и мне оно казалось более логичным.

Вот схема импортного аналога, CD4066:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 2025-12-10_15-20-32.png

Это куда сложнее классической схемы аналогового ключа на КМОП:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3


У классической схемы есть недостаток: она неплохо работает, пока коммутируемое напряжение близко к одной из шин питания, но посередине сопротивление канала резко возрастает, особенно при низковольтном питании (3-5 вольт, не 9 и не 15), поскольку смещение подложки относительно истока/стока работает на ослабление канала.

Здесь они решили улучшить характеристики ключа, по сути и его сделав ДВУХСТУПЕНЧАТЫМ. Первый, ОБЫЧНЫЙ ключ коммутирует входной сигнал на ПОДЛОЖКУ ОДНОГО ИЗ ТРАНЗИСТОРОВ ОСНОВНОГО КЛЮЧА. Т.е, когда ключ надо замкнуть, подложка коммутируется к входу, а в противном случае - заземляется. В нормальном режиме потребление через подложку должно отсутствовать, поэтому ничего страшного, если сопротивление первого ключа будет меняться в широких пределах, ну что такое 100..500 Ом .. 1..5 кОм на фоне мегаомов подложки!? Зато теперь транзистор основного ключа работает без смещения подложки, так что сопротивление канала должно влиять от напряжения гораздо меньше, а значит, и линейность ключа повысится.

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

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 58426e1994507_56115613.jpg.519c131c70e2bf31a375da6f99fffea6.jpg

Да и зачем кому-то в здравом уме разрабатывать микросхему, которая коротит свой же вход!?

Ровно так я и думал, пока паял этот триггер. А когда он не заработал - уже задумался, а может Шило прав? Тем более, он не одинок, есть у этого ключа какая-то странность...

Если ничего не помогает - прочтите, наконец, даташит. Изучил ещё раз CD4066, повнимательнее. Внимание привлёк следующий абзац:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 photo_5294068674824180160_y.jpg

Вот это уже похоже на то, что у меня! Жаль, они не объясняют, откуда это защёлкивание взялось. Пока смотришь на принципиальную схему - в упор не понимаешь, как это вообще возможно.

Но стоит изобразить p-канальный транзистор, сидящий в отдельном "кармане" на основной подложке - как всё становится на свои места:
Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209205705.jpg

В общем, стоит только отделить подложку от истока (или создать возможность, что на ней возникнет потенциал выше, чем на стоке-истоке), как открывается огромная банка с червями паразисторами. Если выход поначалу имел небольшой потенциал и обладает определённой ёмкостью, а на вход вдруг мы подали большое напряжение, то на открытом канале может упасть напряжение свыше 0,6 вольт, и тогда у нас откроется "npn транзистор", аккурат эмиттерный повторитель, который "поможет нам" поскорее уравнять вход и выход. Судя по абзацу, ЭТО НОРМАЛЬНО, это само по себе фича, а не баг. "Обеспечьте микросхему достаточно мощным питанием - и всё будет хорошо". А боятся они, видимо, проседания Udd относительно входного, из-за чего ключ может стать неуправляемым - каналы мы вроде бы размыкаем, а через паразисторы продолжается проводимость, и ничего с ней не сделаешь, ТИРИСТОРНЫЙ ЭФФЕКТ, чтоб его!

Но всё равно это не объяснило моих затруднений. Я вообще отключил выходы ключа, оставил один только вход. Уж он-то должен теперь "повиснуть в воздухе"? А ничего подобного! Опытным путём обнаружил ещё одну особенность данных микросхем, про которых ни в одном даташите не написано. Что-то очень нехорошее происходит, если управляющие входы превысили диапазон питающих напряжений. Кажется, что просто откроются защитные диоды, и на этом всё. Не-а. Там тоже какие-то паразисторы окопались, и "перегруженные" управляющие входы каким-то образом заставляют вход замкнуться на питание. Тут у меня просто опереться не на что, как это получается. Но хотя бы знаю простое лечение: ограничить управляющее напряжение. Как только я это сделал - всё заработало как положено.

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209063521.jpg

На разных тактовых частотах

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209063614.jpg

Как именно идёт тактовая частота - можно понять по провалам напряжения, всё-таки NE556 штука чересчур прожорливая, при переключении она мне "просаживает" шины питания. Ровно поэтому я хотел её от нерегулируемых шин запитать, и clk вывести через резисторы, пусть "излишки" гасятся на защитных диодах, но мы увидели, к чему это привело. Пока что, временно, запитал её от выходов UD+ / UD-, но они сейчас слабоваты для такого буйвола, и размах clk теперь, напротив, чуть хуже, чем надо, там видимо эмиттерный повторитель по плюсу сидит, если не сдвоенный (на Дарлингтоне), больше вольта просаживается по чём зря, может однажды тоже аукнуться. Всё ж этот 555/556 вышел инородным элементом... У них есть КМОП версия, 7555, но у меня их никогда не было.

Счётчик Грея на прозрачных триггерах и тайны К561КТ3 IMG20251209063700.jpg

Вот как-то так.

В ретроспективе, очень удачно мне этот Грей подвернулся. Как минимум, я не ждал подлянки от "троичности", а то списал бы всё именно на неё. И отлаживать "монолитный" FF было бы тяжелее, чем два триггера поменьше.

Удивительно тяжело идёт, вот просто все шишки собираю. Но меня, как мужика с бензопилой, не остановить.



Upd. Этот 2-битный счётчик ещё можно назвать "генератор четырёхфазного меандра". Кстати, меняя скважность clk, мы получим управляющие импульсы для транзисторного моста, для тех же ИБП, и для прочих инверторов.

View Poll: Счётчик Грея на прозрачных триггерах

Оставить комментарий

Архив записей в блогах:
Френды- еще раз большое спасибо за советы. К сожалению, по своему состоянию поняла, что дальше это малопродуктивно. Мне никто пока не подсказал- где взять противогазы, костюмы, хотя бы толстые перчатки. Также прошу откликнуться ветеранов ...
На Западе из СМИ, из кино фейкомётят, что "США самая величайшая страна в мире именно она при поддержке англичан высадилась в Нормандии и разгромила Гитлера" и всегда либо принижается или вообще не упоминается вклад СССР в разгроме нацистов. И так из года в год... Видеосюжеты, опросы ...
Познакомились месяц назад. Никуда не водил, встречались у него, при этом такси не оплачивал, не кормил, шоколадка и бутылка вина максимум. Потом я решила, что ездить к нему не буду больше. Он давил на жалость, я сдалась (он мне нравится), решила пригласить к себе. И вот, представьте, ...
Дурным тоном нашего времени является то, что политика и политическая борьба превращается в мыльную оперу. СМИ давят на чувства и в любом конфликте делают неправым того, кто применяет больше (видимого) насилия. Это разумеется крайне реакционный взгляд на вещи. В конфликте прав тот, кто ...
Печальная новость из Питера. Умер многогранный, тонкий, блистательный Толя Равикович. Мы с ним не раз пересекались на съемках - в детской киносказке «Осенний подарок фей», в «Блуждающих звёздах» по Шолом-Алейхему и в одном из лучших моих ...