Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

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

Вс дек 26, 2010 20:31:58

Код:
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 и бинарно, и в БКД выглядят одинаково.

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

Вс дек 26, 2010 20:57:44

тока что забубенил - не знаю, будет ли работать, но 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 - вроде, даже работает

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

Пн дек 27, 2010 21:34:59

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

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 KiB) Скачиваний: 416

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

Пн дек 27, 2010 21:57:21

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

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

Пн дек 27, 2010 22:23:40

Автор, почему проект под АХДЛ создаете?

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

Вт дек 28, 2010 11:02:06

нет. нужно под VHDL

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

Вт дек 28, 2010 12:16:50

Для тех кто в танке, поясняю.
Дано сообщение об ошибке, в котором речь идет о несоответствии синтаксису AHDL, в то же время сам проект пишется на VHDL. Получается несрастание мозгов у МАКСа. Переделывайте проект по VHDL. (файл проекта у вас имеет расширение tdf, вместо vhd. что собственно наблюдается в сообщении)

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

Вт дек 28, 2010 12:27:45

я сохранил это же файл под расширением vhd, сделал потом set project current file, но он всё равно выдаёт такую ошибку

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

Вт дек 28, 2010 12:41:05

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

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

Чт дек 30, 2010 20:40:07

topicstarter с зачеткой еще не пробегал? :))

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

Чт дек 30, 2010 21:58:43

Наверное оставили на второй год

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

Чт дек 30, 2010 23:03:57

кого оставили на второй год?

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

Чт дек 30, 2010 23:50:35

Точно не меня и не Uldemir'а :dont_know: - мы свое отучили
Последний раз редактировалось Meteor Пт дек 31, 2010 00:56:59, всего редактировалось 1 раз.

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

Пт дек 31, 2010 00:04:33

Да вот любопытство заело - курсач сдан или как?

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

Пт дек 31, 2010 00:58:53

Сдается мне что это хвост... причем отложен он на следующий семестр

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

Пт дек 31, 2010 02:15:56

после каникул на доп.сессии буду сдавать, потому что не успел по госту оформить и распечатать)

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

Ср май 30, 2012 20:16:37

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

p.s. Нашел у дигилента процедурку BinToBcdEncoder_nDigits. Похоже, она построена по принципу десятичной коррекции. Где-то когда-то я видел этот метод, но не могу вспомнить. В гугле нашел - это "метод левого сдвига".

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

Сб июн 02, 2012 09:57:23

может так?

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

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

Сб июн 02, 2012 10:08:14

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

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

Не иначе как из 526-ой аппноты микрочипа? :wink:
http://ww1.microchip.com/downloads/en/A ... 00526e.pdf

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

Сб июн 02, 2012 10:21:12

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