用前导零填充std_logic_vector

时间:2015-03-18 12:58:10

标签: vhdl

好吧,我想做的是将一个较小的std_vector分配给一个较大的std_vector,用零填充高位。但是,我想要一些通用而简单的东西,并不需要知道每个第一个的大小。

例如,如果我有:

signal smaller_vec: std_logic_vector(15 downto 0);
signal larger_vec: std_logic_vector(31 downto 0);

我能做到:

larger_vec <= X"0000" & smaller_vec;

但是,如果我不知道较小矢量的大小,该怎么办?是否指定所有高位都为零。

我知道其他条款,但由于我需要几行,这会变得混乱:

larger_vec(smaller_vec'high downto 0) <= smaller_vec;
larger_vec(31 downto smaller_vec'length) <= (others => '0');

我以为我可以使用:

larger_vec <= "" & smaller_vec;

但这没有用。任何想法?

5 个答案:

答案 0 :(得分:7)

你试过了吗?

larger_vec <= (31 downto smaller_vec'length => '0') & smaller_vec;

在过去,我遇到了类似代码的综合工具问题,所以我使用了:

constant ZERO : std_logic_vector(larger_vec'range) := (others => '0');
. . .
larger_vec <= ZERO(31 downto smaller_vec'length) & smaller_vec;

答案 1 :(得分:2)

就我而言,我也喜欢以下内容:

larger_vec <= (smaller_vec'high downto 0 <= smaller_vec, others => '0');

我的最终答案在一行中。这是有效的,是吗?

答案 2 :(得分:1)

我遇到过类似的问题并尝试了以下方法:

larger_vec <= (larger_vec'range => '0') + shorter_vec;

您需要使用IEEE.std_logic_unsigned.all来实现此方法。

答案 3 :(得分:0)

James0的第二条帖子已经结束,但是<=的方向错误,请参见下面的 duolos 中的工作示例。我会编辑,但在撰写本文时,我的声誉还不够。

https://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_ease/聚合向量部分中,它说:

    variable V : std_logic_vector(7 downto 0);
  begin
    V := (others => '0');                    -- "00000000"
    V := ('1', '0', others => '0');          -- "10000000"
    V := (4 => '1', others => '0');          -- "00010000"
    V := (3 downto 0 => '0', others => '1'); -- "11110000"
    -- V := ("0000", others => '1');         -- illegal!
larger_vec <= (smaller_vec'high downto 0 => smaller_vec, others => '0');

应该工作。

答案 4 :(得分:0)

零填充或将任何std_logic_vector或std_logic截断为正好16位:

function pad16(x: std_logic_vector) 
    return std_logic_vector is 
    constant ZERO : std_logic_vector(15 downto 0) := (others => '0');
begin
    if (x'length < 16) then
        return ZERO(15 downto x'length) & x;
    else
        return x(15 downto 0);
    end if;
end function;

--overload function for single bit
function pad16(x: std_logic)
    return std_logic_vector is
    constant ZERO : std_logic_vector(15 downto 0) := (others => '0');
begin
    return ZERO(15 downto 1) & x;
end function;

-- USAGE:
--
--    reg16 <= pad16(X"3");