このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
SystemC コード生成における複素数データ型のサポート
複素信号の宣言
次の MATLAB® コードは、いくつかのローカル複素変数を宣言しています。x
と y
は複素数の定数の代入により宣言し、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 複素信号変数 c
は c_re
および c_im
の各信号にフラット化されています。これらの信号はそれぞれ出力変数 Re_part
と Im_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 スクリプトでは、u1
と u2
はスカラー複素数で、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 セマンティクスに従って、ベクトルの各要素で独立して実行されます。