複素数データ型のサポート
複素信号の宣言
次の 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 コードから生成された 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 複素信号変数 c
は c_re
および c_im
の各信号にフラット化されています。これらの信号はそれぞれ出力変数 Re_part
と Im_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 コード、または SystemVerilog コードでは、複素数ベクトルの端子は必ずフラットにされます。複素数ベクトル変数が入力と出力に存在する場合は、実数および虚数ベクトル成分はさらにスカラーにフラット化されます。
次のコードでは、u1
と u2
はスカラー複素数で、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;