преобразователи двоичного кода в двоично десятичный код
Но для начала разберёмся, как вообще преобразовывать двоичный код в двоично-десятичный «по-простому». Похоже, что здесь всерьёз и надолго обосновался ровно один метод: double dabble, он же «сдвинуть и прибавить три».
Метод упоминался недавно на канале computerphile: https://www.youtube.com/watch?v=eXIfZ1yKFlA
После первого шага получим следующее (пока все разряды были нулевыми, поэтому достаточно только сдвинуть):
Опять всё просто: мы просто осуществили сдвиг.
А вот теперь младший десятичный разряд принял значение 8. Это значит, что мы должны прибавить туда тройку:
и только после этого сдвинуть:
Если смотреть на десятичные значения, которые у нас идут в процессе работы, мы видим:
то есть, по мере «пропихивания» того двоичного значения, что сидело справа, мы следим, чтобы здесь уже принимались «правила десятичной арифметики», и 8 * 2 = 16, а не 10.
Поехали дальше. В младшем разряде у нас шестерка, поэтому прибавляем 3:
Теперь сдвигаем влево:
(мы получили десятичную запись 032)
Все три числа не превышают 4, так что снова делаем сдвиг:
(десятичная запись 064)
Коректируем разряд десятков, где у нас появилась шестёрка (больше четырёх), т.е прибавляем 3:
И наконец, сдвигаем:
Самую компактную (но неоконченную) реализацию предлагают в Xilinx Application Note 029:
Мы составляем преобразователь произвольной разрядности из однотипных элементов, каждый отвечает за один десятичный разряд. В начале преобразования мы их всех обнуляем, подавая сигнал Init, а затем начинаем каждый такт подавать на крайний правый элемент очередной бит данных (от старшего к младшему), они распространяются по цепочке, и когда все биты «закончатся», у нас сформируется правильный двоично-десятичный код.
Вот как предлагается реализовывать каждый модуль:
Сразу видно: наши люди! На самом деле, логика довольно простая. Если пришёл сигнал Init, мы просто всё обнуляем. В противном случае, из 4 исходных бит мы формируем скорректированное значение: числа от 0 до 4 останутся без изменений, к числам от 5 до 9 мы прибавим тройку, а с числами от 10 до 15 может случиться что угодно, нам без разницы, поскольку они всё равно появиться не могут!
Собственно, благодаря этому наблюдению удаётся иногда немножко подсократить размер каждого модуля.
Вот как можно написать этот модуль на верилоге, «доверившись компилятору»:
Теперь сделаем весь преобразователь целиком. Вот его заголовок:
И начинаем, как всегда, с «командоаппарата». Кажется, что нам вполне хватит для счастья 16 состояний:
Как всегда: в нулевом состоянии он «стоит на месте», но по приходу импульса start наконец-то приходит в движение, досчитывает до 15, и в этот момент на проводе TC (Terminal Count) появляется единичка, которую мы транслируем на выход finished.
Теперь разбираемся со входным сдвиговым регистром:
И наконец, ставим «батарею» из наших преобразователей:
То есть, мы, так получается, сосчитали до 15 (счёт начался с единицы, а не с нуля, как обычно), а в реальности нужно 17 тактов, поскольку на первом такте (после прихода импульса start) мы только-только «защёлкнули» входные данные, и лишь к следующему такту сдвинули их хоть раз!
Можно поставить небольшой костыль: вместо строчки
Таким образом, сдвинем этот импульс на два шага без заметного усложнения счётчика (добавления разряда и входа синхронной загрузки).
Вот, наконец, код модуля целиком:
Как показал опыт, попытка упростить логику внутри каждого блока не приводит к успеху, количество потребных ЛЭ не уменьшается.
Данные манёвры экономят нам 3 ЛЭ: теперь требуется 52 логических элемента.
Следующая идея: а не зациклить ли нам эту штуку? Так и быть, оставим шину в 20 бит (чтобы не мучаться потом при мультиплексировании и пр.), но в старший десятичный разряд при старте будем запихивать 4 младших бита двоичного числа. Тогда сам сдвиговый регистр можно будет сократить на те же самые 4 бита.
Теперь описание сдвигового регистра и регистра для старшего разряда выглядят так:
Кроме того, в блоке, отвечающем за самый младший разряд, теперь вместо SR[15] надо подать на вход SR[11] (к счастью, в противном случае компилятор грязно выругается, так что забыть не получится!)
И наконец, ещё один маленький «штрих». На самом деле, нам вовсе не обязательно начинать с такого состояния:
(скорее, с такого:
и осуществлением циклического сдвига вместо линейного).
Придётся для этого создать ещё один модуль:
Наконец, приведём полный код нашей наиболее укуренной версии этого преобразователя:
Эта штуковина синтезируется в 45 логических элементов. Если бы мы ужались ещё на один бит, то пришлось бы делать логику параллельной загрузки значения 0010 в счётчик, чтобы сигнал окончания пришёл вовремя. Кроме того, понадобился бы один дополнительный ГФ (LUT) для формирования значения 2-го бита младшего разряда, и мы бы пришли к 46 ЛЭ, поэтому я и не стал такой вариант предлагать.
1.4.3 Преобразователи кодов.
1.4.3. Преобразователи кодов
Для формирования цифр и знаков на семисегментных и матричных индикаторах и запуска шкальных индикаторов используют различные преобразователи кодов, иногда неправильно называемые дешифраторами. Существуют также микросхемы для преобразования двоичного кода в двоично-десятичный, и наоборот. Рассмотрим такие микросхемы.
ствии с рабочим током индикатора. Вход Е микросхемы может быть использован для гашения индикатора, которое происходит при подаче на этот вход лог. 1. Индикация осуществляется при лог. 0.
Микросхема КМ155ИД9 может быть использована и с обычными полупроводниковыми семисегментными индикаторами с общим анодом аналогично К155ПП5 (рис. 115). В отличие от использования микросхемы К155ПП5 не требуются ограничительные резисторы и добавляется возможность индикации знака «-» и буквы «Е».
Выходы микросхем выполнены с от-
крытым эмиттером и ограничительным резистором, обеспечивающим выходной ток для непосредственного подключения светодиодов между выходами и общим проводом. При работе одной микросхемы с восемью светодиодами высота «столбика» светящихся светодиодов будет на единицу больше десятичного эквивалента кода на входах 1,2,4.
При необходимости построения шкал с большим числом индицируемых уровней необходимо использовать соответствующее число микросхем К155ИД11 и дешифратор с большим числом выходов (К155ИД4 в соответствующем включении, К555ИД7, К155ИДЗ).
При необходимости можно соединять микросхемы КМ155ИД12 в соответствии с рис. 118 или 119, естественно, исключив цепи выводов Р и PI.
Если на вывод Е подать лог. 0, независимо от состояния всех остальных входов происходит гашение всех сегментов индикатора, подключенного к выходам микросхемы. Если на вывод Е подать лог. 1 или оставить его свободным, а на вход К (Контроль) подать лог. 0,
независимо от сигналов на других входах включаются все сегменты индикатора.
Наиболее интересный режим осуществляется в следующем случае:
Если нужно обеспечить контроль индикаторов в схеме рис. 121, на объединенные входы К всех микросхем можно подать лог. 0. Для
принудительного гашения всех индикаторов на рис. 121 независимо от входного кода на выводы Е всех микросхем можно подать лог. 0 от соответствующего числа элементов с открытым коллектором, например К555ЛН2.
Сочетание включенных сегментов при входных кодах, соответствующих числам 10-14, не соответствует никаким буквам или знакам, при входном коде 15 происходит гашение индикатора.
Для микросхемы К555ИД 18 максимальное напряжение, подводимое к выходам, находящимся в состоянии лог. 1,15 В, максимальный выходной ток в состоянии лог. 0-24 мА.
Двоично-десятичное кодирование
Калькулятор преобразует число из десятичное в двоичное, но записанное упакованным двоично-десятичным кодом, и наоборот.
После калькулятора Перевод дробных чисел из одной системы счисления в другую я думал, что тема с системами счисления уже закрыта. Но, как оказалось, еще нет.
Как я писал по ссылке выше, основная проблема при переводе дробных чисел из одной системы счисления в другую это потеря точности, когда, например, десятичное число 0.8 нельзя перевести в двоичное без погрешности.
Поскольку десятичные числа активно используются человеком, а двоичные — компьютером, этой проблемой в применении к двоичной и десятичной системам однажды уже озаботились какие-то светлые умы и придумали двоично-десятичное кодирование (binary coded decimal, BCD). Суть идеи проста — берем и для каждой десятичной цифры заводим байт. И в этом байте тупо пишем значение десятичной цифры в двоичном коде. Тогда число, например, 0.8 будет 0.00001000. Потом, правда, подумали еще, и решили, что раз уж верхняя часть байта всегда пустует (так как максимум 9 — это 1001), то давайте для каждой десятичной цифры заводить полубайт. И назвали это упакованным двоично-десятичным кодированием (packed BCD).
В упакованном кодировании наше 0.8 будет 0.1000, а какое-нибудь 6.75 будет 0110.01110101.
Прекрасная идея, конечно. Точность не теряется, человек может двоичные числа переводить в десятичные и наоборот прямо на лету, округлять можно, откидывая лишнее. Но как-то не получила она широкого распространения, потому как жизнь машинам она, наоборот, усложняла — и памяти для хранения чисел надо больше, и операции над числами реализовать сложнее. Так и осталась забавным курьезом, и я бы ничего о ней не знал, если бы пользователи не подсказали, что есть такая.
Ну и небольшой калькулятор по этому поводу — вводим либо десятичное число, либо двоичное, подразумевая, что это упакованный двоично-десятичный код, и получаем результат. Понятно, что все преобразования можно проделать и в уме, и в этом ее преимущество; но зачем же лишний раз мозги напрягать, верно?
Преобразователи кодов
На схемах микросхемы преобразователей обозначаются буквами X/Y. В отечественных сериях преобразователи имеют обозначения ПР.
Кроме того, надо учесть, что любые преобразования параллельных кодов, даже самые экзотические, могут быть легко реализованы на микросхемах постоянной памяти нужного объема. Обычно это намного удобнее, чем брать стандартные микросхемы преобразователей кодов.
Рис. 5. Микросхемы преобразователей кодов
Таблица 2. Таблица истинности преобразователя ПР6
Таблица 3. Таблица истинности преобразователя ПР7
Точно так же двоичный код без младшего разряда на входе ПР7 преобразуется в двоично-десятичный код без младшего разряда на выходе ПР7. Одна микросхема ПР7 может обрабатывать входные коды в диапазоне от 0 (двоичный код 000000) до 63 (код 111111). Младшие разряды входных кодов передаются на выход без обработки в обход микросхемы, так как они одинаковые как в двоичном, так и в двоично-десятичном кодах. Простейшие схемы включения одиночных микросхем ПР6 и ПР7 приведены на рис. 6.
Рис. 6. Простейшее включение одиночных преобразователей кода ПР6 и ПР7
Рис. 7. Преобразователь двоично-десятичного кода от 0 до 99 в двоичный код
Каскадировать преобразователи ПР6 и ПР7 для увеличения разрядности также несложно. Для преобразования двоично-десятичных кодов от 0 до 99 достаточно двух микросхем ПР6 (рис. 6.7), а для преобразования двоичных кодов от 0 до 255 требуется три микросхемы ПР7 (рис. 8). Если надо преобразовывать двоично-десятичные коды до 999, то понадобится 6 микросхем ПР6, а для преобразования двоичных кодов до 511 потребуется 4 микросхемы ПР7. На всех выходах микросхем необходимо включать нагрузочные резисторы.
Рис. 8. Преобразователь двоичного кода от 0 до 255 в двоично-десятичный код
Рис.9. Преобразователи входного кода в дополнение до 9 (а) и в дополнение до 10 (б)
Задержки преобразователей кодов примерно вдвое превосходят задержки логических элементов. Точные величины задержек надо смотреть в справочниках.
Преобразование двоичного кода в двоично-десятичный.
При преобразовании четырехразрядного двоичного числа в двоично-десятичное: числа до 9 включительно остаются без изменения.
Числа свыше 9, представляющие собой псевдотетрады, подвергаются коррекции.
Двоичные числа, содержащие более 4 разрядов, можно преобразовать
аналогичным образом. Для этого двоичное число, начиная со старшего разряда, «вдвигается» справа налево в двоично-десятичную разрядную сетку, как показано на рис. 6. Когда какая-либо единица пересекает границу между двоично-десятичными разрядами, возникает ошибка. Действительно, в случае двоичного числа разрядное значение этой единицы при сдвиге увеличивается с 8 до 16, тогда как для двоично-десятичного числа оно возрастает от 8 до 10. Поэтому на этом этапе двоично-десятичное число как бы уменьшается на 6. Следовательно, для коррекции необходимо прибавлять 6 к числу во всех случаях, когда единица пересекает границу между двоично-десятичными разрядами. К числу десятков надо прибавить 6, если единица перейдет в разряд сотен, и т.д.
Составленное таким образом двоично-десятичное число имеет правильное значение, однако оно может еще содержать псевдотетрады. Чтобы этого не было, возникающие псевдотетрады корректируют непосредственно после каждого шага сдвига, прибавляя 6 к соответствующей декаде с переносом 1 в следующую.
Рис. 6. Преобразование двоичного кода в двоично-десятичный,
в качестве примера взято число 218.
Вместо того чтобы прибавлять после сдвига 6, с тем же успехом можно перед сдвигом прибавлять 3. Необходимость такой коррекции можно также определить перед сдвигом. Если значение тетрады меньше или равно 4 =- 01002, то при последующем сдвиге не произойдет перехода единицы через границу между декадами и не возникнут псевдотетрады. Таким образом, такую тетраду можно будет без изменений сдвигать влево. Если значение тетрады перед сдвигом равно 5, 6 или 7, то также не произойдет перехода единицы через границу, поскольку старший разряд равен нулю. Однако при этом возникнут псевдотетрады: десять, двенадцать, четырнадцать или одиннадцать, тринадцать, пятнадцать (в зависимости от того, будет ли в младший разряд сдвинут нуль или единица). Следовательно, в этих случаях необходима коррекция псевдотетрад путем прибавления 3 перед сдвигом.
Если значение тетрады составляет 8 или 9, необходимо корректировать переход единицы через границу между декадами. Поэтому после каждого сдвига появляются правильные тетрады 6 или 7 либо 8 или 9. При такой коррекции псевдотетрад полученное значение каждой тетрады не может быть более 9. Этим исчерпываются все возможности, и мы получим таблицу коррекции 2.
Преобразование двоичного числа в соответствующее двоично-десятичное можно реализовать, сдвигая влево двоичное число, записанное в регистре сдвига, разделенном на четырехразрядные секции. Каждая секция должна включать корректирующий элемент, который преобразует содержание регистра перед каждым последующим сдвигом в соответствии с таблицей переключений 3.
Наряду с подобным способом реализации преобразования кодов с помощью схем с памятью можно использовать комбинационные схемы, в которых операция сдвига проводится с помощью соответствующей логики. Эта схема представлена на рис. 7. Вместо сдвига числа справа налево здесь слева направо
Таблица 2.Таблица переключений корректирующею элемента
для преобразования двоичною кода в двоично-десятичный
«сдвигателя» границы двоично-десятичных разрядов, а каждая полученная тетрада корректируется в соответствии с табл. 2. Следовательно, для «сдвига» разрядной сетки с помощью комбинационной схемы на каждую декаду и каждый шаг сдвига необходимо по одному корректирующему элементу. Эта схема несколько упрощается, если исключить те корректирующие элементы, ко входам которых подключено менее трех двоичных разрядов, поскольку
в этом случае коррекция не нужна. На рис. 7 приведена комбинационная схема для преобразования 8-разрядного двоичного числа. Эту схему легко распространить на любое число разрядов. Элементы, не используемые для преобразования 8-разрядного числа, показаны пунктиром. С помощью записанных здесь чисел можно проследить за процессом преобразования кода для примера, приведенного
Корректирующие комбинационные схемы поставляются в виде программируемых изготовителем микросхем ПЗУ емкостью 32 байта. В одном корпусе размещаются три корректирующих элемента (рис. 8). Так как, согласно рис. 7, младший разряд не подается на корректирующую схему, то с помощью одной ИС можно преобразовать 6-разрядное двоичное число, а для 8-разрядного числа нужны три таких ИС.
Дата добавления: 2015-12-08 ; просмотров: 2601 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