Преобразователь 7-сегментного индикаторного кода в BCD-DEC на GAL16V8. Одинарная и сдвоенная версии.

  В номенклатуре TTL микросхем существует готовый преобразователь с такой функциональностью, это 74915 — 7 Segment to BCD converter. К сожалению это такая редкость, что найти и купить этот чип сложно и дорого.


  В журнале «Elector», 1976, №12, стр. 35, в статье «Seven-segment to BCD converter» приведена простая схема преобразователя 7-сегментного кода в BCD код на микросхемах малой степени интеграции. Там два варианта, первый предназначен для индикаторов с ОК (положительная логика), второй для индикаторов с ОА (отрицательная логика), различия небольшие.

  

  Рассмотрим первый вариант, верхний элемент 2ИЛИ-НЕ служит для формирования сигнала гашения (все сегменты погашены) и для BCD кода не нужен. Для однозначного преобразования 7-сегментного кода в исходный BCD код достаточно сигналов пяти сегментов — a, b, e, f, g. Таблица преобразования для цифр 0..9 будет выглядеть так:

  

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

  

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

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

  • недостатки
    • каждый бит (плавкая перемычка) программируется отдельно.
    • одноразовость — перепрограммирование невозможно.

    • высокое энергопотребление
    • изнанка предыдущего пунта, высокое тепловыделение.
    • Для различных типов PROM вероятность правильного программирования (коэффициент программирования) составляет:
      Кпр. = 0,65 – 0,9
      При необходимости – производят повторное программирование. Для повышения надёжности правильно запрограммированного ПЗУ нужно провести термотренировку – выдерживанию в термостате в течение определённого времени при высокой температуре (например – 168 час. при температуре +125 градусов). Если после термотренировки обнаружены ошибки – производят повторное программирование.
    • Для них нужны или дорогие и старые универсальные программаторы (~$300...1000), или простые программаторы на LPT порт, что тоже стал редкостью.
  Не думаю, что стоит связываться c PROM с плавкими перемычками, в первую очередь потому что они однократно программируемые. При списании оборудования они обычно выбрасываются, т.к. за редким исключением повторно не перепрограммируются.

GAL — Generic Array Logic (CMOS PLD)

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

  

  Здесь будет рассмотрена самая простая микросхема GAL16V8. Все ее макроячейки выходной логики (т.е. совокупность дизъюнктора, 1-битного регистра памяти и коммутационной логики на каждом выходе) могут работать в 3-х разных режимах, т.н. Simple (S), Complex (MA) и Registered (MS). Опуская несущественные здесь детали, разницу между ними можно описать следующим образом.
  • В режиме Simple количество входных переменных — не менее 10, выходных — не менее 8. Внутренние перекрестные связи с выхода на вход запрещены (это не относится к перекрестным связям внутри дизъюнктора), возможность перевода выходов в состояние высокого импеданса в этом режиме отсутствует. Если будет нужно менее 8 выходов, остальные выходы можно запрограммировать на вход.
  • В режиме Complex перекрестные связи с выхода на вход разрешены, выходы работают подобно режиму Simple, но появляется возможность переводить их в состояние высокого импеданса сигналом Output Enable (OE).
  • В режиме Registered на каждом (любом или всех сразу) выходе между программируемым XOR-инвертором и выходным буфером активируется 1-битный синхронный регистр (D-триггер), запоминающий состояние выходного сигнала по фронту сигнала CLK, общему для всех триггеров и подаваемому на выделенный в этом режиме контакт 1 микросхемы. Есть возможность переводить регистровые выходы в состояние высокого импеданса сигналом \OE, подаваемым на выделенный в этом режиме контакт 11 микросхемы.

  Для написания программы использована бесплатная программа WinCUPL (скачать дистрибутив Atmel WinCUPL v.5.30). Хотя программа и бесплатная, при первом запуске она потребует серийный номер — 60008009. WinCUPL может создавать файлы JED для Lattice GAL16V8 всех вариантов A, B, C, D. Тот же файл JED будет программировать Atmel ATF16V8 (все суффиксные версии). В качестве операционной системы использовалась Windows 7 x64, программа работала без сбоев и нареканий (в программе нужно использовать только латинский алфавит, иначе от русских букв, даже в коментариях, WinCUPL вываливается с ошибкой).
