преобразователь двоичного кода в код семисегментного индикатора

Дешифратор-преобразователь в семисегментный код

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

преобразователь двоичного кода в код семисегментного индикатора

Светодиодный семисегментный индикатор

А теперь взглянем на схему такого дешифратора на примере микросхемы К176ИД2:

преобразователь двоичного кода в код семисегментного индикатора

Как и любой другой дешифратор, микросхема имеет входы для получения двоичного кода (1, 2, 4, 8) и 7 выходов, на которых формируется код в соответствии с расположением сегментов на индикаторе:

преобразователь двоичного кода в код семисегментного индикатора

Если, к примеру, подать на вход код 0110, то микросхема установит высокие уровни на выводах А, F, E, D, C, G и в результате мы увидим цифру 6 (двоичный эквивалент ее как раз 0110). Как и простые двоично-десятичные дешифраторы, семисегментные индикаторы бывают разных типов – все зависит от того, для работы с какими типами индикаторов они рассчитаны.

Если индикаторы светодиодные, то дешифратор должен иметь хорошую нагрузочную способность, чтобы выдержать ток светодиода сегмента (К555ИД18), если жидкокристаллические, то выходной ток может быть маленьким, но дешифратор должен уметь выдавать на индикатор противофазный сигнал (К564ИД4). Люминесцентные индикаторы не требуют большого тока и обходятся «постоянкой», но им подавай относительно высокое напряжение (К176ИД2).

Для удобства конструирования всевозможных цифровых шкал (к примеру, часов или частотомеров) дешифраторы могут объединять со счетчиками. Классический пример – К176ИЕ3 и К176ИЕ4:

преобразователь двоичного кода в код семисегментного индикатора

Достаточно на вход С такого счетчика-дешифратора начать подавать импульсы, как он начнет считать и выводить результат счета на семисегментный индикатор: 0, 1, 2, 3 и т.д. Подали импульс на вход R (сброс) и на индикаторе «0» — счетчик «сбросился». Что примечательно, ИЕ4 умеет считать до 9 (потом снова начинает с нуля), а ИЕ3 – до 6. Идеально для подсчета десятков минут или секунд в электронных часах. Возвращаясь немного назад (точнее, в предыдущую статью), хочу заметить, что и двоично-десятичные дешифраторы совмещают со счетчиками (к примеру, К176ИЕ8, которая умеет считать до 9 и имеет 10 выходов в десятичном счислении).

преобразователь двоичного кода в код семисегментного индикатора

Ну и более подробно о дешифраторах можно почитать в нашем справочнике:

Источник

Семисегментный индикатор: программирование

Семисегментный индикатор: программирование работы

Перевод двоичного кода десятичного числа в код семисегментного индикатора
Программирование одноразрядного семисегментного индикатора

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

преобразователь двоичного кода в код семисегментного индикатора

Перевод двоичного кода десятичного числа в код семисегментного индикатора

Для того, чтобы высветить определенную цифру на индикаторе, необходимо на соответствующих выводах порта микроконтроллера установить логическую единицу

преобразователь двоичного кода в код семисегментного индикатора

преобразователь двоичного кода в код семисегментного индикатора

Поэтому, первое что нам необходимо сделать, это определить соответствие каждой десятичной цифре двоичного числа, которое надо выдавать на выход порта микроконтроллера для зажигания соответствующих сегментов индикатора.
Для «четверки» мы уже определили такую комбинацию = 1110 0110, что соответствует шестнадцатиричному числу 66h, определяем и для остальных цифр:

преобразователь двоичного кода в код семисегментного индикатора

Данная таблица дана для семисегментных индикаторов с общим катодом (сегмент индикатора зажигается логическим уровнем «1»). Для индикаторов с общим анодом (сегмент индикатора зажигается логическим уровнем «0») двоичные коды необходимо проинвертировать (поменять 0 на 1, и наоборот) и заново вычислить соответствующие значения в шестнадцатиричной системе.

Программирование одноразрядного семисегментного индикатора

Алгоритм подпрограммы:

