Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

SystemC コード生成における複素数データ型のサポート

複素信号の宣言

次の 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 コードから生成された SystemC® コードを説明しています。

class fcnClass 
{ 
 public: 
  void fcn(sc_fixed<16,3> &x_re, sc_fixed<16,3> &x_im, sc_fixed<16,4> &y_re, 
           sc_fixed<16,4> &y_im, sc_fixed<16,4> &z_re, sc_fixed<16,4> &z_im) 
  { 
    x_re = sc_fixed<16,3>(1.0); 
    x_im = sc_fixed<16,3>(2.0); 
    y_re = sc_fixed<16,4>(3.0); 
    y_im = sc_fixed<16,4>(4.0); 
    z_re = sc_fixed<16,4>(5.0); 
    z_im = sc_fixed<16,4>(6.0); 
  } 
};

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

class fcnClass 
{ 
 public: 
  void fcn(sc_fixed<16,3> c_re, sc_fixed<16,3> c_im, sc_fixed<16,3> &Re_part, 
           sc_fixed<16,3> &Im_part) 
  { 
    /*  Output real and imaginary parts of complex input signal */ 
    Re_part = c_re; 
    Im_part = c_im; 
  } 
}; 

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

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

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

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

生成された SystemC コードでは、変数 t は同じ 2 要素の配列がある実数部と虚数部に分解されます。次の例が示すように、この複素数の実数部と虚数部には、データ型が ufix4 の同じベクトルがあります。

sc_uint<4> t_re[2]; 
sc_uint<4> t_im[2]; 

上記の MATLAB スクリプトでは、u1u2 はスカラー複素数で、y は複素数ベクトルです。これにより、SystemC コードで次の関数定義が生成されます。

void fcn(sc_uint<4> u1_re, sc_uint<4> u1_im, sc_uint<4> u2_re, sc_uint<4> 
           u2_im, sc_uint<5> (&y_re)[2], sc_uint<5> (&y_im)[2]) 
 

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

参考

|

関連するトピック