Проектирование троичных элементов (4) - пробуем CMOS-ключи

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

User avatar
Ronin
Maniac
Posts: 304
Joined: 29 Mar 2005 06:06
Location: Krasnodar

Проектирование троичных элементов (4) - пробуем CMOS-ключи

Post by Ronin »

Shaos: ранее этот топик (как я вся троичная тема) жила на портале Ternary.info https://web.archive.org/web/20131008143041/http://ternary.info/modules/newbb/viewtopic.php?topic_id=168&forum=4
Shaos wrote:Третья схема - мой способ получения универсального троичного унарного вентиля из электронного переключателя DG403:

Image

Сигналы управления EQP и NEN берутся от соответствующих вспомогательных выходов буфера-повторителя, а входные значения RN,RO,RP являются значениями функции соответственно при "N","O","P" на входе.
не нравился мне этот DG403 :)

а мультиплексор 2х1 ведь есть! 1561КП5 aka CD4053. да еще 3 штуки в корпусе (а на один элемент всего 2 нужно) при цене 0.2-0.3$
Image
транзисторы можно менять на компараторы естессно.
User avatar
Ronin
Maniac
Posts: 304
Joined: 29 Mar 2005 06:06
Location: Krasnodar

Post by Ronin »

да и вообще, в универсальных унарных/бинарных ячейках на мультиплексорах (4053 и 4067 соответственно) можно использовать как транзисторные так и компараторные входы (с соотв. изменениями в коммутации мультиплексоров)
User avatar
Ronin
Maniac
Posts: 304
Joined: 29 Mar 2005 06:06
Location: Krasnodar

Post by Ronin »

Ronin wrote:не нравился мне этот DG403 :)
а мультиплексор 2х1 ведь есть! 1561КП5 aka CD4053. да еще 3 штуки в корпусе (а на один элемент всего 2 нужно) при цене 0.2-0.3$
правда (первая моя схема) на обычных ключах 4066 экономней получается, хотя есть минусы -
1) RO притянут к выходу через резистор (что ухудшает динамические и нагрузочные характеристики, но в указанном нами диапазоне они остаются приемлимыми)
2) в связи с жесткой логикой управления ключей (в отличие от мультиплексоров) входы надо делать компараторами (РТС не подойдет).

Поэтому можно получить два типа унив. ун. элемента
- сильноточные - в связке по 3, на 4053 - 6 тран-ов + 2 корпуса 4053 (РТС вход с относительно большим входным током, 4053 с большим выходным током без резисторов)
- слаботочные - в связке по 2(4), на 4066 - 1(2) корпуса lm339 + 1(2) корпуса 4066 (компараторный вход с относительно малым входным током, 4066 с малым током от сигнала RO - через резистор)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Проектирование троичных элементов - юзаем аналоговые ключи

Post by Shaos »

Взяв за основу тему с компараторами и ключами (начатую ещё в начале 2005 года) пришёл к выводу, что компараторы то и не нужны вовсе, т.к. вот эта схема универсального унарного троичного вычислителя:

Image

вполне может управляться сигналами, полученными непосредственно из троичного сигнала (сначала думал диоды помогут, однако потом понял что нет)...
Last edited by Shaos on 20 Sep 2012 18:36, edited 2 times in total.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Потом думал, что DG403 не подойдёт, т.к. у него отдельно цифровое питание имеется, которое во всех даташитах стоит в +5В, даже смотрел в сторону - на что-то типа ADG1313, где цифрового питания нет - только два аналоговых (положительное и отрицательное) и земля.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

