Jump to content

    
Sign in to follow this  
Claw

Вывод на индикатор

Recommended Posts

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

 

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

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;

Share this post


Link to post
Share on other sites

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

q<="000" & d

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

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

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

Edited by Claw

Share this post


Link to post
Share on other sites
так а мне в 10й нужно...

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
Попыталась подключить библиотеку 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 я только читаю)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Не совсем понятент этот код...
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);

 

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

 

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

Edited by WingLion

Share this post


Link to post
Share on other sites
входной сигнал у меня имеет тип 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;

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this