web-dev-qa-db-ja.com

VHDLで8ビットを16ビットに変換する方法

ADCコンバーターからの入力信号は8ビット(std_logic_vector(7 downto 0))です。それらを16ビット信号に変換する必要があります(std_logic_vector(15 downto 0))16ビットシステムへの16ビット信号処理用。

13
Panpetch Pinrao

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));
28
Morten Zilmer
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;
6
Philippe

完全を期すために、ときどき役立つ別の方法:

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

私は思い出すことができるベクトルに対してこれを行う必要はありませんでしたが、より複雑な状況下でこれを必要としていました:いくつかの関連する信号だけをより大きく、より複雑なレコードにコピーするのは一度でした。

2
Martin Thompson

これにより、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;
1
Guest