Следующий код 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);
Основанные на комплексном векторе операции (+
, -
, *
и т.д.) так же сломаны к векторам действительных и мнимых частей. Операции выполняются независимо на элементах таких векторов, после семантики 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;