Перейти к содержанию
    

себя не похвалишь - никто не похвалит

 

Про деление не знаю, но может скажете, зачем вам это надо, пока взрослые дяди не передрались?

entity bin2BCD is
port(d : in std_logic_vector(4 downto 0);
q : out std_logic_vector(7 downto 0));
end bin2BCD;

architecture beh of Bin2BCD is
begin
process(d)
begin
if (d >= 30) then
q<=conv_std_logic_vector(conv_integer(d)+18, 8);
elsif (d >= 20) then
q<=conv_std_logic_vector(conv_integer(d)+12, 8);
elsif (d >= 10) then
q<=conv_std_logic_vector(conv_integer(d)+6, 8);
else
q<="000" & d;
end if;
end process;
end beh;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятент этот код...

q<="000" & d

здесь понятно, конкатенация, получаем единицы, а вот ,к примеру:

q<=conv_std_logic_vector(conv_integer(d)+18, 8)

Что здесь происходит? Мы же в итоге получаем 8ми разрядный вектор и каким образом выделить из него числа для десятков и единиц?

Изменено пользователем Claw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мы же в итоге получаем 8ми разрядный вектор и каким образом выделить из него числа для десятков и единиц?

 

30+18 = 48 (0011_0000) (hex 3_0)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так а мне в 10й нужно...

Вы на каждый 7 сегментный индикатор подаете 4х разрядный код. На старший - код 0011. На младший 0000.

На обоих светится 30 при подаче десятичного 30 (1_1110).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ой,теперь дошло до деревяшки)))спасибо))))

 

Попыталась подключить библиотеку NUMERIC_STD и использовать вместо типа std_logic_vector unsigned как всё рухнуло...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попыталась подключить библиотеку NUMERIC_STD и использовать вместо типа std_logic_vector unsigned как всё рухнуло...

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; 
use ieee.std_logic_arith.all;

Но меня могут поправить. (На VHDL я только читаю)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да, с этими библиотеками всё работает, дело в том, что входной сигнал у меня имеет тип unsigned(если брать Ваш код, то это d),но этот сигнал идёт из другого блока(там я использовала numeric_std, и я никак не могу переделать его там в std_logic, потому что операции, которые там используются библиотекой std_logic_arith не поддерживаются),а c numeric_std этот код вылетает сразу с кучей ошибок...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятент этот код...
q<="000" & d

здесь понятно, конкатенация, получаем единицы, а вот ,к примеру:

q<=conv_std_logic_vector(conv_integer(d)+18, 8)

Что здесь происходит? Мы же в итоге получаем 8ми разрядный вектор и каким образом выделить из него числа для десятков и единиц?

 

Тут все просто. 5-разрядный код - это числа от 0 до 31.

 

И фактически делается та самая двоично-десятичная коррекция, но не для целого байта, а только для конкретного 5-битного числа и из конкретных диапазонов, выбранных if-ами.

И на выходе получается 8-битный код, половинки которого соответствуют нужным цифрам.

 

конкретно, числа из диапазона 30..31 надо превратить в 30h..31h, т.е. в 48..49 а это есть +18

 

п.с. modelsim может ругаться, если у него не все функции определены.

 

conv_std_logic_vector - вроде, из Xilinx-овских библиотек.

 

Oпределить можно достаточно просто. что-то вроде такого:

 

 

 

 

function conv_std_logic_vector(x : integer; razr : integer) return std_logic_vector is

 

variable temp : std_logic_vector(razr-1 downto 0);

 

begin

-- convert integer to logic_vector

temp <= (others => '0');

temp <= temp + x;

return temp;

 

end;

 

Не уверен только на счет выходного аргумента. Возможно будет ругаться за неопределенный вектор на выходе.

 

проще вместо q<=conv_std_logic_vector(conv_integer(d)+18, 8) сразу писать

 

q<="00000000" + (conv_integer(d)+18);

 

и аналогично в других местах

 

будет то же самое.

Изменено пользователем WingLion

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

входной сигнал у меня имеет тип unsigned

 

Обратитесь к своему преподавателю. Ибо теперь, понимая что Вам надо делать, Вы уперлись в строгую типизацию языка и Вам теперь до бесконечности будут рассказывать о возможных вариантах на VHDL, а конкретной схемной реализации Вы не получите. (На верилоге это делается левой ногой). VHDL - язык преподавателей.

Если клок использовать, то можно за n тактов (n - количество битов входного кода)

LIBRARY ieee;     -- U.Tietze - Ch.Schenk  page 321
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY bin_bcd IS PORT(
clk : IN std_logic;
bin : IN std_logic_vector(8 downto 0);
bcd : OUT std_logic_vector(11 downto 0);
enable_rd_bcd : OUT std_logic);
END bin_bcd;

ARCHITECTURE bin2bcd OF bin_bcd IS
signal ct_bit_bin : std_logic_vector(3 downto 0);
signal     bin_rg : std_logic_vector(8 downto 0);
signal     bcd_rg : std_logic_vector(11 downto 0);
signal         sum: std_logic_vector(11 downto 0);
BEGIN
sum(3 downto 0) <= bcd_rg(3 downto 0) + 3 when bcd_rg(3 downto 0) > 4 else bcd_rg(3 downto 0);
sum(7 downto 4) <= bcd_rg(7 downto 4) + 3 when bcd_rg(7 downto 4) > 4 else bcd_rg(7 downto 4);
sum(11 downto 8) <= bcd_rg(11 downto 8) + 3 when bcd_rg(11 downto 8) > 4 else bcd_rg(11 downto 8);
PROCESS (clk)
   BEGIN
IF (clk'EVENT AND clk = '1') THEN
IF ct_bit_bin = 0 THEN
enable_rd_bcd <= '1';
bcd <= bcd_rg;
bcd_rg <= X"000";
bin_rg <= bin;
ct_bit_bin <= "1001";
ELSE
enable_rd_bcd <= '0';
bcd_rg <= sum(10 downto 0) & bin_rg(8);
bin_rg <= bin_rg(7 downto 0) & '0';
ct_bit_bin <= ct_bit_bin - 1;
END IF;
END IF;
END PROCESS; 
END bin2bcd;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...