ADCコンバーターからの入力信号は8ビット(std_logic_vector(7 downto 0)
)です。それらを16ビット信号に変換する必要があります(std_logic_vector(15 downto 0
))16ビットシステムへの16ビット信号処理用。
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が符号付きの値に変換され、次にサイズ変更が適用され、符号付きの値が符号拡張され、最終的に結果がstd_logic_vectorに変換されます。
変換にはかなり時間がかかりますが、一般的であり、ターゲットの長さが後で変更されても機能するという利点があります。
属性 'lengthは、slv_16 std_logic_vectorの長さ、つまり16を単に返します。
符号付きではなく符号なしの表現の場合、unsigned
の代わりにsigned
を使用して行うことができるため、次のコードを使用します。
slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length));
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;
完全を期すために、ときどき役立つ別の方法:
-- 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;
私は思い出すことができるベクトルに対してこれを行う必要はありませんでしたが、より複雑な状況下でこれを必要としていました:いくつかの関連する信号だけをより大きく、より複雑なレコードにコピーするのは一度でした。
これにより、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;