Main Content

複素数データ型のサポート

複素信号の宣言

次の MATLAB® コードは、いくつかのローカル複素変数を宣言しています。xy は複素数の定数の代入により宣言し、z は、関数 complex() を使用して作成しています。

function [x,y,z] = fcn

% create 8 bit complex constants
x = uint8(1 + 2i);
y = uint8(3 + 4j);
z = uint8(complex(5, 6));

次のコードの例では、前出の MATLAB コードから生成された VHDL® コードを説明しています。

ENTITY complex_decl IS
    PORT (
        clk : IN std_logic; 
        clk_enable : IN std_logic; 
        reset : IN std_logic;
        x_re : OUT std_logic_vector(7 DOWNTO 0);
        x_im : OUT std_logic_vector(7 DOWNTO 0);
        y_re : OUT std_logic_vector(7 DOWNTO 0);
        y_im : OUT std_logic_vector(7 DOWNTO 0);
        z_re : OUT std_logic_vector(7 DOWNTO 0);
        z_im : OUT std_logic_vector(7 DOWNTO 0));
END complex_decl;
 
 
ARCHITECTURE fsm_SFHDL OF complex_decl IS
 
BEGIN
    x_re <= std_logic_vector(to_unsigned(1, 8));
    x_im <= std_logic_vector(to_unsigned(2, 8));
    y_re <= std_logic_vector(to_unsigned(3, 8));
    y_im <= std_logic_vector(to_unsigned(4, 8));
    z_re <= std_logic_vector(to_unsigned(5, 8));
    z_im <= std_logic_vector(to_unsigned(6, 8));
END fsm_SFHDL;

この例で示されているとおり、MATLAB コードで宣言されている複素数の入力、出力、ローカル変数は実信号と虚信号に拡張されます。これらの派生信号の命名規則は次のとおりです。

  • 実数成分は元の複素信号と同じ名前で、既定の文字列 '_re' が接尾辞として付けられます (たとえば x_re)。異なる接尾辞を指定するには、[複素数の実数部の接尾辞] オプション (またはそれに対応する ComplexRealPostfix CLI プロパティ) を設定します。

  • 虚数成分は元の複素信号と同じ名前で、文字列 '_im' が接尾辞として付けられます (たとえば x_im)。異なる接尾辞を指定するには、[複素数の虚数部の接尾辞] オプション (またはそれに対応する ComplexImagPostfix CLI プロパティ) を設定します。

MATLAB コードで宣言された複素変数は、プログラム全体を通して複素数のままとなります。

複素信号と実信号の間での変換

MATLAB コードでは、次のコードのように、関数 real() と関数 imag() により複素信号のフィールドにアクセスできます。

function [Re_part, Im_part]= fcn(c)
% Output real and imaginary parts of complex input signal
 
Re_part = real(c);
Im_part = imag(c);

HDL Coder™ は、生成された HDL コード内の対応する信号の実数部と虚数部にアクセスする構成をサポートしています。次の Verilog® コードの例では、MATLAB 複素信号変数 cc_re および c_im の各信号にフラット化されています。これらの信号はそれぞれ出力変数 Re_partIm_part に代入されます。

module Complex_To_Real_Imag (clk, clk_enable, reset, c_re, c_im, Re_part, Im_part );

    input clk;
    input clk_enable;
    input reset;
    input [3:0] c_re;
    input [3:0] c_im;
    output [3:0] Re_part;
    output [3:0] Im_part;

    // Output real and imaginary parts of complex input signal
    assign Re_part = c_re;
    assign Im_part = c_im;

複素数のベクトルのサポート

複素数のベクトルに対して、HDL コードを生成することができます。スカラー複素数と同様、複素数のベクトルは生成された HDL コードで実数部および虚数部のベクトルにフラット化されます。

たとえば、次のスクリプトの t は、基本データ型が ufix4 でサイズが [1,2] の複素数ベクトル変数です。

function y = fcn(u1, u2)
 
t = [u1 u2];
y = t+1;

生成された HDL コードでは、変数 t は同じ 2 要素の配列がある実数部と虚数部に分解されます。

VARIABLE t_re : vector_of_unsigned4(0 TO 3);
VARIABLE t_im : vector_of_unsigned4(0 TO 3);

次の例が示すように、この複素数の実数部と虚数部には、データ型が ufix4 の同じベクトルがあります。

TYPE vector_of_unsigned4 IS ARRAY (NATURAL RANGE <>) OF unsigned(3 DOWNTO 0);

複素数ベクトルによる演算 (+-* など) も同様に実数部と虚数部のベクトルに分解されます。演算は複素数のベクトルの MATLAB セマンティクスに従って、ベクトルの各要素で独立して実行されます。

MATLAB コードから生成された VHDL コードと Verilog コードのいずれでも、複素数ベクトルのポートは必ずフラットにされます。複素数ベクトル変数が入力と出力に存在する場合は、実数および虚数ベクトル成分はさらにスカラーにフラット化されます。

次のコードでは、u1u2 はスカラー複素数で、y は複素数ベクトルです。

function y = fcn(u1, u2)
 
t = [u1 u2];
y = t+1;

これにより、VHDL エンティティ定義で次の端子宣言が生成されます。

ENTITY _MATLAB_Function IS
    PORT (
        clk : IN std_logic; 
        clk_enable : IN std_logic; 
        reset : IN std_logic;
        u1_re : IN vector_of_std_logic_vector4(0 TO 1);
        u1_im : IN vector_of_std_logic_vector4(0 TO 1);
        u2_re : IN vector_of_std_logic_vector4(0 TO 1);
        u2_im : IN vector_of_std_logic_vector4(0 TO 1);
        y_re : OUT vector_of_std_logic_vector32(0 TO 3);
        y_im : OUT vector_of_std_logic_vector32(0 TO 3));
END _MATLAB_Function;

参考

|

関連するトピック