Я потратил на это бесчисленное количество часов, и я, наконец, решил, что мне действительно нужна помощь. Я здесь.Преобразование 8-битного двоичного кода в значение BCD
В основном, что я делаю, это 8-разрядный вход от АЦП, а затем преобразование этого значения в BCD в dsiplay на семисегментной плате. Так вот мой код до сих пор:
Library IEEE ;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned.all;
entity Voltage_LUT is
Port (scaled_value : in unsigned(7 downto 0);
true_value : out STD_LOGIC_VECTOR (15 downto 0)
);
end Voltage_LUT;
architecture Behavioral of Voltage_LUT is
function divide (a : UNSIGNED; b : UNSIGNED) return unsigned is
variable a1 : unsigned(a'length-1 downto 0):=a;
variable b1 : unsigned(b'length-1 downto 0):=b;
variable p1 : unsigned(b'length downto 0):= (others => '0');
variable i : integer:=0;
begin
for i in 0 to b'length-1 loop
p1(b'length-1 downto 1) := p1(b'length-2 downto 0);
p1(0) := a1(a'length-1);
a1(a'length-1 downto 1) := a1(a'length-2 downto 0);
p1 := p1-b1;
if(p1(b'length-1) ='1') then
a1(0) :='0';
p1 := p1+b1;
else
a1(0) :='1';
end if;
end loop;
return a1;
end divide;
signal adj: unsigned(7 downto -2); --adjusted to max 90
signal max_value: unsigned(7 downto 0):= "11111111" ; --adjusted to max 90
signal MSB_int: integer; -- integer form of MSB
signal LSB_int: integer; --integer form of LSB
signal adj2: unsigned(15 downto 0); --converted from adjusted integer to binary
signal LSB: STD_LOGIC_VECTOR (3 downto 0); --BCD for LSB
signal MSB: STD_LOGIC_VECTOR (3 downto 0); --BCD for MSB
signal OFF: STD_LOGIC_VECTOR (3 downto 0):="1010"; --defined to be segment OFF
signal V: STD_LOGIC_VECTOR (3 downto 0):="1011"; --defined to be letter V
begin
adj <= divide (scaled_value , max_value);
adj2 <= adj* "00001001" ;
end Behavioral;
По сути то, что я делаю, принимая 8 битное значение с АЦП затем выразить его в виде доли от максимального значения (которое 9), а затем я должен преобразовать это BCD ... но когда я бегу этот код я получаю сообщение об ошибке с указанием:
Линия 38: значение индекса < -2> вне диапазона [0: 2147483647] массива
Мне нужен ответ деления на двоичное число (с десятичной запятой s, например, 11001.110), так что было бы точным, когда я умножить на 9 ...
Добро пожаловать в StackOverflow! См. [«Если вопросы включают« теги »в их названиях?») (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны». –
Существует также алгоритм Double Dabble, который показан в двух ответах почти на один и тот же заголовок вопроса. Fru1bat изменен: [Преобразование двоичного числа 8 бит в BCD в VHDL] (http://stackoverflow.com/questions/23871792/convert-8bit- двоично-номер к BCD-в-VHDL/23899472). Два показанных ответа также показывают, как выполнять потоковое выполнение строк и давать ссылки. Double Dabble использует последовательные сдвиги вместо деления и может быть проще в оборудовании. – user1155120