С другой стороны никто не мешает и у DG403 подавать на GND -5В, а на Vl +5В (т.е. диапазон напряжений для логики тоже будет 10 вольт - как и для коммутируемых сигналов) - вобщем попробую DG403
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Помучал DG403 на макетке - у этого чипа (во всяком случае у данного производителя) выявились очень интересные "троичные" свойства! Напомню что DG403 имеет две идентичных части, в каждой из которых есть два цифровых ключа - один нормально замкнут, а другой нормально разомкнут (что позволяет делать из них один переключатель). Питание V- и V+ идёт непосредственно на ключи, а питиание GND и Vl идёт исключительно на логику управления ключом. Так вот подцепив GND к V- (-4.4 В), а Vl к V+ (+4.4 В) - что есть 8.8 В от V- до V+ - и постепенно увеличивая напряжение на входе управления ключом от нуля и выше (точнее от V-), выяснилось следующее - нормально замкнутый ключ размыкается при напряжении управления около 1.4 В от GND, но нормально разомкнутый ключ замыкается только если напряжение управления достигает 3.6 В от GND (или -0.8 в пересчёте на двуполярное питание)! Т.е. между этими величинами существует окно, внутри которого ОБА ключа разомкнуты! Причём размер окна зависит от разброса напряжения управляющего логической частью - при 6 вольтах (-3.0 В ... +3.0 В) окно простирается примерно от 1.3 В до 2.5 В (т.е. верхняя граница лежит на -0.5 В в пересчёте на двуполярное питание), а при 4.4 вольтах (-2.2 В ... +2.2 В) окно расположено примерно от 1.2 В до 2.0 В (что есть верхняя граница -0.2 В в пересчёте на двуполярное питание). Как видно напрямую это использовать неудаётся, т.к. окно расположено ниже нулевой области, но мы можем сдвинуть напряжение управление вверх применив резисторный делитель напряжения на два! В этом случае окно перемещается в случае 8.8 В в область 2.8...7.2 (что в пересчёте на двуполярное питание будет составлять -1.6...+2.8). Резисторный делитель можно подкорректировать под конкретный чип, чтобы середина окна приходилась точно на ноль (середину диапазона питающих напряжений). В таком случае из одной микросхемы DG403 можно собрать два инвертора или два универсальных унарных троичных элемента, применив 6 резисторов (по 2 резистора на делитель и 1 резистор на подтягивание отключенного состояния - на каждую половинку). Т.е. никаких компараторов и даже диодов НЕНУЖНО! Также делитель можно заменить на подстроечный резистор, чтобы была возможность подстраивать режим работы конкретного чипа DG403 (если местоположение окна будет отличаться у разных производителей).
Last edited by Shaos on 19 Feb 2015 11:53, edited 2 times in total.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Shaos wrote: Помучал DG403 на макетке - у этого чипа (во всяком случае у данного производителя) выявились очень интересные "троичные" свойства! Напомню что DG403 имеет две идентичных, в каждой из которых есть два цифровых ключа - один нормально замкнут, а другой нормально разомкнут (что позволяет делать из них один переключатель). Питание V- и V+ идёт непосредственно на ключи, а питиание GND и Vl идёт исключительно на логику управления ключом. Так вот подцепив GND к V- (-4.4 В), а Vl к V+ (+4.4 В) - что есть 8.8 В от V- до V+ - и постепенно увеличивая напряжение на входе управления ключом от нуля и выше (точнее от V-), выяснилось следующее - нормально замкнутый ключ размыкается при напряжении управления около 1.4 В от GND, но нормально разомкнутый ключ замыкается только если напряжение управления достигает 3.6 В от GND (или -0.8 в пересчёте на двуполярное питание)! Т.е. между этими величинами существует окно, внутри которого ОБА ключа разомкнуты! Причём размер окна зависит от разброса напряжения управляющего логической частью - при 6 вольтах (-3.0 В ... +3.0 В) окно простирается примерно от 1.3 В до 2.5 В (т.е. верхняя граница лежит на -0.5 В в пересчёте на двуполярное питание), а при 4.4 вольтах (-2.2 В ... +2.2 В) окно расположено примерно от 1.2 В до 2.0 В (что есть верхняя граница -0.2 В в пересчёте на двуполярное питание). Как видно напрямую это использовать неудаётся, т.к. окно расположено ниже нулевой области, но мы можем сдвинуть напряжение управление вверх применив резисторный делитель напряжения на два! В этом случае окно перемещается в случае 8.8 В в область 2.8...7.2 (что в пересчёте на двуполярное питание будет составлять -1.6...+2.8). Резисторный делитель можно подкорректировать под конкретный чип, чтобы середина окна приходилась точно на ноль (середину диапазона питающих напряжений). В таком случае из одной микросхемы DG403 можно собрать два инвертора или два универсальных унарных троичных элемента, применив 6 резисторов (по 2 резистора на делитель и 1 резистор на подтягивание отключенного состояния - на каждую половинку). Т.е. никаких компараторов и даже диодов НЕНУЖНО! Также делитель можно заменить на подстроечный резистор, чтобы была возможность подстраивать режим работы конкретного чипа DG403 (если местоположение окна будет отличаться у разных производителей).
Вот собственно и схема, иллюстрирующая данный подход:

