17

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

4

5 回答 5

31

如果将 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 转换为有符号值,然后应用 resize,这将对有符号值进行符号扩展,最后将结果转换回 std_logic_vector。

转换相当长,但它的优点是它是通用的并且即使稍后更改目标长度也可以工作。

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

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

    slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length));
于 2013-07-03T17:19:57.333 回答
7
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;
于 2013-07-03T15:11:20.633 回答
4

如果 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;
于 2015-10-27T15:29:19.393 回答
3

为了完整起见,还有另一种偶尔有用的方法:

--  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;

对于我记得的向量,我不必这样做,但在更复杂的情况下我需要这样做:一次只将一些相关信号复制到更大、更复杂的记录中。

于 2013-07-04T11:00:12.870 回答
3

使用新发布的 VHDL-2019 标准,您可以做到

larger_vec <= extend(shorter_vec);

其中extend是一个函数定义如下

function extend(vec : std_logic_vector) return target_vec of std_logic_vector is
  variable result : std_logic_vector(target_vec'length - 1 downto 0) := (others => '0');
begin
  assert vec'length <= target_vec'length report "Cannot extend to shorter vector";
  result(vec'length - 1 downto 0) := vec;
  return result;
end function;

工具支持仍然有限,但至少有一个模拟器支持(Riviera-PRO)。

于 2020-06-28T14:02:35.660 回答