web-dev-qa-db-ja.com

std_logic_vectorを先行ゼロで埋める

わかりました。私がやりたいのは、小さい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;

しかし、小さい方のベクトルのサイズがわからない場合はどうなりますか。すべての上位ビットがゼロであることを指定することはありましたか。

私はothers句について知っていますが、数行必要になるため、面倒になります。

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

私は使用できると思いました:

larger_vec <= "" & smaller_vec;

しかし、これはうまくいきませんでした。何か案は?

10
James0

やってみました:

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;
8
Jim Lewis

私の場合、私は次のものも好きです:

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

これが私の最終的な答えを1行で行います。これはうまくいきますね

2
James0

私は同様の問題に遭遇し、以下を試しました:

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

このアプローチにはIEEE.std_logic_unsigned.allを使用する必要があります。

1
am9417

James0の2番目の投稿は近かったが、<=が間違った方向を向いている。duolosの実際の例については以下を参照してください。編集しますが、この投稿の時点では十分な評判がありませんでした。

https://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_ease/Vectors inaggregatesセクションに次のように記載されています。

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

動作するはずです。

0
Rafe H

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

0
pico