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


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

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


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



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


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


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



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



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



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



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


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



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



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



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



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





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


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

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



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

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



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

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



Ну а вот так готовый модуль:





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


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

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



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



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



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



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


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



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

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



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

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



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

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



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

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

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


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



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



Получил примерно вот такой корпус:



Вот так выглядит открытый БП:



А вот так готовый к употреблению:



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

Комментарии (31)


  1. nerudo
    07.05.2017 15:32
    +4

    Шаг 4: написать пакет поддержки троичной логики для VHDL, аналогично std_logic и numeric_std. Хотя возможно кто-то уже делал подобное.


    1. haqreu
      07.05.2017 15:43

      Вопрос только зачем ;)


      1. nerudo
        07.05.2017 20:31
        +2

        В первом посте вы, кажется, оговаривали, что принципиально не будете отвечать на этот вопрос ;)


        1. haqreu
          07.05.2017 20:34

          Каюсь, сломался!


    1. neit_kas
      08.05.2017 01:39

      А не знаете, есть ли какие-либо HDL языки, которые поддерживают троичную и выше логику?


      1. nerudo
        08.05.2017 09:21
        +1

        Поскольку HDLи по пальцам можно пересчитать, то очень просто: из коробки нет. На VHDL я не вижу проблем создать свой тип данных и для него наборы операторов. На верилоге вряд ли. В System Verilog скорее всего через классы можно выкрутиться.


      1. 32bit_me
        08.05.2017 17:02
        +1

        Если представить такие элементы как аналоговые блоки, то можно попробовать Verilog AMS.


  1. FoxLBA
    07.05.2017 19:11

    А тактовый сигнал обязательно должен быть троичным?
    В варианте mayorovp можно сделать ячейку памяти с двумя входами, т.е. можно реализовать счётчик с таким управлением:
    C=0 — ничего не происходит.
    С=1 — счёт в сторону R.
    C=-1 — установка значения со входа.
    Экономия: 2 пары мультиплексоров и 1 управляющий провод.


    1. haqreu
      07.05.2017 19:13

      Нет, не обязательно. Можете нарисовать схему? Я не очень понял ваше предложение.


      1. FoxLBA
        07.05.2017 19:48

        Всё предельно просто:

        Ячейка памяти
        image


        1. haqreu
          07.05.2017 20:24

          А, теперь понял, спасибо. Ну в принципе почему нет, имеет право на жизнь, хотя мне и не очень нравится.


          1. FoxLBA
            07.05.2017 21:51

            Что не устраивает? Не очень наглядно и/или управляющие линии не удобны для использования в вашей архитектуре?

            Если развить идею до регистра со счётчиком, то для его управления будет достаточно двух троичных линий: [чтение, ничего, запись] и [счёт "+1", ничего, счёт "-1"]. Этого можно добиться добавив в мою схему пару управляющих мультиплексоров (с приоритетом чтение/запись над счётом) а также ещё по мультиплексору на трит для связи с шиной:

            Как-то так
            Надеюсь, разборчиво нарисовал.
            image
            Насчёт вывода на шину не уверен — вроде как ТТЛ не позволяет более 1 выхода на линию…


          1. FoxLBA
            07.05.2017 22:57

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


            1. haqreu
              07.05.2017 23:05

              В смысле, нужен ли нижний мультиплексор в этой схеме?

              Скрытый текст


              1. FoxLBA
                07.05.2017 23:10

                С отрицательного питания самого мультиплексора?
                Я не совсем понял как работает мультиплексор: он пропускает сквозь себя выбранный сигнал или работает как ТТЛ логика (т.е. выход подтягивается к нужному питанию или к земле)?


                1. haqreu
                  07.05.2017 23:19

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


                  1. FoxLBA
                    07.05.2017 23:58

                    Спасибо, разобрался — первый вариант…
                    Глупость появилась из-за лени: всё встало на свои места после того как подробнее изучил схему мультиплексора и документацию на ключи.


    1. mayorovp
      07.05.2017 20:09

      Управление через тактовый сигнал — это совершенно неправильно, потому что сигнал записи — индивидуальный, а тактовый сигнал должен быть общий.


      1. FoxLBA
        07.05.2017 20:22

        В данном случае будет не тактовый сигнал, а управляющий.
        Т.е. получается регистр со счётчиком.


  1. ValeriyS
    07.05.2017 19:24
    +3

    Теплый ламповый троичный бит. Читая статью не мог отделаться от мысли, что форма здесь важнее содержания. Самую произвольную вещь можно сделать с любовью. Пусть это даже будет бесполезная вещь, но главное, что она — любимая. Спасибо за статью.


    1. haqreu
      07.05.2017 19:37
      +7

      На самом деле, не такая эта вещь и бесполезная. Картошку не пожарит, да. И конечная железка послужит только получасовым анекдотом в лекции об архитектуре компьютеров. Но в процессе изготовления вот таких бесполезных штуковин я уже познакомился с очень интересными людьми. В английском языке есть даже термин специальный — conversation starter.

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


  1. x893
    07.05.2017 20:28
    -2

    Как то никак не пойму — Интел уже выпускает троичный процессор, а тут только сумматоры и счетчики.
    Наверняка уже есть и средства разработки и чипы для прототипирования более высокой интеграции.
    Как то уровень разный получается — наскальные рисунки и полет на луну.
    Или я чего-то недогоняю?


    1. haqreu
      07.05.2017 20:31
      +1

      Вы знаете, в соседней пещере вообще ещё электричество не провели.

      А про интел — это вы про ту первоапрельскую шутку, что ли?


      1. x893
        07.05.2017 20:52

        Вот же лопухнулся — не заметил что 1 апреля.


        1. haqreu
          07.05.2017 20:55

          Да на самом деле не суть важно. Даже если бы это было правдой, то моя цель не создать процессор и мощно на этом навариться, а совсем другая. Поэтому самый сумматоры и счётчики — самое то, что мне надо.


  1. alsii
    08.05.2017 17:10
    +1

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


    1. mayorovp
      08.05.2017 22:14

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


      1. alsii
        10.05.2017 12:44

        Я, честно говоря, не вникал в это особо. В том проекте я не участвовал, поэтому просто запомнил, как все это было. а почему, квы, не могу сказать. Кажется, это все было ради упрощения схомотехники, хотя не уверен. Могу попробовать уточнить, если интересно. Вот еще вспомнилось. Третье состояние трактовалось тогда как "может быть", кроме обычных для двоичной логики "да" и "нет".


  1. ACPrikh
    11.05.2017 10:11

    «может быть», кроме обычных для двоичной логики «да» и «нет»

    Вау! Это путь в неклассическую логику, которая ещё круче троичной!


    1. mayorovp
      11.05.2017 15:10

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


      1. ACPrikh
        11.05.2017 15:34
        +1

        Не понимаете по причине непонимания разницы в состояниях «хрен его знает» и «неклассическая логика».