1. Инициализация индикатора (подпрограмма)
— настройка порта, к которому подключен индикатор на вывод информации
— запись кодов семисегментного индикатора, соответствующих десятичным цифрам в определенные ячейки памяти
Данная подпрограмма должна вызываться отдельно из основной программы
2. Вход в основную подпрограмму
3. Основная часть
— считываем текущую цифру
— определяем какой код семисегментного индикатора соответствует текущей десятичной цифре
— записываем определенный код индикатора в порт микроконтроллера
4. Выход из подпрограммы

Вот как, к примеру, в Algorithm Builder (остальные примеры тоже для этой программы), объявляются имена переменных в памяти программ (ОЗУ, SRAM):

В графе «Name» перечислены все имена переменных. В графе «Adress» запись «@D0_9» означает, что в переменной D0_9 хранится адрес первой переменной (D0)

Подпрограмма инициализации индикатора (подпрограмма вызывается из основной программы до обращения к подпрограмме вывода информации на индикатор):

преобразователь двоичного кода в код семисегментного индикатора

А теперь давайте посмотрим основную часть программы и расшифруем ее:

преобразователь двоичного кода в код семисегментного индикатора

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

преобразователь двоичного кода в код семисегментного индикаторапреобразователь двоичного кода в код семисегментного индикаторапреобразователь двоичного кода в код семисегментного индикаторапреобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора(16 голосов, оценка: 4,94 из 5)

Источник

Декодер для 7-сегментного индикатора

7-сегментный индикатор

преобразователь двоичного кода в код семисегментного индикатора

Так как чаще всего в подобных индикаторах используются светодиоды, а как известно у них есть катод и анод, следовательно, и сами дисплеи делятся на 2 подтипа: с общим катодом и с общим анодом. Отличия минимальные, но иногда есть случаи, когда есть один более приоритетный вариант.

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

преобразователь двоичного кода в код семисегментного индикатора

преобразователь двоичного кода в код семисегментного индикатора

Возникающие проблемы

Мы разобрались, как можно выводить различные символы на индикатор, но представим, что у нас есть какое-то электронное устройство, которое должно считать числа, и для удобства мы хотим использовать индикатор, но вот незадача, у нас осталось всего 4 свободных I/0 линии, или мы намеренно хотим это оптимизировать, чтобы не писать код на микроконтроллере для представления цифр на экране или более удобным для нас способом. Напомню, при простом подключении необходимо 8 таких линий.

Кодирование

Так как самая привычная для нас система счисления это десятичная, то будем использовать ее и цифры от 0 до 9. При желании также можно продолжить и для 16-ричной системы. Поскольку у нас все строится пока что на 5V логике, то было бы странно не использовать двоичную систему счисления. У нас есть 10 цифр, следовательно, нам нужно минимум 4 бита для представления всех возможных вариантов. Для удобства предлагаю сделать таблицу.

Представим, что у нас есть 4-bit шина, по которой наше устройство передает сигнал в двоичном представлении. Теперь надо декодировать и передать его на дисплей.

Декодирование

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

преобразователь двоичного кода в код семисегментного индикатора

Цепь для сегмента ‘а’

Из таблицы истинности видно, что сегмент а должен быть включен всегда, кроме цифры 1 и 4. Для упрощения можно сделать так, чтобы логическая единица была только в этих 2 состояниях, и на выход добавить логическое НЕ. Тогда у нас всегда будет 1, кроме 2-ух состояний. Вот схема:

преобразователь двоичного кода в код семисегментного индикатора

Я добавил дополнительную инвертированную шину для удобства и наглядности.

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

преобразователь двоичного кода в код семисегментного индикатора

Улучшение

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

преобразователь двоичного кода в код семисегментного индикатора

преобразователь двоичного кода в код семисегментного индикатора

Реализация

Есть три способа воплотить данный декодер в жизнь.

Из готовых микросхем логических вентилей, например серия микросхем 74HCxx. Данный способ самый простой, не самый практичный, но вполне допустимый. Также его будет просто модернизировать для n-разярдных индикаторов. И отлично подходит для тестов.

Эпилог

В конце, хотелось отметить, что данный декодер являются не плохой практической работой для тренировки создания логических схем и для понимаю как устроенные простые электронные устройства. Идейным вдохновителем для создания данного исследования стал Ben Eater.

