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

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

Сб дек 25, 2010 17:43:43

НА 8 входов подаётся 8-битовый двоичный код. в схеме исполmзуются 3 BCD схемы что преобразовывать числа от 0 до 255. на выходе должен быт двоично-десятичный код...

если вам нетрудно помогите пожалуйста написать код. не могу понять как связать эти три схемы BCD

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

Сб дек 25, 2010 17:59:06

Микросхема 155ПР6 к вашим услугам.

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

Сб дек 25, 2010 18:58:24

Для ПЛИС код?

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

Сб дек 25, 2010 19:12:05

А может для МК? Или для ПЛИС? Или совсем для ПЗУ?

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

Сб дек 25, 2010 23:51:32

для Плис!

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

Сб дек 25, 2010 23:54:50

BCD.jpg
схема рпеобразователя
(184.08 KiB) Скачиваний: 1048

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

Сб дек 25, 2010 23:55:48

и используются три микросхемы ПР7.

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

Вс дек 26, 2010 10:00:23

А какой код вы хотите увидеть? внутренний ПР7 или их соединений? внутренний - увы, просто ПЗУ. так что обычный case...when. А соединений - через port map. это на VHDL. или надо на каком другом языке? курсач, да?

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

Вс дек 26, 2010 13:36:08

нужен VHDL код. да курсач.

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

Вс дек 26, 2010 13:45:36

такой должен быть примерно?


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity CNT_BCD is
port (
CLK: in STD_LOGIC;
RESET: in STD_LOGIC;
ENABLE: in STD_LOGIC;
FULL: out STD_LOGIC;
BCD_U: out STD_LOGIC_VECTOR (3 downto 0);
BCD_D: out STD_LOGIC_VECTOR (3 downto 0);
BCD_H: out STD_LOGIC_VECTOR (3 downto 0);
BCD_T: out STD_LOGIC_VECTOR (3 downto 0) );
end CNT_BCD;

architecture CNT_BCD of CNT_BCD is

signal COUNTER_U: INTEGER range 0 to 9;
signal COUNTER_D: INTEGER range 0 to 9;
signal COUNTER_H: INTEGER range 0 to 9;
signal COUNTER_T: INTEGER range 0 to 9;
signal IS_9999: STD_LOGIC;

begin

process (CLK, RESET)
begin
if RESET='1' then
COUNTER_U <= 0; COUNTER_D <= 0;
COUNTER_H <= 0; COUNTER_T <= 0;
elsif CLK='1' and CLK'event then
if ENABLE = '1' and IS_9999 = '0' then
if COUNTER_U = 9 then COUNTER_U <= 0;
if COUNTER_D = 9 then COUNTER_D <= 0;
if COUNTER_H = 9 then COUNTER_H <= 0;
COUNTER_T <= COUNTER_T + 1;
else COUNTER_H <= COUNTER_H + 1; end if;
else COUNTER_D <= COUNTER_D + 1; end if;
else COUNTER_U <= COUNTER_U + 1; end if;
end if; end if;
end process;

BCD_U <= CONV_STD_LOGIC_VECTOR(COUNTER_U,4);
BCD_D <= CONV_STD_LOGIC_VECTOR(COUNTER_D,4);
BCD_H <= CONV_STD_LOGIC_VECTOR(COUNTER_H,4);
BCD_T <= CONV_STD_LOGIC_VECTOR(COUNTER_T,4);

IS_9999 <= '1' when (COUNTER_U = 9 and COUNTER_D = 9 and COUNTER_H = 9 and COUNTER_T = 9) else '0';

FULL <= IS_9999;

end CNT_BCD;

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

Вс дек 26, 2010 13:51:04

Ну а сказать где у вас затык сложно? У телепатов уже рождественские каникулы наступили. IMHO проще попросить у кого из группы, кто лучше шарит, чтобы он за определенную сумму знаний сделал вам этот курсач.

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

Вс дек 26, 2010 13:54:31

я же прикреплял схему самого преобразователя, там же всё нарисовано в max plus II

в группе вот именно что никто по этому VHDL не шарит.
у всех это проблема

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

Вс дек 26, 2010 14:37:33

Ну не такой код должен быть. Зачем тут счетчики?
Дешифратор должен работать без тактов (как я понимаю).
Следовательно, входы - шина 8 бит
Выходы: шина 12 бит.
Внутри надо "отделять" сотни, десятки и единицы друг от друга. Затем уже само преобразование.

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

