Как преобразовать 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;