Источник

Преобразователь кодов

Преобразователи кодов служат для перевода одной формы числа в другую. Их входные и выходные переменные однозначно связаны между собой. Эту связь можно задать таблицами переключений или логическими функциями.

Шифратор преобразует одиночный сигнал в n-разрядный двоичный код. Наибольшее применение он находит в устройствах ввода информации (пультах управления) для преобразования десятичных чисел двоичную систему счисления. Предположим, на пульте десять клавишей с гравировкой от 0 до 9. При нажатии любой из них на вход шифратора подаётся единичный сигнал (ХО-Х9). На выходе шифратора должен появиться двоичный код (Y1, Y2. ) этого десятичного числа. Как видно из таблиц переключений, в этом случае нужен преобразователь с десятью входами и четырьмя выходами.

На выходе Y1 единица появляется при нажатии любой нечетной клавиши X1, ХЗ, Х5. Х7. Х9, т. е. Y1=Х1\/ХЗ\/Х5\/Х7\/Х9. Для остальных выходов логические выражения имеют вид: Y2=Х2\/ХЗ\/Х6\/Х7; Y4==Х4\/Х5\/Х6\/Х7; Y8=Х8\/Х9. Следовательно, для шифратора понадобятся четыре элемента ИЛИ: пятивходовый, два четырехвходовых и двухвходовый рисунок 1.

преобразователь двоичного кода в код семисегментного индикатора
Рисунок 1

Примечание редакции: логический элемент Y2 неправильно показан. У него нет соединения с Х2, но есть соединение с Х4.

Дешифратор преобразует код, поступающий на его входы, в сигнал только на одном из его выходов. Дешифраторы широко применяются в устройствах управления, в системах цифровой индикации, для построения распределителей импульсов по различным цепям и т. д. Условное обозначение дешифратора на микросхеме К155ИД1 с десятью выходами для дешифрования одного разряда двоично-десятичного кода 8421 и часть его принципиальной схемы приведены на рисунке 2. Любому входному двоичному коду соответствует низкий уровень только на одном выходе, а на всех остальных сохраняется высокий уровень. Дешифраторы входят во все серии микросхем ТТЛ и КМДП. Например, дешифратор К155ИД4 (два дешифратора в корпусе) преобразует двоичный код в код «1 из 4», К155ИД1 и К176ИД1 в код «1 из 10», К155ИДЗ—В код «1 из 16». Цоколёвка этих микросхем приведена на рисунке 2 и 3.

преобразователь двоичного кода в код семисегментного индикатора
Рисунок 2

Дешифратор на микросхеме К155ИД1 предназначен для работы с декадными газоразрядными индикаторами. Его выходы подключают непосредственно к катодам (имеющим форму десятичных цифр) газоразрядного индикатора анод которого через резистор подключен к источнику питания напряжением 200—250 В. Выходные сигналы этой микросхемы отличаются от ТТЛ уровней и поэтому для подключения к ней других микросхем приходится применять дополнительные устройства согласования.

преобразователь двоичного кода в код семисегментного индикатора
Рисунок 3

Дешифратор на микросхеме К155ИДЗ имеет четыре входа для приема чисел в коде 8421 и 16 выходов. Два входа стробирования (для передачи сигнала на А1 и А2 необходимо подать низкие уровни) позволяют объединить микросхемы для получения дешифраторов на 32 выхода рисунок 4, 64 выхода (потребуется четыре микросхемы) и т. д.

преобразователь двоичного кода в код семисегментного индикатора
Рисунок 4

