わかりました。私がやりたいのは、小さい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;
しかし、これはうまくいきませんでした。何か案は?
やってみました:
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;
私の場合、私は次のものも好きです:
larger_vec <= (smaller_vec'high downto 0 <= smaller_vec, others => '0');
これが私の最終的な答えを1行で行います。これはうまくいきますね
私は同様の問題に遭遇し、以下を試しました:
larger_vec <= (larger_vec'range => '0') + shorter_vec;
このアプローチにはIEEE.std_logic_unsigned.all
を使用する必要があります。
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');
動作するはずです。
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");