2014-11-19 2 views
0

Я потратил на это бесчисленное количество часов, и я, наконец, решил, что мне действительно нужна помощь. Я здесь.Преобразование 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 ...

+0

Добро пожаловать в StackOverflow! См. [«Если вопросы включают« теги »в их названиях?») (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны». –

+0

Существует также алгоритм Double Dabble, который показан в двух ответах почти на один и тот же заголовок вопроса. Fru1bat изменен: [Преобразование двоичного числа 8 бит в BCD в VHDL] (http://stackoverflow.com/questions/23871792/convert-8bit- двоично-номер к BCD-в-VHDL/23899472). Два показанных ответа также показывают, как выполнять потоковое выполнение строк и давать ссылки. Double Dabble использует последовательные сдвиги вместо деления и может быть проще в оборудовании. – user1155120

ответ

1

Нарушитель линия:

signal adj: unsigned(7 downto -2); 

Тип unsigned не поддерживает отрицательные диапазоны. Если вы хотите, чтобы обработать ваш результат в виде значения с фиксированной точкой с дробным компонентом, то есть несколько вариантов, в том числе:

  • Если у вас есть совместимые инструменты VHDL-2008, вы можете использовать ieee.fixed_pkg, который включает в себя тип ufixed, который делает поддерживает отрицательные индексы, как вы пытались сделать с unsigned.

  • Если вы не имеют VHDL 2008-совместимые инструменты, вы всегда можете просто управлять двоичную точку виртуально, то есть объявить:

    signal adj: unsigned(9 downto 0); 
    

    С помощью этого метода, вам нужно будет сделать бухгалтерию вручную, к сожалению. Однако, поскольку вы только выполняете умножения и деления, вам не нужно беспокоиться о выравнивании двоичной точки. Является ли значение «точным» или нет, зависит от того, как вы используете его в последующей логике.

+0

Существует также 3-й вариант, используя версию совместимости VHDL-93 пакетов: http://www.vhdl.org/fphdl/ – rick

 Смежные вопросы

  • Нет связанных вопросов^_^