Преобразователь двоично-десятичного кода в код семисегментного индикатора. Числа на табло и пультах индицируются, как правило, в десятичном коде. Для этого можно использовать дешифратор на микросхеме К155ИД1 совместно с газоразрядным индикатором, Однако применение таких индикаторов в радиолюбительской практике нежелательно из-за сравнительно высокого напряжения источника питания (200 В). Сейчас широкое распространение получили так называемые семи сегментные светодиодные и жидкокристаллические индикаторы, которые работают при тех же напряжениях, что и микросхемы. В них индикация осуществляется семью элементами, как показано на рисунке 5. Подавая управляющее напряжение на отдельные элементы индикатора и вызывая его свечение (светодиодные индикаторы) или изменяя его окраску (жидкокристаллические индикаторы), можно получить изображение десятичных цифр 0, 1. 9. О конкретных типах семисегментных индикаторов я расскажу дальше. Преобразование двоично-десятичного кода в код семисегментного индиктора показано в таблице. Цоколёвка некоторых микросхем – преобразователей кода 8421 в семисегментный показана на рисунок.

преобразователь двоичного кода в код семисегментного индикатора
Рисунок 5

Источник

HEX-дешифратор для 2-значного 7-сегментного LED-индикатора на одном(!) GAL16V8

преобразователь двоичного кода в код семисегментного индикатора

Те, кто увлекается ретрокомпьютингом в области самостоятельной сборки компьютеров на базе 8-битных процессоров (i8080/i8085/z80/z180/6502/6809 и т.п.) или микроконтроллеров, обычно сталкиваются с необходимостью отображения в процессе отладки и/или «эксплуатации» какой-либо информации (содержимого шин адреса, данных и др.) на 7-сегментных индикаторах в шестнадцатеричном представлении.

В принципе, задача отображения шестнадцатеричных разрядов с лёгкостью решается необходимым количеством «умных» индикаторов TIL311. Эти хорошо известные индикаторы, разработанные компанией Texas Instruments задолго до того, как вымерли динозавры, ещё продаются (демонтированные с оборудования индикаторы TIL311 можно найти на Aliexpress).

Несмотря на удобство использования, эти индикаторы имеют и существенные недостатки, а именно:

Относительная дороговизна — даже на Aliexpress эти индикаторы стоят совсем не дёшево (по сравнению с обычными 7-сегментными индикаторами) и их не станешь покупать впрок по принципу «авось пригодятся»;

Отсутствие в шаговой доступности — их надо специально заказывать и ждать, т.е. совсем не тот случай, когда нужно что-то смакетировать на быструю руку;

Транзисторно-транзисторная логика (ТТЛ) входных каскадов требует использования дополнительного буфера при подключении к источникам сигналов с малой нагрузочной способностью (например к микропроцессорам);

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

Для увлечений в области ретрокомпьютинга дешёвой и доступной альтернативой является использование обычных, везде и всюду распространённых, 7-сегментных LED-индикаторов любого цвета и размера с дополнительным дешифратором. На роль компактного дешифратора лучше всего, конечно, подходят простые микросхемы программируемой логики (напр. GAL16V8) — эти микросхемы всё ещё распространены, достаточно дёшевы и в силу своей простоты (и при этом гибкости) необычайно полезны, что является достаточным основанием для того, чтобы иметь их в хозяйстве хотя бы десяток.

Использование одной микросхемы GAL16V8 в качестве дешифратора одного цифрового 16-ричного разряда мне показалось слишком расточительным избыточным, поэтому пришлось спроектировать логику дешифратора сразу двух 16-ричных разрядов на одной микросхеме GAL16V8 (готовых решений на GAL16V8 в сети я не нашёл).

Часть 1: А так можно?

преобразователь двоичного кода в код семисегментного индикатора

Составим функциональную таблицу соответствия активных/неактивных сегментов стандартного 7-сегментного LED-индикатора соответствующим значениям отображаемых нибблов — колонке A в таблице соответствует самый старший разряд ниббла, колонке D соответствует самый младший разряд ниббла, активные сегменты индикатора залиты зелёным, неактивные — жёлтым.

Фактически, таким образом мы задали таблицы истинности семи (по числу сегментов индикатора) разных булевых функций, зависящих от 4-х аргументов — ƒ(A,B,C,D):

преобразователь двоичного кода в код семисегментного индикатора

Проведём минимизацию каждой булевой функции с использованием карт Карно для четырёх аргументов. Скриншоты ниже сделаны из файла MS Excel, соответственно для обозначения «склеиваемых» термов я использовал не только различные цвета, но и различные виды границ ячеек (без учёта обычной тонкой сплошной границы).

