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

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

Сообщение 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 и бинарно, и в БКД выглядят одинаково.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7362
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение 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 - вроде, даже работает
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Родился
Сообщения: 16
Зарегистрирован: Сб дек 25, 2010 17:32:39

Сообщение 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 КБ) 460 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7362
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

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

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

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

Сообщение Meteor »

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

Сообщение vanek882 »

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

Сообщение Meteor »

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

Сообщение vanek882 »

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

Сообщение Meteor »

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

Сообщение uldemir »

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

Сообщение Meteor »

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

Сообщение vanek882 »

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

Сообщение Meteor »

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

Сообщение uldemir »

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

Сообщение Meteor »

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

Сообщение vanek882 »

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

Сообщение uldemir »

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

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

Сообщение 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
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

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

Сообщение uldemir »

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

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