Image

Верхняя часть микросхемы подключена как универсальный троичный унарный элемент, а нижняя - тоже самое, но подключено как троичный инвертор.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Shaos wrote: Взяв за основу тему с компараторами и ключами (начатую ещё в начале 2005 года) пришёл к выводу, что компараторы то и не нужны вовсе, т.к. вот эта схема универсального унарного троичного вычислителя:

Image

вполне может управляться сигналами, полученными непосредственно из троичного сигнала (сначала думал диоды помогут, однако потом понял что нет)...
На самом деле EQP и NEN можно получить непосредственно из входного троичного сигнала, однако для этого надо по разному подключать GND и VL (для NEN в верхнюю часть диапазона питающих напряжений, а для EQP - в нижнюю), однако при использовании одной микросхемы DG403 это невозможно - поэтому берём две:

Image

По сути мы получили тоже самое, что и в предыдущей схеме - два независимых универсальных унарных модуля (или селектора, которые можно использовать в том числе и как инверторы). Как видно тут нету вообще никаких иных компонентов кроме непосредственно DG403, правда теперь их нужно две вместо одной (правая микросхема реализует EQP, а левая - NEN).

P.S. Интересно, что при перемещении питания логики в нижнюю часть "окно" (когда оба ключа отключены) отсутствует - но тем не менее правило "Break-before-Make" должно работать, т.к. оно освещено в даташите (правда там написано про задержку в 5-12 нс между отключением одного и включением другого ключа, а не про разные уровни срабатывания ключей, как было экспериментально установлено).

P.P.S. Вебархив хранит копию этой схемы как минимум с января 2011 года: https://web.archive.org/web/20110107232818/http://shaos.net/blog/
Современный линк на архив блога: http://shaos.net/blog/2010/07/ternary-hardware-cmos-switches.html
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

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

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

Code: Select all

При подключении GND к 0В, а Vl к +4.4В вход управления переключает входы следующим образом:
-4.4В -> нормально замкнутый ключ замкнут, нормально разомкнутый - разомкнут;
 0.0В -> нормально замкнутый ключ замкнут, нормально разомкнутый - разомкнут;
+1.4В -> нормально замкнутый ключ разомкнут, однако нормально разомкнутый всё ещё разомкнут ("окно" началось);
+2.0В -> нормально замкнутый ключ разомкнут, нормально разомкнутый ключ - замкнут ("окно" закончилось);
+4.4В -> нормально замкнутый ключ разомкнут, нормально разомкнутый ключ - замкнут.

При подключении GND к -4.4В, а Vl к 0В вход управления переключает входы следующим образом:
-4.4В -> нормально замкнутый ключ замкнут, нормально разомкнутый - разомкнут;
-3.0В -> нормально замкнутый ключ разомкнут, нормально разомкнутый - замкнут (ключи одновременно перещёлкнулись);
 0.0В -> нормально замкнутый ключ разомкнут, нормально разомкнутый - замкнут;