Так, например, для сегмента a склеиваемые по единицам термы могут иметь 3 цвета (салатовый, зелёный и болотный) и 4 вида границы (двойную ‘═══’, сплошную толстую ‘───’, прерывистую ‘−−−‘ и штрих-пунктирную ‘−∙−∙‘).

Справа от карты Карно каждого сегмента отображён результат минимизации, т.е. минимальная дизъюнктивная нормальная форма (ДНФ) булевой функции соответствующего сегмента. Минимизированные термы сложены вертикально, с отображением той группировки (цвета или границы), по которой производилась минимизация. [Все картинки в статье открывабельны в полном разрешении в отдельном окне/вкладке браузера правой кнопкой мыши]

Здесь и далее в выражениях ДНФ используются следующие обозначения:

ag — булевы функции четырёх переменных F(A,B,C,D),
* — операция логического ‘И’ (логическое умножение, конъюнкция),
+ — операция логического ‘ИЛИ’ (логическое сложение, дизъюнкция),
\ — операция логического ‘НЕ’ (логическое отрицание)

преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора

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

преобразователь двоичного кода в код семисегментного индикатора

Эти результаты хорошо и многократно описаны в сети и позволяют легко реализовать на GAL16V8 управление одним 7-сегментным индикатором. Однако управлять двумя 7-сегментными индикаторами одной микросхемой GAL16V8 эти результаты не помогут. Почему?

преобразователь двоичного кода в код семисегментного индикатора

Если ответ на вопрос «почему с помощью этих функций нельзя управлять двумя индикаторами одним GAL16V8?» понятен, то можно листать вниз до 2-ой части, где я рассказываю как надо сделать, чтобы было можно. А сейчас чуть подробнее о том, почему это нельзя.

Зачем нужна минимизация?

Для начала выясним — а зачем вообще нужна вся эта суета с картами Карно и минимизацией булевых функций?

Вернёмся к исходной таблице соответствия активности сегментов индикатора отображаемым шестнадцатеричным цифрам. Для примера рассмотрим колонку сегмента ‘e‘.
Видно, что этот сегмент должен загораться в 10 случаях из 16-ти — когда на входе цифра 0 или 2 или 6 или 8 или A или B или C или D или E или F.

Если в двоичном коде, то это 0000 или 0010 или 0110 или 1000 или 1010 или 1011 или 1100 или 1101 или 1110 или 1111.

Ну а в виде булевой функции то же самое очевидным образом выглядит как

e(A, B, C, D) = \A*\B*\C*\D + \A*\B*C*\D + \A*B*C*\D + A*\B*\C*\D +
A*\B*C*\D + A*\B*C*D + A*B*\C*\D + A*B*\C*D + A*B*C*\D + A*B*C*D

Логические слагаемые (т.е. выражения, связанные операцией ИЛИ) в булевой функции называются термами. Переменные в терме связаны операцией И. Такая форма записи булевых функций называется дизъюнктивной нормальной формой (ДНФ).

Вспомним (см. спойлер выше), что после минимизации та же самая булева функция содержит уже не 10, а всего 4 терма:

e(A, B, C, D) = \B*\D + C*\D + A*B + A*C*D

Посмотрим теперь как устроены микросхемы программируемой логики на примере гипотетической микросхемы GAL4V1 (в обозначении, как и у всамделишных GAL-ов, первое число обозначает максимально возможное число входов, второе — максимально возможное количество выходов):

преобразователь двоичного кода в код семисегментного индикатораУпрощённое устройство микросхем GAL на примере гипотетической микросхемы GAL4V1

Микросхема GAL4V1 состоит из:

входного каскада, формирующего с помощью инверторов для каждого входного сигнала ‘X’ его логическое отрицание ‘\X’;

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

дизъюнктора, объединяющего полученные термы операцией ‘ИЛИ’;

Очевидно, что с точки зрения схемотехники эта микросхема предлагает реализацию булевых функций, представленных в дизъюнктивных нормальных формах. Красные перемычки показывают, что эта микросхема уже кем-то запрограммирована на реализацию ДНФ рассматриваемой нами булевой функции e (A, B, C, D) в её минимизированном варианте (см. спойлер выше).

