複素数データ型のサポート
複素信号の宣言
次の 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)。異なる接尾辞を指定するには、[複素数の実数部の接尾辞] オプション (またはそれに対応するComplexRealPostfixCLI プロパティ) を設定します。虚数成分は元の複素信号と同じ名前で、文字列
'_im'が接尾辞として付けられます (たとえばx_im)。異なる接尾辞を指定するには、[複素数の虚数部の接尾辞] オプション (またはそれに対応するComplexImagPostfixCLI プロパティ) を設定します。
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;