如何在VHDL中将8位转换为16位?

Pan*_*rao 13 vhdl

我有一个来自ADC转换器的输入信号是8位(std_logic_vector(7 downto 0)).我必须将它们转换为16位信号(std_logic_vector(15 downto 0)),以便对16位系统进行16位信号处理.

Mor*_*mer 28

如果8位值被解释为signed(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;
Run Code Online (Sandbox Code Playgroud)

因此,首先将std_logic_vector转换为有符号值,然后应用resize,将签名扩展签名值,结果最终转换回std_logic_vector.

转换相当冗长,但具有一般性的优点,即使稍后更改目标长度也能正常工作.

属性'length只返回slv_16 std_logic_vector的长度,因此为16.

对于无符号表示而不是signed,可以使用unsigned而不是signed使用此代码来完成:

    slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length));
Run Code Online (Sandbox Code Playgroud)

  • @Damo:仅当调整大小使无符号类型更长时,您的评论才是正确的。如果使用调整大小来使无符号或有符号类型变短,则 MSB 会被截断,这可能会改变值;如果使用调整大小来使有符号值变长,则使用符号 (MSB) 来填充,而不是 0。 (2认同)

Phi*_*ppe 6

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;
Run Code Online (Sandbox Code Playgroud)

  • 'x'代表"十六进制".所以x"00"基本上是"00000000"二进制. (2认同)