Любые ли булевы функции, заданные в ДНФ, можно реализовать микросхемой GAL4V1? Глядя на количество входов (4), выходов (1) и на количество объединяемых дизъюнктором термов (5), можно сформулировать правильный ответ — любую одну, при условии, что функция зависит не более чем от 4-х переменных и количество термов в ДНФ функции не превышает 5-и.

Не будь дизъюнктивная нормальная форма функции e(A, B, C, D) предварительно минимизирована, «засувать» её в эту микросхему не получилось бы, а булеву функцию сегмента ‘a‘ на этой микросхеме не реализовать даже в её минимальной ДНФ (7 термов).
Впрочем, не стоит пока торопиться с окончательными выводами.

А вот вопрос о необходимости минимизации ДНФ полагаю можно считать закрытым ))

Немного о реальных GAL-ах

Сильно ли отличаются всамделишные GAL-ы от рассмотренного гипотетического GAL4V1? С точки зрения способа реализации булевых функций — отличий нет, но реальные GAL-ы имеют дополнительные возможности и/или особенности:

Больше максимальное количество выходов, т.е. булевых функций, которые может реализовать микросхема (до 8 выходов у GAL16V8 и GAL20V8, до 10 выходов у GAL18V10 и GAL22V10, до 12 выходов у GAL26V12 и GAL26CV12);

Большее количество термов на каждый выход (7-8 у GAL16V8 и GAL20V8, 8-10 у GAL18V10, 8-16 у GAL22V10 и GAL26V12, 8-12 у GAL26CV12);

Больше максимальное количество входов, т.е. независимых переменных, из которых можно формировать термы или использовать в других целях (до 16 у GAL16V8, до 18 у GAL18V10, до 20 у GAL20V8, до 22 у GAL22V10 и до 26 у GAL26V12 и GAL26СV12);

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

Возможность перевода выводов в состояние высокого импеданса.

Принципиальным же отличием реальных микросхем GAL является наличие у каждого выхода 1-битного регистра памяти (D-триггера), которые можно активировать/деактивировать индивидуально для каждого выхода в определённом режиме (GAL16V8 и GAL20V8) или без каких-либо особых режимов (GAL18V10, GAL22V10 и GAL26V12/GAL26CV12).

Наличие памяти позволяет на основе GAL-ов реализовывать не только простые комбинационные схемы, но и достаточно сложные устройства, основанные на использовании конечных автоматов.

Совокупность 1-битного регистра, дизъюнктора и коммутационной логики выходного каскада называется у GAL-ов «макроячейкой выходной логики» (OLMC — Output Logic MacroCell).

Опять GAL4V1

Пусть на выходе Y необходимо отображать состояние входа A (т.е. просто сделать повторитель сигнала). Булева функция тривиальна и содержит 1 терм

преобразователь двоичного кода в код семисегментного индикатора

Теперь пусть на выходе Y необходимо отображать состояние входа A только в том случае, если на разрешающем входе B присутствует сигнал низкого уровня:

преобразователь двоичного кода в код семисегментного индикатора

Эта функция хоть и зависит теперь от 2-х переменных, но всё ещё содержит 1 терм.

Чуть усложним задачу — пусть на выходе Y необходимо отображать состояние входа A в том и только в том случае, если на разрешающем входе B присутствует разрешающий сигнал высокого уровня, а на разрешающем входе C сигнал низкого уровня:

преобразователь двоичного кода в код семисегментного индикатора

Добавилась ещё одна переменная, от которой зависит значение функции, но количество термов не изменилось.

А вот теперь попробуем мультиплексировать входные сигналы на один и тот же выход: если на управляющем входе C логический ноль, то необходимо на выход Y передавать информацию со входа A, а если на входе C логическая единица, то на выход Y передавать информацию со входа B:

Y(A, B, C) = A * \C + B * C

преобразователь двоичного кода в код семисегментного индикатора

Получился простейший мультиплексор сигналов. Булева функция также зависит от 3-х переменных, но для нас здесь важно то, что мультиплексирование двух сигналов требует в 2 (два) раза больше термов, чем передача одного сигнала. Почему? А потому, что появилась альтернатива ИЛИ — «или этот вариант или тот».