Вс дек 26, 2010 14:51:24

Вот полгода назад решал такую же задачку в лоб - полный аналог ПР7 получился :-) Соединяете три таких модуля по вашей схеме и имеете (почему-то точка не вводится)
Код:
entity bin2bcd is
    Port ( arg : in  STD_LOGIC_VECTOR (5 downto 0);
           bcd : out  STD_LOGIC_VECTOR (3 downto 0);
           bcdh: out  STD_LOGIC_VECTOR (3 downto 0));
end bin2bcd;

architecture Behavioral of bin2bcd is
signal decoded : STD_LOGIC_VECTOR (5 downto 0);

begin
   process(arg)
   begin
      case arg(5 downto 1) is
         when "00000" => decoded <= "000000";
         when "00001" => decoded <= "000001";
         when "00010" => decoded <= "000010";
         when "00011" => decoded <= "000011";
         when "00100" => decoded <= "000100";
         when "00101" => decoded <= "001000";
         when "00110" => decoded <= "001001";
         when "00111" => decoded <= "001010";
         when "01000" => decoded <= "001011";
         when "01001" => decoded <= "001100";
         when "01010" => decoded <= "010000";
         when "01011" => decoded <= "010001";
         when "01100" => decoded <= "010010";
         when "01101" => decoded <= "010011";
         when "01110" => decoded <= "010100";
         when "01111" => decoded <= "011000";
         when "10000" => decoded <= "011001";
         when "10001" => decoded <= "011010";
         when "10010" => decoded <= "011011";
         when "10011" => decoded <= "011100";
         when "10100" => decoded <= "100000";
         when "10101" => decoded <= "100001";
         when "10110" => decoded <= "100010";
         when "10111" => decoded <= "100011";
         when "11000" => decoded <= "100100";
         when "11001" => decoded <= "101000";
         when "11010" => decoded <= "101001";
         when "11011" => decoded <= "101010";
         when "11100" => decoded <= "101011";
         when "11101" => decoded <= "101100";
         when "11110" => decoded <= "110000";
         when "11111" => decoded <= "110001";
         
         when others => decoded <= "------";
      end case;
   end process;
bcd <= decoded (2 downto 0) & arg(0);
bcdh <= "0" & decoded(5 downto 3);

end Behavioral;

С другой стороны - сделайте эту таблицу из 128-ми элементов и всё

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

Вс дек 26, 2010 18:05:30

код мне более менее понятен. Но на вход же подается 8 битовый двоичный код.

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

Вс дек 26, 2010 18:39:03

Вариант 1: Ну раз понятно, в чем проблемы отмасштабировать с 5 до 7 разрядов? младший разряд нет смысла обрабатывать.
Вариант 2: Я уже упомянул, что это соответствует вашей микросхеме 155ПР7 - можете командами port map соединить их в соотвествии с вашей схемой.
Вариант 3: Наверное изящнее выло бы написать формулы, типа младший БКД разряд это остаток от деления аргумента на 10... итд.

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

Вс дек 26, 2010 19:28:24

т.е например будет
begin
process(arg)
begin
case arg(5 downto 1) is
when "0000000" => decoded <= "0000000000";
на схеме же 10 выходов?
или как?
вот я тупой...

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

Вс дек 26, 2010 19:56:31

размерность не соблюдаете. если у вас аргумент 8-разрядный, то так и пишите case arg(7 downto 0) или (7 downto 1), если младший разряд в учет не берем. А что в библиотеках книжек нет?

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

Вс дек 26, 2010 20:12:25

я понял. как мне написать соответствие этих кодов.
спасибо вам.

а начать мне описывать

entity bin2bcd is
Port ( arg : in STD_LOGIC_VECTOR (5 downto 0);
bcd : out STD_LOGIC_VECTOR (3 downto 0);
bcdh: out STD_LOGIC_VECTOR (3 downto 0));
end bin2bcd;

architecture Behavioral of bin2bcd is
signal decoded : STD_LOGIC_VECTOR (5 downto 0);

begin
process(arg)
begin
case arg(5 downto 1) is

или что здесь изменить, исходя что код 8 разрядный

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

Вс дек 26, 2010 20:28:49

а число 4 в двоичной системе будет 00000100 а в двоично-десятичном 0100 что ли?
Тема закрыта