2014-02-21 4 views
3

Я не могу понять, как принять абсолютное значение двух std_logic_vector (31 downto 0);Как взять абсолютное значение std_logic_vector? в VHDL

вот пример кода:

library ieee; 
use ieee.std_logic_1164.all;   
use ieee.numeric_std.all;  -- for the signed, unsigned types and arithmetic ops 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 
... 
... 
port ( 
    X: in std_logic_vector(31 downto 0); 
    Y: in std_logic_vector(31 downto 0); 
    F: out std_logic_vector(31 downto 0) 
); 

.. 
.. 
.. 
process(X,Y) 
begin 
F <= abs(X-Y)  --this doesnt work 
+0

Как бы вы вычислить абсолютное значение двоичного значения с помощью карандаша и бумаги? Просто повторите этот алгоритм в VHDL. –

+1

@JoeHass это правильный ответ, если вы учитесь, или если у вас есть что-то не встроенное, но использование встроенного 'abs' на стандартном' подписанном 'типе часто будет синтезироваться для лучшего кода во многих FPGA и Синтезаторы поставщика ASIC, которые в отдельном случае используют некоторые встроенные математические операции. – wjl

ответ

5

Ditch нестандартная библиотека включает в себя и использовать стандартный signed тип, который имеет встроенный abs функции:

library ieee; 
use ieee.std_logic_1164.all;   
use ieee.numeric_std.all; -- this is the standard package where signed is defined 
-- never use non-standard ieee.std_logic_arith and ieee.std_logic_unsigned 

... 

port ( 
    X: in std_logic_vector(31 downto 0); 
    Y: in std_logic_vector(31 downto 0); 
    F: out std_logic_vector(31 downto 0) 
); 

... 

process(X,Y) is 
begin 
    F <= std_logic_vector(abs(signed(X)-signed(Y))); 
end process; 

Это последнее у линии есть много [возможно ненужных] преобразований между std_logic_vector и signed, поэтому вы можете предпочесть этот интерфейс, если это имеет смысл с остальной частью вашего дизайна:

port ( 
    X: in signed(31 downto 0); 
    Y: in signed(31 downto 0); 
    F: out signed(31 downto 0) 
); 

Тогда последняя строка просто:

F <= abs(X-Y); 
+0

эй спасибо за ответ, когда я удаляю ieee.std_logic_unsigned_all; Я больше не могу добавлять или вычитать логические векторы. но когда я превращаю логические векторы в подписанные, они компилируются: D Я понятия не имею, почему – user14864

+2

Поскольку добавление std_logic_vectors не имеет смысла. Добавление подписей имеет смысл; добавление несогласия также имеет смысл; правильный ответ может зависеть от типа ... VHDL говорит о том, что именно вы хотите. –

+2

Без типа передачи нет возможности различать подписанные и неподписанные только с одним из каждого оператора добавления, умножения и подписания с использованием std_logic_vector. Это семиотическое различие, преодолевающее ограничение VHDL, а не аппаратное различие. Также (подписанный (X) -значный (Y)) передает ту же информацию в VHDL, обрабатывая эти сигналы std_logic_vector как подписанные. Сильные типы также иногда предотвращают ошибочную конструктивную спецификацию операций между подписанными и беззнаковыми целыми представлениями массивов std_ulogic. Мы можем получить педантичные возражения против чего-то, что разрешено в VHDL. – user1155120

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