Зачем мультиплексировать?

Для управления (включения/выключения) каждого сегмента 7-сегментного индикатора требуется отдельный выход дешифратора. Для управления двумя индикаторами без использования мультиплексирования потребовалось бы 7+7=14 управляющих выходов (а если нужно использовать и индикаторы точек, разделяющих разряды, то и все 16).

Мало того, что такого количества выходов не имеет ни одна из упомянутых ранее микросхем GAL, но и сам такой экстенсивный подход является неэффективным с точки зрения расходования ресурсов.

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

А что же GAL16V8?

Даташит на GAL16V8 объясняет, что все макроячейки выходной логики (т.е. совокупность дизъюнктора, 1-битного регистра памяти и коммутационной логики на каждом выходе) могут работать в 3-х разных режимах, т.н. Registered, Complex и Simple. Опуская несущественные здесь детали, разницу между ними можно описать следующим образом.

В режиме Simple каждый выход (а их может быть 8) аналогичен рассмотренной ранее гипотетической GAL4V1, но дизъюнктор каждого выхода объединяет уже 8 термов и количество входных переменных — не менее 10. Возможность перевода выходов в состояние высокого импеданса в этом режиме отсутствует.

В режиме Complex выходы работают подобно режиму Simple, но появляется возможность переводить их в состояние высокого импеданса сигналом Output Enable (OE), формируемым с помощью отдельного терма. По этой причине общее количество «пользовательских» термов на каждом дизъюнкторе не может превышать 7 термов. Количество независимых входных переменных — не менее 10.

В режиме Registered на каждом (любом или всех сразу) выходе между программируемым XOR-инвертором и выходным буфером активируется 1-битный синхронный регистр (D-триггер), запоминающий состояние выходного сигнала по фронту сигнала CLK, общему для всех триггеров и подаваемому на выделенный в этом режиме контакт 1 микросхемы. Есть возможность переводить регистровые выходы в состояние высокого импеданса сигналом \OE, подаваемым на выделенный в этом режиме контакт 11 микросхемы. Максимальное количество термов на регистровых дизъюнкторах — 8. Если выход не использует регистр, то работает подобно режиму Complex и имеет не более 7 термов. Количество независимых входных переменных — не менее 8.

И какой из этого вывод?

Любой из этих режимов позволяет построить на GAL16V8 дешифратор одной шестнадцатеричной цифры, т.к. количество термов в булевых функциях сегментов находится в пределах от 4 (сегмент ‘e‘) до 7 (сегмент ‘a‘) и не превышает возможностей любого из режимов.

Возвращаясь к теме данной статьи, т.е. к управлению двумя 7-сегментными индикаторами одним GAL16V8, становится понятным, что если для декодирования и отображения одной шестнадцатеричной цифры может потребоваться до 7 термов (в случае сегмента ‘a‘), то для декодирования и отображения двух шестнадцатеричных цифр в режиме мультиплексирования потребуется в 2 раза больше термов.

преобразователь двоичного кода в код семисегментного индикатора

Собственно, на этом можно закончить разъяснение того, почему с помощью даже минимизированных ДНФ булевых функций, описанных в начале статьи и реализующих дешифратор одного 7-сегментного индикатора, нельзя построить дешифратор двух 7-сегментных индикаторов на одной микросхеме GAL16V8.

Оставшаяся часть статьи объясняет как можно построить дешифратор двух 7-сегментных индикаторов на одной микросхеме GAL16V8.

Для заявленной в названии статьи цели (т.е. для дешифрации двух шестнадцатеричных цифр) нас интересуют режимы с максимально возможным количеством термов на дизъюнкторе каждого выхода, т.е. режимы Simple и Registered, имеющие по 8 термов на каждый выход.

Стало быть, как уже выяснено в предыдущем разделе, для использования GAL16V8 для дешифрации двух 16-ричных цифр в режиме мультиплексирования выходов любая минимизированная дизъюнктивная нормальная форма булевой функции должна состоять не более чем из 4-х термов. Как этого добиться?

