以下的MATLAB®代码声明了几个局部复杂变量。x
和y
由复常数赋值声明;z
是使用复杂的()
函数。
函数[x, y, z] = fcn%创建8位复杂常量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));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代码提供访问的领域的一个复杂的信号通过真正的()
和图像放大()
函数,如下面的代码所示。
函数[Re_part, Im_part] = fcn (c)%输出复数输入信号的实部和虚部Re_part =实际(c);Im_part =图像放大(c);
HDL Coder™支金宝app持这些结构,在生成的HDL代码中访问相应的实信号和虚信号成分。在下面的Verilog中®代码示例,MATLAB复信号变量c
是平化为信号吗c_re
和c_im
。每个信号都被赋值给输出变量Re_part
和Im_part
,分别。
模块Complex_To_Real_Imag (clk, clk_enable, reset, c_re, c_im, Re_part, Im_part);输入时钟;输入clk_enable;输入重置;输入(握)c_re;输入(握)c_im;输出(握)Re_part;输出(握)Im_part;//复输入信号的输出实部和虚部赋值Re_part = c_re;赋值给Im_part = c_im;
你可以为复数向量生成HDL代码。与标量复数一样,复数的向量在生成的HDL代码中被简化为实部和虚部的向量。
例如在下面的脚本中t
是基类型的复向量变量吗ufix4
和大小[1,2]
。
函数Y = fcn(u1, u2) t = [u1 u2];y = t + 1;
在生成的HDL代码中变量t
用相同的二元数组分解为实部和虚部。。
变量t_re: vector_of_unsigned4(0到3);变量t_im: vector_of_unsigned4(0到3);
复数的实部和虚部具有相同的向量类型ufix4
,如下面的代码所示。
TYPE vector_of_unsigned4 IS ARRAY (NATURAL RANGE <>) OF unsigned(3 DOWNTO 0); / /无符号数组
基于复数矢量的运算(+
,-
,*
等等,)同样被分解成实部和虚部的向量。对这些向量的元素进行独立的运算,遵循复数向量的MATLAB语义。
在VHDL和Verilog代码从MATLAB代码生成,复杂的矢量端口总是扁平化。如果在输入和输出上出现复向量变量,实向量和虚向量分量将进一步平化为标量。
在下面的代码中,u1
和u2
标量是复数和吗y
是一个复数向量。
函数Y = fcn(u1, u2) t = [u1 u2];y = t + 1;
这将在VHDL实体定义中生成以下端口声明。
实体_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);_MATLAB_Function结束;