Следующий 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));
В следующем примере кода показан VHDL® код, сгенерированный из предыдущего кода MATLAB.
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). Чтобы задать другой суффикс, задайте опцию Complex real part postfix (или соответствующий ComplexRealPostfix свойство CLI).
Воображаемые компоненты имеют то же имя что и исходный комплексный сигнал, суффиксированный строкой '_im' (например, x_im). Чтобы задать другой суффикс, задайте опцию Complex imaginary part postfix (или соответствующий 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 разбит на вещественную и мнимую части с таким же двухэлементным массивом.
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);
Комплексные векторные операции (+,-,* etc.,) аналогично разбиты на векторы действительной и мнимой частей. Операции выполняются независимо от элементов таких векторов, следуя семантике MATLAB для векторов комплексных чисел.
В коде VHDL и Verilog, сгенерированном из кода MATLAB, комплексные векторные порты всегда уплощены. Если на входах и выходах появляются комплексные векторные переменные, действительные и мнимые векторные компоненты далее уплощаются до скаляров.
В следующем коде 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;