преобразователь двоичного кода в код семисегментного индикатора

Вспомним, что в начале 1-ой части статьи минимизация ДНФ производилась по единицам, т.е. по тем входным термам, значение которых дает логическую единицу на выходе сегмента.

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

Говоря другими словами, если мы применим операцию логического отрицания к булевой функции, принимающей значение «истина» на тех входных термах, которые должны «гасить» сегмент, то в результате получим искомые единицы.

Проведём минимизацию обратных функций каждого сегмента с помощью тех же карт Карно. Для обозначения «склеиваемых» термов по нулям я использовал уже не различные цвета и типы границ, а выделение жирным и два вида перечёркивания ячеек (‘\’ и ‘/’). Одиночные, ни с кем не «склеиваемые» нули я никак не выделял :

преобразователь двоичного кода в код семисегментного индикатораОстальные сегменты под спойлером

преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора преобразователь двоичного кода в код семисегментного индикатора

Кстати, обратите внимание, что в таком виде любая их этих функций могла бы быть реализована силами GAL4V1, да ещё и с запасом 😉

Пора проверить результат на практике.

Программируем GAL16V8D

В качестве иллюстрации к этой статье нарисовал простую схему — набираем любые 2 шестнадцатеричные цифры в двоичном коде на DIP-переключателе и тут же видим эти цифры на индикаторе:

преобразователь двоичного кода в код семисегментного индикатора

Транзисторы работают в режиме ключа — подойдут любые PNP с допустимым током коллектора не менее 100 мА. Индикаторы — любые 7-сегментные с общим анодом. Тут необходимо сделать пояснение.

Как мы помним, наши обратные булевы функции принимают значение единицы для тех входных термов, которые должны «гасить» сегменты и нуля для тех, которые должны их «зажигать».

Можно было бы задействовать XOR-инверторы выходных каскадов GAL16V8 и выдавать единицы на LED-индикаторы с общим катодом, но выходные буферы GAL16V8D имеют небольшую нагрузочную способность по току логической единицы, зато более чем достаточную по току логического нуля:

преобразователь двоичного кода в код семисегментного индикатора

Вроде как существовали GAL16VP8 с мощными выходными буферами-драйверами (до 64 мА на каждый выход), но мне такие не попадались. Поэтому логичным был выбор в пользу индикаторов с общим анодом (я использовал такой).

До установки 2-значного LED-индикатора собранная на короткой макетке схема выглядела вот так (для генератора 200Гц-меандра не хватило всего 4-х рядов, пришлось размещать на отдельной макетке):

преобразователь двоичного кода в код семисегментного индикатора

преобразователь двоичного кода в код семисегментного индикатора

Можно убедиться, что все булевы функции сегментов в конфигурации полностью соответствуют ранее выведенным булевым функциям для нулей. Я постарался добавить комментарии (к сожалению, кириллицу WinCUPL не всегда любит), поэтому хочется думать что после прочтения всего предыдущего текста код должен быть очевидным.

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

Тут дело в следующем — в связи с тем, что используется режим динамической индикации (т.е. когда цифры светятся поочерёдно, в свои определённые промежутки времени), то в общем случае, когда цифр может быть больше 2-х, для указания периода свечения (и декодирования) конкретной цифры сигнал EN_i должен быть таким же прямоугольным входным сигналом требуемой скважности, как и EN_j, но с другой фазой :

преобразователь двоичного кода в код семисегментного индикатора

преобразователь двоичного кода в код семисегментного индикатора

Сигнал EN_L, таким образом, формируется как выходящий (для управления транзисторным ключом младшей цифры) и тут же используется как входящий (при формировании флагов LED1/LED2 управления мультиплексором).

Для прошивки в GAL16V8D JED-файла конфигурации (получившегося в результате компиляции исходного кода) использовался широкоизвестный программатор MiniPro TL866A. Сама процедура прошивки занимает не более 5 секунд :

преобразователь двоичного кода в код семисегментного индикатора

Ну и да — разумеется, всё работает так, как и должно — один GAL16V8 работает дешифратором для двух 7-сегментных индикаторов:

преобразователь двоичного кода в код семисегментного индикатора

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *