двоично-десятичный преобразователь BCD

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

Код: Выделить всё

entity bin2bcd is
Port ( arg : in STD_LOGIC_VECTOR (7 downto 0); // 8 бит входные данные
bcd : out STD_LOGIC_VECTOR (9 downto 0); // 2+4+4 бит выходные данные
);
end bin2bcd;

architecture Behavioral of bin2bcd is
signal decoded : STD_LOGIC_VECTOR (8 downto 0); // промежуточный сигнал на 1 разряд короче выходного сигнала
.....
bcd <= decoded & arg(0); // на выход выдаем перекодированные данные и младший разряд аргумента неизмененный
а число 4 в двоичной системе будет 00000100 а в двоично-десятичном 0100 что ли?
как ни странно, да. Числа от 0 до 9 и бинарно, и в БКД выглядят одинаково.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

тока что забубенил - не знаю, будет ли работать, но Syntax check проходит:

Код: Выделить всё

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bin2bcd is
    Port ( arg : in  STD_LOGIC_VECTOR (7 downto 0);
           bcd : out  STD_LOGIC_VECTOR (9 downto 0));
end bin2bcd;

architecture Behavioral of bin2bcd is

signal digit1: STD_LOGIC_VECTOR (3 downto 0);
signal digit2: STD_LOGIC_VECTOR (3 downto 0);
signal digit3: STD_LOGIC_VECTOR (1 downto 0);
begin

digit1 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(arg) mod 10), 4);
digit2 <= CONV_STD_LOGIC_VECTOR((((CONV_INTEGER(arg) - CONV_INTEGER(digit1)) mod 100)/10), 4);
digit3 <= "00"; -- сами придумайте
bcd <= digit3 & digit2 & digit1 ;

end Behavioral;
Провел behavioral simulation - вроде, даже работает
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
vanek882
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Re: двоично-десятичный преобразователь BCD

Сообщение vanek882 »

что это за ошибка? начинаю писать код вот так

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity kyrsovprimer is
Port ( arg : in STD_LOGIC_VECTOR (7 downto 0);
bcd : out STD_LOGIC_VECTOR (9 downto 0));
end kyrsovprimer;

architecture Behavioral of kyrsovprimer is

signal digit1: STD_LOGIC_VECTOR (3 downto 0);
signal digit2: STD_LOGIC_VECTOR (3 downto 0);
signal digit3: STD_LOGIC_VECTOR (1 downto 0);
begin

digit1 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(arg) mod 10), 4);
digit2 <= CONV_STD_LOGIC_VECTOR((((CONV_INTEGER(arg) - CONV_INTEGER(digit1)) mod 100)/10), 4);
digit3 <= "0000111"; -- ñàìè ïðèäóìàéòå
bcd <= digit3 & digit2 & digit1 ;

end Behavioral;


рисунок с ошибкой пркриплён.
Вложения
ошибка.jpg
(44.1 КБ) 459 скачиваний
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

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

Код: Выделить всё

digit3 <= "0000111"; -- ñàìè ïðèäóìàéòå
я его (сигнал digit3) объявил как 2-х разрядный, потому как при 8-ми разрядных входных данных может принимать только значения 0, 1 или 2 - а для этих чисел достаточно 2-х разрядов. Вы же пытаетесь присвоить 7-миразрядное значение.
Кстати, мой коментарий подразумевает, что выражение для этой строчки вам все-же придется написать самостоятельно. можно, конечно, третью цифру считать, как остаток деления аргумента на 1000 и деленное на 100 по образу и подобию предыдущих двух строк (вам не кажется это смешным?) . С другой стороны, так как это число может принимать только 3 значения - может проще сделать сравнение: если меньше 100 то 0, иначе если меньше 200 то 1, иначе 2.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

Автор, почему проект под АХДЛ создаете?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
vanek882
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Re: двоично-десятичный преобразователь BCD

Сообщение vanek882 »

нет. нужно под VHDL
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

Для тех кто в танке, поясняю.
Дано сообщение об ошибке, в котором речь идет о несоответствии синтаксису AHDL, в то же время сам проект пишется на VHDL. Получается несрастание мозгов у МАКСа. Переделывайте проект по VHDL. (файл проекта у вас имеет расширение tdf, вместо vhd. что собственно наблюдается в сообщении)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
vanek882
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Re: двоично-десятичный преобразователь BCD

Сообщение vanek882 »

я сохранил это же файл под расширением vhd, сделал потом set project current file, но он всё равно выдаёт такую ошибку
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

С максом под VHDL не работал - только в квартусе. Может надо сперва сделать новый проект, в котором указать на каком языке будет описываться. Далее создать файл, в который скопировать код. При этом имя проекта и имя файла должны совпадать (в квартусе точно так надо).
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

topicstarter с зачеткой еще не пробегал? :))
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

Наверное оставили на второй год
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
vanek882
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Re: двоично-десятичный преобразователь BCD

Сообщение vanek882 »

кого оставили на второй год?
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

Точно не меня и не Uldemir'а :dont_know: - мы свое отучили
Последний раз редактировалось Meteor Пт дек 31, 2010 00:56:59, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

Да вот любопытство заело - курсач сдан или как?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение Meteor »

Сдается мне что это хвост... причем отложен он на следующий семестр
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
vanek882
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Re: двоично-десятичный преобразователь BCD

Сообщение vanek882 »

после каникул на доп.сессии буду сдавать, потому что не успел по госту оформить и распечатать)
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

А теперь серьёзно. Как преобразовать бинарное в БКД? Вариант с вычислениями остатков поведенчески симулируется, но совершенно не синтезируется. Пока написал компонент 74185 таблицей и port mapом соединил вместе, чтобы получить преобразование 8-ми битного двоичного в трёх разрядное БКД. Кстати, как в port map записать, что выход не используется и висит в воздухе? Пока я их подсоединил к сигналам и они потом сокращаются, но как-то не красиво выглядит.

p.s. Нашел у дигилента процедурку BinToBcdEncoder_nDigits. Похоже, она построена по принципу десятичной коррекции. Где-то когда-то я видел этот метод, но не могу вспомнить. В гугле нашел - это "метод левого сдвига".
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: двоично-десятичный преобразователь BCD

Сообщение RoboC »

может так?

Bin2BCD_16
;Переводит двоичное двухбайтовое число в BCD формат, принцип работы не знаю, я сдул этот
;кусок кода у кого-то в инете
movlw .16
movwf ctr
clrf bcd1
clrf bcd2
clrf bcd3
goto new_start
adjdec
movlw 0x33
addwf bcd1,f
addwf bcd2,f
addwf bcd3,f

movlw 0x03
btfss bcd1,3
subwf bcd1,f
btfss bcd2,3
subwf bcd2,f
btfss bcd3,3
subwf bcd3,f

movlw 0x30
btfss bcd1,7
subwf bcd1,f
btfss bcd2,7
subwf bcd2,f
btfss bcd3,7
subwf bcd3,f
new_start
rlf bin2,f
rlf bin1,f
rlf bcd3,f
rlf bcd2,f
rlf bcd1,f
decfsz ctr,f
goto adjdec
return
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: двоично-десятичный преобразователь BCD

Сообщение КРАМ »

RoboC писал(а):может так?

Bin2BCD_16
;Переводит двоичное двухбайтовое число в BCD формат, принцип работы не знаю, я сдул этот
;кусок кода у кого-то в инете....
Не иначе как из 526-ой аппноты микрочипа? :wink:
http://ww1.microchip.com/downloads/en/A ... 00526e.pdf
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: двоично-десятичный преобразователь BCD

Сообщение uldemir »

Да, похоже на этот принцип. Только мы тут обсуждаем аппаратные реализации, а не на микроконтроллерах. По какому принципу работает я разобрался - всё очень просто. умножение на два в БКД-логике. Единственное, что пока не ясно, какая из реализаций - табличная или вот эта со сдвигами и сумматорами в каких случаях оптимальнее - насколько много требуется макроячеек и LUTов на разных кристаллах.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»