В настройках программы (Options\Compiler) задаются все важные параметры проекта:
      
  • Закладка General. Если в параметрах проекта нет галки на пункте "JEDEC name = PLD name", имена всех созданных проектом файлов будут соответствовать имени «Name» заголовка проекта. Если галка есть, имена файлов будет соответствовать имени PLD файла.
  •   
  • Закладка Output Files.
    • Для того чтобы в результате компиляции создавался выходной JEDEC файл необходимо поставить галку в чекбоксе «Download\JEDEC».
    • Для того чтобы в результате компиляции создавался выходной файл листинга *.LST необходимо поставить галку в чекбоксе «General\List».
      — Файл содержит нумерованную по строкам копию PLD-файла. Если в программе есть ошибки, они будут перечислены в конце файла и будут использовать номера строк для ссылок.
    • Для того чтобы в результате компиляции создавался выходной файл *.DOC необходимо поставить галку в любом чекбоксе Doc File Options.
      — Чекбокс «Doc File Options\Fuse Plot». Включает в файл псевдографическую карту программирования и визуальное изображение чипа с назначенными входами/выходами:

        

      — Чекбокс «Doc File Options\Equations». Включает в файл все логические уравнения, которые CUPL сгенерировал из вашей программы.
  •   
  • Закладка Minimization. Оптимизация времени выполнения для компиляции, с пунктом "None" файл у меня вообще не скомпилировался. В системных требованиях программы указан процессор 486DX-66, и возможно на нем и была разница во времени компилирования. Сейчас при выборе любого пункта компилирование происходит очень быстро.
  •   
  • Закладка Optimization. Оптимизация логического выражения.

Файлы программы имеют следующие расширения:
  • PLD (Programmable Logic Device) — Содержит все определения и логические инструкции, необходимые для вашего устройства, т.е. саму программу CUPL. Создается пользователем.
  • SI — Файл ввода моделирования, содержит список тестовых векторов. Создается пользователем.
  • JED — Файл, используемый программистом для записи чипа. Генерируется CUPL.
При создании файлов CUPL можно использовать следующие справочные файлы:

  Создать *.PLD файл можно в любом текстовом редакторе (plain text) или из программы File\New\Design File, но возможности автогенерации кода сильно ограничены (генерируется только загодовок). Устройство файла *.PLD программы CUPL:
  • Заголовок файла.
    /* Header */
    Name     Single codec 7SegToBCD;
    PartNo   00;
    Date     17.08.2021;
    Revision 01;
    Designer Engineer;
    Company  anakost;
    Assembly None;
    Location ;
    Device   G16V8S;
    
    Для нас здесь представляют интерес только первая и последняя строки, для чего остальные не знаю, не разбирался.
    • Name, определяет имя итогового, загружаемого в микросхему JEDEC файла, если в параметрах проекта нет галки на пункте «General\JEDEC name = PLD name». Если галка есть, имя JEDEC файла будет соответствовать имени PLD файла.
    • Device, определяет имя устройства (G16V8) для которого будет компилироваться JEDEC файл и режим компиляции (S — Simple Mode). Предопределенные в этом режиме назначения выводов:
      Input only      Output only    Input/Output
      1, 2, 3, 4, 5          15, 16          12, 13, 14,
      6, 7, 8, 9, 11                            17, 18, 19
      Все эти предопределения можно подсмотреть в файле Devhelp.pdf. Найти его можно в каталоге WinCupl\AtmelHlp.
  • Присвоение (сопоставление) логических переменных выводам корпуса.
    /* Pin assignment, Input pins */
    PIN   1  = SegA;
    PIN   2  = SegB;
    PIN   3  = SegE;
    PIN   4  = SegF;
    PIN   5  = SegG;
    
    /* Pin assignment, Output pins */
    PIN  19   = Q0;
    PIN  18   = Q1;
    PIN  17   = Q2;
    PIN  16   = Q3;
    
      При компиляции для определенного железа это обязательный этап, т.к. программа должна знать откуда брать входные и куда помещать выходные данные. Если в заголовке в строке Device указано virtual, этот этап необязателен.
  • Логика преобразования.
    /* Declarations and Intermediate Variable Definitions */
    FIELD InBus = [SegA,SegB,SegE,SegF,SegG];
    FIELD OutBus = [Q3,Q2,Q1,Q0];
    
      Обьявление входных и выходных переменных как полей — 5-ти битового и 4-х битового соответственно. Если входные переменные инвертированы (индикатор с ОА) определение немного меняется:
    FIELD InBus = [!SegA,!SegB,!SegE,!SegF,!SegG];
    
      Тело главного цикла представляет собой простую таблицу соответствия уровней входов/выходов. Она полностью соответствует таблице преобразования для цифр 0..9 приведенной ранее.
    /* Main body, Truth Table */
    TABLE InBus => OutBus {
       'b'11110 => 'b'0000; 
       'b'01000 => 'b'0001;
       'b'11101 => 'b'0010; 
       'b'11001 => 'b'0011;
       'b'01011 => 'b'0100; 
       'b'10011 => 'b'0101; 
       'b'00111 => 'b'0110; 
       'b'10111 => 'b'0110; 
       'b'11000 => 'b'0111;
       'b'11111 => 'b'1000; 
       'b'11011 => 'b'1001; 
    }
    
      При таком способе задания нет необходимости вручную составлять логические выражения, потому что программа сделает это автоматически. Также программа может выполнять минимизацию логики (если задано). Комментарии внутри таблицы (между скобками {}) вызовут ошибку.

  

  Если компиляция этого файла пройдет успешно, вместе с выходным файлом JEDEC в каталоге появится и файл *.DOC в котором можно посмотреть итоговое логическое выражение созданное программой. Для данного файла оно будет таким, уровень оптимизации Quick, уровень минимизации 0 (отключена, все галки на закладке Optimization выключены):
