sazh 3 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба себя не похвалишь - никто не похвалит Про деление не знаю, но может скажете, зачем вам это надо, пока взрослые дяди не передрались? 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Claw 0 31 октября, 2011 Опубликовано 31 октября, 2011 (изменено) · Жалоба Не совсем понятент этот код... q<="000" & d здесь понятно, конкатенация, получаем единицы, а вот ,к примеру: q<=conv_std_logic_vector(conv_integer(d)+18, 8) Что здесь происходит? Мы же в итоге получаем 8ми разрядный вектор и каким образом выделить из него числа для десятков и единиц? Изменено 31 октября, 2011 пользователем Claw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Мы же в итоге получаем 8ми разрядный вектор и каким образом выделить из него числа для десятков и единиц? 30+18 = 48 (0011_0000) (hex 3_0) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Claw 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба так а мне в 10й нужно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба так а мне в 10й нужно... Вы на каждый 7 сегментный индикатор подаете 4х разрядный код. На старший - код 0011. На младший 0000. На обоих светится 30 при подаче десятичного 30 (1_1110). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Claw 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба ой,теперь дошло до деревяшки)))спасибо)))) Попыталась подключить библиотеку NUMERIC_STD и использовать вместо типа std_logic_vector unsigned как всё рухнуло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Попыталась подключить библиотеку 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 я только читаю) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Claw 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба да, с этими библиотеками всё работает, дело в том, что входной сигнал у меня имеет тип unsigned(если брать Ваш код, то это d),но этот сигнал идёт из другого блока(там я использовала numeric_std, и я никак не могу переделать его там в std_logic, потому что операции, которые там используются библиотекой std_logic_arith не поддерживаются),а c numeric_std этот код вылетает сразу с кучей ошибок... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WingLion 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 (изменено) · Жалоба Не совсем понятент этот код...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); и аналогично в других местах будет то же самое. Изменено 1 ноября, 2011 пользователем WingLion Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба входной сигнал у меня имеет тип 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Claw 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба Winglion,sazh, спасибо большое! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться