Считаем до трёх: три

в 12:18, , рубрики: Алгоритмы, вычисления на пальцах, Занимательные задачки, знаю ТБ как свои три пальца, математика, ненормальное программирование, программирование микроконтроллеров, троичный вычислитель

Троичный счётчик

Итак, продолжаем разговор. В этой статье я расскажу, как можно сделать троичный счётчик. Напоминаю, что я хочу сделать простейшую, но программируему железку, работающую на троичной логике. Ответ на вопрос «зачем?» смотреть тут.

Это уже третья статья, по мере готовности будет продолжение. Оглавление:

Как обычно, в моих статьях картинок больше, нежели текста. Вот так выглядит основная железка, о которой сегодня будет идти речь:
Считаем до трёх: три - 1

Краткое содержание предыдущих серий

Троичный мультплексор

Напоминаю, что единственным используемым элементом всей конструкции будет троичный мультиплексор, который, по сути, является трёхпозиционным переключателем. Логически это штука о пяти выводах: на один из них (sel) подаётся троичный сигнал селектора, и в зависимости от него на выход мультиплексора (out) подаётся один из трёх входных сигналов inN, inO или inP:

Считаем до трёх: три - 2

Вот так выглядит плата, которая на себе несёт два (де-)мультиплексора. Я, следуя оригинальному названию, буду её называть словом «тримукс».

Считаем до трёх: три - 3

Если мультиплексор подключить просто как повторитель, подав -5В, 0В, +5В на ноги N,O,P соответственно, то при подаче на вход S треугольника на выходе C будет ступенчатый сигнал:

Считаем до трёх: три - 4

Сегодня я буду использовать только две вещи: полусумматор и ячейку памяти.


Полусумматор

В первой статье мы подробно разобрали работу полусумматора. На макетке он выглядит примерно вот так:

Считаем до трёх: три - 5

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

Считаем до трёх: три - 6

Вот так уже изготовленная:

Считаем до трёх: три - 7Считаем до трёх: три - 8

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

Считаем до трёх: три - 9

Ну а вот так выглядят готовые к работе модули полусумматоров:

Считаем до трёх: три - 10


Троичная память

Во второй статье мы разобрались с тем, что на одном тримуксе (на двух троичных мультиплексорах) можно сделать ячейку памяти (троичную защёлку) с запоминанием по уровню. Ну а если собрать две троичные защёлки в ведующую и ведомую, то можно получить ячейку памяти с динамическим управлением, которая срабатывает по фронту тактирующего сигнала (ternary master-slave flip-flap-flop).

Причём в комментариях к предыдущей статье уважаемый mayorovp предложил вариант, который использует только четыре мультиплексора. Я обещал попробовать и попробовал!
Вот его предложение, которое я подрихтовал под свои нужды:

Считаем до трёх: три - 11

Эта ячейка запоминает на выход Q значение, поданное на вход A, когда на входе C тактирующий сигнал делает подряд две ступеньки N-O, O-P.

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

Считаем до трёх: три - 12

Она на себе несёт две отдельные троичные защёлки, срабатывающие по уровню. Если установить четыре джампера, то получим вышеописанную динамическую ячейку памяти.

Вот так выглядит платка:

Считаем до трёх: три - 13

Ну а вот так готовый модуль:
Считаем до трёх: три - 14


Простейший троичный счётчик

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

Итого, у нас есть шесть готовых блоков, которые можно соединить примерно вот так:

Считаем до трёх: три - 15

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

Считаем до трёх: три - 16

И вот видео, где я просто прощёлкиваю все 27 возможных состояний нашего счётчика:

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


Давайте усложним

Итак, оно недурно работает, большое спасибо mayorovp за предложенный вариант памяти. Если вернуться к предыдущей статье, то для создания динамической ячейки памяти я использовал на два мультиплексора больше, нежели предложил mayorovp. Давайте попробуем вместе с ними:

Считаем до трёх: три - 17

Этот счётчик работает абсолютно так же, как и предыдущий, но имеет на два мультиплексора больше. Зачем? Потому что мне так хочется! Обратите внимание, что входы Bm и As (я их покрасил серым) в этой схеме не используются. Тактирующий сигнал на ведущей защёлке никогда не бывает положительным, а на ведомой никогда не бывает отрицательным.

А теперь давайте добавим ещё два мультиплексора в схему:

Считаем до трёх: три - 18

Если входящий сигнал R равен минус единице, то счётчик абсолютно эквивалентен предыдущему. Но что произойдёт, если он будет нулевым или положительным? Защёлки запомнят то, что подано на входы Bm и As!

Мы получили троичный счётчик, который может считать в обе стороны, и значение которого можно переписать при необходимости, подав на защёлки нужное число и обнулив сигнал R. Вот видео с подробным описанием работы:

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

Посмотрите, как Александр Шабаршин предлагает сделать счётчик минут в троичных часах (ну или секунд, часов, схема-то одинаковая):

Считаем до трёх: три - 19

В одном часу шестьдесят минут, поэтому нам придётся использовать четыре трита. Четыре трита могут хранить 81 разное значение, но в сбалансированной троичной системе они представляют значения от -40 до 40. Как же представлять, например, 45 минут? Александр весьма остроумно предлагает говорить, что сейчас не 45 минут, а без пятнадцати час! Пять мультиплексоров справа внизу схемы как раз обнуляют счётчик минут по прошествии часа.

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

Бонус: питание

Краткое описание изготовления БП

Когда я писал первые две статьи, то чтобы получить двуполярное питание, пользовался простейшим резисторным делителем, который нещадно грелся. Поскольку мне надо было сделать генератор треугольников, который тоже требует двуполярного питания, но уже ±12 В, то я решил что два ЛАТРа в одной схеме — это уже перебор и сколхозил БП. Заказал в Китае готовых модулей питания, поставил вместе:

Считаем до трёх: три - 20

Не знаю зачем, но зачем-то перед БП воткнул сетевой фильтр. Поскольку тут идёт разговор про 230 вольт, то кожух обязателен, взял лист ПВХ 3мм толщиной, согнул на нихромовой проволоке:
Считаем до трёх: три - 21

Получил примерно вот такой корпус:
Считаем до трёх: три - 22

Вот так выглядит открытый БП:
Считаем до трёх: три - 23

А вот так готовый к употреблению:
Считаем до трёх: три - 24

Общую стоимость не считал, но грубо оценил бы баксов в тридцать.

Автор: haqreu

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js