===============================================================================
                            Expanded Product Terms
===============================================================================

InBus =>
    SegA , SegB , SegE , SegF , SegG

OutBus =>
    Q3 , Q2 , Q1 , Q0

Q0 =>
    SegA & !SegB & !SegE & SegF & SegG
  # SegB & !SegE & !SegF & !SegG
  # SegA & SegB & !SegE & SegG

Q1 =>
    SegA & SegB & !SegE & !SegF & !SegG
  # SegA & SegB & !SegF & SegG
  # !SegB & SegE & SegF & SegG

Q2 =>
    SegA & SegB & !SegE & !SegF & !SegG
  # !SegA & SegB & !SegE & SegF & SegG
  # SegA & !SegB & SegF & SegG
  # !SegA & !SegB & SegE & SegF & SegG

Q3 =>
    SegA & SegB & SegF & SegG
Даже с отключенной минимизацией программа очень простая и занимает ~ 1/6 доступной памяти термов (псевдографическая карта программирования в *.DOC файле).

  Как можно заметить для программы использовалось ровно половина доступных в режиме Simple выводов GAL16V8 (5 входов, 4 выхода). Поэтому ничего не мешает использовать оставшиеся выводы (5 входов, 4 выхода) для второго такого-же преобразователя. Приводить здесь программу не буду, исходники приложены к статье, кто прочитал легко разберется. Этот вариант программы занимает ~ 1/3 доступной памяти термов. Визуальное изображение чипа с назначенными входами/выходами:

  

  Таким образом в микросхеме GAL16V8 можно разместить два независимых статических (комбинаторных) преобразователя 7-сегментного индикаторного кода в BCD-DEC.

К статье приложен архив с проектами WinCUPL и Proteus одинарного и сдвоенного преобразователя кодов.

P.S.
   Подобное решение описано в книге «Искусство схемотехники. Том 2», Хилл Уинфилд, правда там конвертор 7SEG -> BCD-HEX. Перевод можно почитать здесь, глава «Языки ABEL и CUPL»…
  • +3
  • 01 сентября 2021, 18:19
  • anakost
  • 1
Файлы в топике: 7SegToBCD.zip

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

RSS свернуть / развернуть
Это скорее «деталька», чем «схемотехника».

Из статьи неясно, а чем прошивать-то микру? И поддаются ли прошивке микросхемы серии PAL?
0
  • avatar
  • Vga
  • 01 сентября 2021, 18:38
Прошивается «народным» программатором minipro — TL866-II.
Микросхемы серии PAL однократно программируемы.
0
Сейчас такое можно на какой ни будь SLG46120 сделать. Потреблять будет микроамперы, места занимать мало. Ну и хоть кто-то их руками пощупает и может даже статейку напишет :)
0
  • avatar
  • mChel
  • 01 сентября 2021, 19:16
Что означает символ "#"?
0
  • avatar
  • Aneg
  • 02 сентября 2021, 10:42
# — OE, & — AND, $ = XOR,! — NOT
0
# — OR, & — AND, $ = XOR,! — NOT
0
Спасибо
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.