Выполняемого преобразования информации

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

преобразователей.

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

типичный пример – формирование интервала времени заданной длительности или его измерение с помощью так называемого генератора квантующих

импульсов (вид временных диаграмм показан на рис. 2.4).

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

Параллельный единичный код для частного случая, когда число двоичных символов n равно 8, представлен ниже в таблице 2.1 (столбец B1 – двоичные кодовые комбинации; столбец N – те числовые значения, которым они соответствуют). Код такой структуры получается, например, от «линейки компараторов» параллельного АЦП (см. выше раздел 1.5.3; правда, столь

малое n, как 8, реально встречается только у преобразователей, входящих в состав так называемых параллельно-последовательных АЦП).

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

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

коды имеют некоторые «аналоговые черты» – условности в их структуре

минимальны.

В табл. 2.1 представлены также примеры двух других кодов, в какой-то

степени родственных единичному параллельному коду. Код «один из n» (столбец B2 в таблице), называемый также распределительным, содержит единицу на месте самого правого нуля единичного параллельного кода; остальные его биты – нулевые. Число комбинаций такого кода равно числу

используемых битов n и получается на единицу меньшим, чем у единичного

параллельного кода при том же числе n.

Коды вида «k ↔ k+1» (столбец B3) были предложены на кафедре ИИТ

ЛПИ им. М.И.Калинина В.А.Краснобаевым, который исследовал возможности жидкостных кодирующих устройств, подобных по конструкции капилляру рисунка 2.5, но с заменой сплошного столбика проводящей жидкости перемещающейся каплей. Последняя играла роль кодированного единицами

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

Более плодотворен принцип получения всех битов с одной дорожки в

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

Для подобных устройств развита теория так называемых комбинаторных шкал и соответственно комбинаторных кодов.

 

Рис. 2.6, а представляет один из вариантов шкалы для комбинаторного

кода, известного под названием «два из пяти». Дорожка содержит 10 участков: один (левый на рисунке) кодирован единицей, следующие два – нулями, затем три – единицами и четыре – нулями. Пять воспринимающих элементов a, b, c, d, e расположены равномерно по углу. Четыре приведенных на рисунке примера взаимного расположения шкалы и воспринимающих элементов (в реальных датчиках положения, наоборот, обычно неподвижны воспринимающие элементы, а кодированная шкала перемещается) ясно показывают: всегда два воспринимающих элемента, либо смежные, либо установленные через один, будут воспринимать единицы, а три остальные – нули. Таких кодовых комбинаций существует ровно десять. Заметим, что коды, все комбинации которых содержат одно и то же число единиц, иногда называют кодами постоянного веса.

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

снова дана ее развертка). На этот раз воспринимающие элементы a, b, c, d, e

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

Либау – Крейга. При перемещении шкалы влево относительно воспринимающих элементов исходная кодовая комбинация 00000 переходит в 00001, затем в 00011; 00111; 01111 и 11111 (справа налево как бы проходит «волна единиц»); при дальнейшем движении возникает и проходит справа налево такая же «волна нулей», заканчивающаяся последней комбинацией 10000.

Таким образом, одним из свойств кодов, представляющих интерес для

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

Другое важное свойство – взвешенность кодов, т.е. возможность присвоения каждому i-му двоичному разряду кодовой таблицы такого весового

коэффициента, или, короче, веса mi, что для любой кодовой комбинации ее

числовое значение найдется по формуле (см. раздел 1.5.1):

Напомним, что здесь и далее самому правому (младшему) разряду кодовой комбинации приписан номер i = 1; самому левому разряду – номер

i = n; символ αiобозначает двоичную переменную; число N понимается как

целое. В литературе иногда используется обратная нумерация, счет разрядов

часто начинают не с единицы, а с нуля, а в некоторых случаях изображаемое

число рассматривают как дробное (нормализованное).

Разумеется, не следует путать свойство взвешенности кодов со свойством постоянства веса комбинаций, которое присуще, например, упомянутому выше коду «2 из 5». Это совершенно различные свойства.

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

построения ЦАП и АЦП. При этом выходная величина ЦАП, – например, ток, – получается как сумма токов, заранее подогнанных (естественно, с некоторыми погрешностями) в соответствии с весами разрядов используемого кода.

Говорилось также и о том, что натуральный двоичный код является

взвешенным, и веса его разрядов составляют

 

 

Другие системы весов чаще всего бывают нужны в случаях, когда ЦСИ

управляется человеком (если это калибратор) или формирует цифровой отсчет для человека (если это вольтметр, частотомер и т.п.). Для человека привычна десятичная система счисления; компромиссом между этой привычкой и удобством использования двоичных элементов внутри ЦСИ является использование двоично-кодированных десятичных систем счисления, или иначе двоично-десятичных кодов.

В двоично-десятичном коде число изображается последовательностью

десятичных цифр, но каждая цифра кодируется двоичными символами. Поэтому для описания двоично-десятичного кода обычно достаточно

представить таблицу кодирования десятичных цифр от 0 до 9.

В табл. 2.2 представлено несколько таких кодов. Все они – четырехбитовые (тетрадные); коды с избыточным числом битов используются реже (заметим, что выше на рис. 2.6 были даны два примера пятибитовых двоично-десятичных кодов).

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

двоичным кодом. Так строится двоично-десятичный код 8421 (столбец B1 в

табл. 2.2). Например, число 1945 в этом коде запишется (потетрадно) следующим образом: 0001 1001 0100 0101. Последовательность весов битов в

этой записи, слева направо: 8000; 4000; 2000; 1000; 800; 400; 200; 100; 80; 40; 20;10; 8; 4; 2; 1. Видно, что только последняя четверка весовых коэффициентов совпадает с весами натурального двоичного кода.

Недостатком кода 8421 применительно к таким устройствам, как ЦАП по рис. 1.10, является избыточная сумма весовых коэффициентов, равная 15: для кодирования цифр от 0 до 9 достаточна сумма весов 9. Избыточная сумма весов увеличивает погрешность ЦАП (или АЦП на его основе). Исследовано и испробовано на практике большое число различных двоично-десятичных кодов с суммой весов, равной 9. Из них наибольшее распространение получили коды с весами 2421. Вообще говоря, любая четырехбитовая комбинация с весами битов 2421 может быть расшифрована как десятичная цифра; однако чаще определенным образом отбирают 10 разрешенных комбинаций, считая остальные шесть запрещенными.

В табл. 2.2 представлены разрешенные комбинации трех различных

кодов 2421.

В столбце B2 приведен код 2421, удобный для использования в счетчиках импульсов: недвоичный переход от 0111 к 1110 просто реализуется с помощью «обратной связи» со старшего триггера счетчика на два предыдущих.

Столбец B3 представляет код 2421, удобный для цифроаналоговых преобразователей цифровых вольтметров: недвоичный переход между 0001 и

1000, приводящий к раннему появлению «старшей» двойки, облегчает обеспечение однозначности формирования кодового представления цифр в

процессе преобразования методом «последовательных приближений».

Столбец B4 изображает самодополняющийся код 2421, или код Айкена,

по фамилии Говарда Айкена, разработчика американских электромеханических вычислительных машин Марк-1 и Марк-2 (первый проект Айкена – 1937 г.; завершение машины Марк-2 – 1947 г.).

Самодополняемость есть свойство двоично-десятичного кода, заключающееся в том, что инверсия всех битов комбинации, изображающей однозначное число x, превращает ее в комбинацию, изображающую число 9 – x.

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

В столбце B5 табл. 2.2 приведен код 7421, замечательный тем, что ни

одна из его комбинаций не содержит более двух единиц. Это облегчает обнаружение некоторых сбоев (см. ниже раздел 2.2.7).

Наконец, в столбце B6 представлен невзвешенный код с избытком 3, или код Штибица, по фамилии немецкого разработчика ранних вычислительных машин. Этот код получается путем арифметического прибавления к

