Как преобразовать 8 бит в 16 бит в VHDL?
у меня есть входной сигнал от преобразователя АЦП, 8 бит (std_logic_vector(7 downto 0)
). Я должен преобразовать их в 16-битный сигнал (std_logic_vector(15 downto 0
)) для обработки сигнала 16 битов к системе 16 битов.
4 ответов
если 8-битное значение интерпретируется как подписанное (дополнение 2), то общий и стандартный метод преобразования VHDL должен использовать библиотеку IEEE numeric_std:
library ieee;
use ieee.numeric_std.all;
architecture sim of tb is
signal slv_8 : std_logic_vector( 8 - 1 downto 0);
signal slv_16 : std_logic_vector(16 - 1 downto 0);
begin
slv_16 <= std_logic_vector(resize(signed(slv_8), slv_16'length));
end architecture;
Итак, сначала std_logic_vector преобразуется в подписанное значение, затем применяется изменение размера, которое будет подписывать расширение подписанного значения, и результат, наконец, преобразуется обратно в std_logic_vector.
преобразование довольно длинное, но имеет преимущество что оно вообще и работает даже если целевая длина изменяется позже.
длина атрибута просто возвращает длину slv_16 std_logic_vector, таким образом 16.
для неподписанного представления вместо подписанного это можно сделать с помощью unsigned
вместо signed
, таким образом с помощью этого кода:
slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length));
architecture RTL of test is
signal s8: std_logic_vector(7 downto 0);
signal s16: std_logic_vector(15 downto 0);
begin
s16 <= X"00" & s8;
end;
для полноты картины, еще один способ, который иногда полезен:
-- Clear all the slv_16 bits first and then copy in the bits you need.
process (slv_8)
begin
slv_16 <= (others => '0');
slv_16(7 downto 0) <= slv_8;
end process;
мне не приходилось делать это для векторов, которые я могу вспомнить, но мне это было нужно при более сложных обстоятельствах: копирование всего нескольких релевантных сигналов в большую, более сложную запись было один раз.
Это обрабатывает преобразование без необходимости редактирования ширины нулей, если изменяется std_logic_vector:
architecture RTL of test is
signal s8: std_logic_vector(7 downto 0);
signal s16: std_logic_vector(15 downto 0) := (others => '0');
begin
s16(s8'range) <= s8;
end;