exponenta event banner

Поддержка сложных типов данных

Объявление сложных сигналов

Следующий код 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). Чтобы указать другой суффикс, установите опцию постфикс сложной вещественной части (или соответствующий 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);

ЛПВП Coder™ поддерживает эти конструкции, осуществляя доступ к соответствующим реальным и воображаемым компонентам сигнала в сгенерированном коде ЛПВП. В следующем примере кода Verilog ® переменная комплексного сигнала MATLABc сплющивается в сигналы 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 для векторов комплексных чисел. Как и скалярные комплексные числа, векторы комплексных чисел сплющены до векторов вещественных и мнимых частей в сгенерированном коде ЛПВП.

Например, в следующем сценарии 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;

См. также

|

Связанные темы