комбинациям кода 8421 комбинации 0011, изображающей число 3. Нетрудно

видеть, что код Штибица тоже обладает свойством самодополняемости.

Нужно отметить, что не всегда неоднозначность изображения чисел (свойственная всем взвешенным кодам с весовыми коэффициентами, уменьшенными по сравнению с двоичными весами 2i-1) рассматривается как нежелательная. Примером намеренного введения и использования такой неоднозначности является система счисления, построенная на числах Фибоначчи. Ряд Фибоначчи строится следующим образом: первые два числа

равны 1, каждое следующее получается суммированием двух предыдущих: 1;

1; 2; 3; 5; 8; 13; 21; 34 и т.д. Ошибка в любом разряде кода с такими весами,

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

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

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

разряде. Натуральный двоичный код не является однопеременным: например, комбинации 01111111 и 10000000, изображающие соседние числа 127 и 128, различаются в восьми разрядах – в семи младших разрядах получаются

переходы 0 → 1 и в одном старшем 1 → 0.

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

Устройства, работающие в неоднопеременных кодах, могут давать сбои

в ситуациях, когда требуется слежение за непрерывно изменяющейся кодированной величиной и возможно считывание кода в произвольный момент процесса его изменения. Такие ситуации чаще всего возникают при измерениях во временной и пространственной областях. Например, рассмотрим устройство датирования событий, состоящее из опорного генератора (источника импульсной временной шкалы), счетчика импульсов шкалы и регистра, в который переписывается кодовая комбинация со счетчика в момент появления датируемого события. Если сигнал события приходит в момент смены кодовой комбинации в счетчике, возможна запись в регистр ложной комбинации, не совпадающей ни с предыдущей, ни с последующей комбинацией счетчика. Другой пример – цифровые весы с кодированным диском, установленным на месте поворачивающейся стрелки аналоговых весов. Если диск кодирован натуральным двоичным кодом (по аналогии с рейкой, изображенной на рис. 1.21, а раздела 1.5.5), то возможно попадание воспринимающих элементов на линию смены сразу нескольких разрядов кода (далее будем называть ее опасной границей). Это, с учетом конечных размеров воспринимающих элементов и допусков на их установку, опять-таки может привести к считыванию ложной комбинации. Если одновременно изменяются все разряды кода, то, вообще говоря, может быть получена любая ложная комбинация, включая «все нули» и «все единицы».

Описанное явление принято называть неоднозначностью считывания

кода.

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

тактовой последовательности, смещенной по отношению к последовательности импульсов временной шкалы.

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

На рис. 2.7 повторено изображение кодированной рейки по рис. 1.21, а,

но с расщепленными воспринимающими элементами (щетками) трех старших разрядов, сдвинутыми от линии считывания вправо (вперед) и влево (назад) на половину протяженности участка младшего разряда. Щетка младшего разряда на рисунке находится на опасной границе кодовых комбинаций. Однако, в зависимости от ее случайного смещения относительно номинального положения, с нее может быть считан как «0», так и «1». Сигнал α1 = 0 указывает на то, что младшая щетка сошла с опасной границы в сторону возрастания кодового отсчета. Значит, для надежного получения остальных разрядов нужно их считывать со щеток опережающего ряда A. Напротив, при α1 = 1 нужно считывать остальные разряды со щеток отстающего ряда B. Это легко выразить формулой, годящейся для всех i > 1:

Расположение воспринимающих элементов по рисунку 2.7 называют

U-расположением по виду узора, образуемого щетками. Применяют также

V-расположение, при котором смещение щеток каждого (i + 1) -го разряда

относительно линии считывания удваивается по сравнению со смещением

щеток i-го разряда. При этом формула становится незначительно сложнее:

Коды, получающиеся непосредственно с воспринимающих элементов

при их U- или V-расположении, называют двоично-сдвинутыми кодами.

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