+4.4В -> нормально замкнутый ключ разомкнут, нормально разомкнутый - замкнут;
Как видно во втором случае (на схеме он слева) никакого "окна" не наблюдается. В результате общая таблица состояний показанного на схеме троичного селектора будет следующей (с одним неиспользуемым окном Z вместо ожидаемых двух):

Code: Select all

-4.4 В -> OUT = RN
-3.0 В -> OUT = RN->RO
-2.0 В -> OUT = RO
-1.5 В -> OUT = RO
 0.0 В -> OUT = RO
+1.5 В -> OUT = RO->Z
+2.0 В -> OUT = Z->RP
+3.0 В -> OUT = RP
+4.4 В -> OUT = RP
Напомню, что троичный инвертор из селектора (универсального троичного унарного элемента) получается путём подключения +5В к RN, OВ к RO и -5В к RP.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

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

Для того чтобы представлять для чего сколько нужно корпусов при таком подходе, привожу конкретные числа:
- NOT требует 2 микросхемы (точнее 50% от 2 микросхем - см. нижнюю часть второй схемы),
- MIN или MAX требуют по 2 микросхемы (точнее 75% от них),
- полусумматор требует 6 микросхем (точнее 83% от них),
- полный сумматор - ориентировочно 12 микросхем,
- троично-двоичный преобразователь 2t4b - ориентировочно 8 микросхем,
- троично-двоичный преобразователь 3t5b - ориентировочно 21 микросхема (что говорит о том, что троично-двоичные преобразователи экономичнее делать на основе двоичных ROM или PAL).

Для сравнения - сдвоенный троичный полусумматор, построенный на компараторах и ключах, составлялся из 7 корпусов микросхем, 4 резисторных сборок и 12 диодов. А только на двойных DG403 это заняло бы примерно 11 микросхем (плюс по два конденсатора по питанию на каждую). Тяжеловато получается, хотя и сравнимо, но зато троично плюс унификация и автоматизация :)

Но для построения полноценных троичных автоматов требуется ещё и память, которую проще всего сделать на конденсаторах с помощью дешёвых CMOS-ключей 4016 (или чуть более дорогих DG411) и операционников (или транзисторных буферов, если значение можно хранить не долго):

Image

А на троичных триггерах делать память будет слишком дорого...
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Есть идея назвать этот автоматический подход "DDT" (DG403+DG403=Ternary) logic. Соответственно среду разработки назвать также - DDT...

P.S. с 5 июня 2018 года исходники DDT живут тут: https://gitlab.com/ternary/ddt
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Shaos wrote: Есть идея назвать этот автоматический подход "DDT" (DG403+DG403=Ternary) logic. Соответственно среду разработки назвать также - DDT...
Image

Левое подключение микросхемы DG403 назовём E12 (в случае инвертора это NEN), а правое - E21 (в случае инвертора это EQP). Соответственно имея две микросхемы DG403, подключенные подобным образом, мы получаем пару базовых элементов E12 и пару базовых элемента E21. Название обусловлено видом таблицы соответствия - XYY для E12 и XXY для E21 (где X и Y могут принимать отличные друг от друга значения N,O или P). Вот как выражаются все унарные троичные функции через базовые E12 и E21:

Code: Select all

 all ternary functions of one argument:
 NNN = N
 NNO = SHD(x) = E21(x,N,O)
 NNP = E21(x,N,P)
 NON = MUX(x,N,O,N) = E12(x,N,E21(x,O,N))
 NOO = BLP(x) = E12(x,N,O) // analog of reverse diode
 NOP = x // or buffer MUX(x,N,O,P) = E12(x,N,E21(x,O,P))
 NPN = MUX(x,N,P,N) = E12(x,N,E21(x,P,N))
 NPO = MUX(x,N,P,O) = E12(x,N,E21(x,P,O))
 NPP = E12(x,N,P)
 ONN = NHI(x) = E12(x,O,N)
 ONO = MUX(x,O,N,O) = E12(x,O,E21(x,N,O))
 ONP = MUX(x,O,N,P) = E12(x,O,E21(x,N,P))
 OON = E21(x,O,N)
 OOO = O
 OOP = BLN(x) = E21(x,O,P) // analog of forward diode
 OPN = ROU(x) = MUX(x,O,P,N) = E12(x,O,E21(x,P,N))
 OPO = MUX(x,O,P,O) = E12(x,O,E21(x,P,O))
 OPP = SHU(x) = E12(x,O,P)
 PNN = NTI(x) = E12(x,P,N)
 PNO = ROD(x) = MUX(x,P,N,O) = E12(x,P,E21(x,N,O))
 PNP = MUX(x,P,N,P) = E12(x,P,E21(x,N,P))
 PON = NOT(x) = MUX(x,P,O,N) = E12(x,P,E21(x,O,N))
 POO = E12(x,P,O)
 POP = MUX(x,P,O,P) = E12(x,P,E21(x,O,P))
 PPN = PTI(x) = E21(x,P,N)
 PPO = PHI(x) = E21(x,P,O)
 PPP = P
где MUX - универсальный троичный элемент, составленный из одной E12 и одной E21 (как видно на верхней части картинки MUX(c,n,o,p) = E12(c,n,E21(c,o,p)) ), NOT - троичное отрицание (строится из одного MUX), ROU - функция "Round-Up" (строится из одного MUX), ROD - функция "Round-Down" (строится из одного MUX). Функции NOT, ROU и ROD выделены отдельно, т.к. встречаются достаточно часто и могут быть визуально распознаны.

P.S. 12 июля выделил пару новых функций BLP (Block Positive) и BLN (Block Negative), т.к. их реализация может быть совсем простой - один диод и один резистор.

P.P.S. Из бинарных функций по видимому надо выделять MIN и MAX.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Вот пример использования алгоритма синтеза троичной схемы в таком ключе на примере функций MIN и MAX.

MIN:

Code: Select all

 |N O P
--------
N|N N N
O|N O O
P|N O P
Будем рассматривать горизонтальные строки этой таблицы по порядку. Первая строка - выходное значение всегда N. Вторая строка - E12(x,N,O). Третья строка - входное значение x без изменений. Все эти три функции подключаем через селектор MUX чтобы получить результирующую функцию:

MIN(x,y) = MUX(y,N,E12(x,N,O),x) = E12(y,N,E21(x,E12(x,N,O),x))

MAX:

Code: Select all

 |N O P
--------
N|N O P
O|O O P
P|P P P
Будем рассматривать горизонтальные строки этой таблицы по порядку. Первая строка - входное значение x без изменений. Вторая строка - E21(x,O,P). Третья строка - всегда P. Все эти три функции подключаем через селектор MUX чтобы получить результирующую функцию:

MAX(x,y) = MUX(y,x,E21(x,O,P),P) = E12(y,x,E21(x,E21(x,O,P),P))

Как можно заметить и MAX, и MIN покрывается двумя микросхемами DG403 (точнее полторы микросхемы, т.е. на трёх микросхемах можно сделать MAX и MIN).

Если функция не симметричная, то можно попробовать не только с горизонталей начинать, но и с вертикалей - результат может получится компактнее. В случае функций более чем двух аргументов алгоритм тот же - просто берем аргументы по два и строим.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Проектирование троичных элементов - используем CMOS...

Post by Shaos »

Shaos wrote:
Shaos wrote: Есть идея назвать этот автоматический подход "DDT" (DG403+DG403+Ternary) logic. Соответственно среду разработки назвать также - DDT...
Image

Левое подключение микросхемы DG403 назовём E12 (в случае инвертора это NEN), а правое - E21 (в случае инвертора это EQP). Соответственно имея две микросхемы DG403, подключенные подобным образом, мы получаем пару базовых элементов E12 и пару базовых элемента E21. Название обусловлено видом таблицы соответствия - XYY для E12 и XXY для E21 (где X и Y могут принимать отличные друг от друга значения N,O или P).
Выложил то что уже есть из кода: http://nedopc.cvs.sourceforge.net/viewv ... c/src/ddt/