оказывается применение однопеременных кодов: у этих кодов нет опасных

границ между кодовыми комбинациями.

Заметим, что однопеременные коды полезны также в случаях, когда

последовательно меняющиеся кодовые комбинации требуется непрерывно

дешифрировать, т.е. преобразовывать в код «один из n» (см. табл. 2.1). Неоднопеременные коды в этой ситуации могут давать на выходе дешифратора короткие паразитные выбросы из-за неодновременного изменения отдельных битов дешифрируемой комбинации. Применение однопеременных кодов гарантирует отсутствие выбросов.

Двоичный однопеременный код строится обычно с использованием принципа отражения. Этот общий (выходящий за рамки теории кодов) инженерный принцип можно сформулировать так: если после «рабочего» изменения какого-либо сигнала происходит скачкообразное возвращение в

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

направлении. В данном случае одна или несколько накапливающихся единиц

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

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

Для построения отраженного однопеременного кода на каждом таком переходе должно происходить отражение «вертикального цикла» изменения групп битов.

Чтобы не иметь дело с большим числом отражений малых групп битов, удобнее рассматривать отражения постепенно укрупняющихся групп: при переходе от N = 1 к N = 2 отражается цикл изменения одного младшего бита (рис. 2.8, а); при переходе от N = 3 к N = 4 – цикл изменения двух младших битов (рис. 2.8, б); при переходе от N = 7к N = 8 – цикл изменения трех младших битов (рис. 2.8, в), причем из рисунка 2.8 видно, что последний содержит один «прямой» и один «отраженный» цикл изменения двух младших битов и вдвое большее число чередующихся циклов изменения одного младшего бита. Аналогично, при переходе от N = 15 к N = 16 отражается цикл изменения четырех младших битов, и т.д. Построенный таким образом код называют кодом Грея; в соответствующей колонке табл. 2.3 подчеркиваниями отмечены только что рассмотренные «линии отражения».

 

 

Рисунок рейки, кодированной этим кодом, был приведен выше на рис. 1.21, б раздела 1.5.5: на нем с первого взгляда видно отсутствие опасных границ. Отметим также, что два сигнала, получаемых от периодической шкалы по рис. 1.22, образуют двухразрядный код Грея.

После считывания комбинации кода Грея с какого-либо устройства ее

часто преобразуют в более удобный код, обычно – натуральный двоичный

(попытки выполнять вычисления в коде Грея делались, но были оставлены).

Алгоритм такого преобразования основывается на том, что признаком

принадлежности какого-либо бита комбинации «прямому» или «отраженному» циклу изменения этого разряда кода является число единиц в более старших разрядах. Если оно четное (в частности, нулевое), то цикл «прямой»; если нечетное – «отраженный». Отсюда следует очень простой алгоритм: нужно перебирать все разряды комбинации кода Грея, начиная со старшего разряда, и по ходу перебора суммировать их значения по модулю 2, выписывая каждый получающийся результат. Например. комбинация кода Грея 01110001 переходит в комбинацию натурального двоичного кода 01011110: старший разряд (в данном примере 0) всегда сохраняется; затем последовательное суммирование трех единиц по модулю 2 дает 101; последняя полученная к этому моменту единица не меняется при суммировании трех последующих нулей, но дает 0 при суммировании единицы младшего разряда.

Код Грея является невзвешенным, но его разрядам можно приписать знакопеременные веса ±(2i – 1), т.е. ±1; ±3; ±7; ±15 и т.д., причем знаки весовых коэффициентов чередуются у единиц, перебираемых в кодовой комбинации слева направо (первая встреченная единица всегда имеет положительный вес). Поэтому, хотя числовое значение комбинации кода Грея обычно находят после перехода к натуральному двоичному коду :

N(01011110b) = 64 + 16 + 8 + 4 + 2 = 94,

где число N записано как функция кодовой комбинации, а b означает натуральный код; можно вычислить то же значение проще, без промежуточного преобразования, непосредственно в коде Грея (g):