FPGA系列--Complex Multiplier IP核计算复数乘法

FPGA系列--Complex Multiplier IP核计算复数乘法
目录1. 背景2. Complex Multiplier IP核介绍2.1. Input and Implementation2.2. Configuration and Output2.3. Implementation details3. IP核接口4. 仿真1. 背景在数字信号处理领域中难免需要进行复数乘法或求信号功率等操作复数乘法形式如下所示若是求信号功率的话则将式公式表达为在FPGA中通常使用Complex Multiplier IP核完成上述操作。本文将详细讲解Complex Multiplier IP核的配置并对其进行仿真给出仿真代码以及仿真波形。2. Complex Multiplier IP核介绍Complex Multiplier IP核配置如下图所示。图 1 IP核的配置2.1. Input and ImplementationChannel A/B通道A/B通道A和B配置内容相同内容如下所示AR/AI(BR/BI) Operand Width通道输入位宽:设置输入实部、虚部的位宽。范围为8-63比特。注意IP核固定使用的是有符号数。Has TLAST标记“数据包”的边界通常在一组数据包的最后一个数据传输时拉高当系统必须要识别数据包边界时才启动这个使能比如数据以包的形式传输下游模块需要知道数据流何时结束才能开始处理通常不需要使用这一功能默认不使能。Has TUSER传输用户自定义的边带信息比如数据包的ID号、通道号、时间戳等IP核将A、B通道的TUSER输入拼接后直接作为输出TUSER{TUSER_B,TUSER_A}只有当数据包需要携带与每个数据绑定的自定义信息时才需要启用该功能通常不启用该功能默认不启用。TUSER Width用户自定义信息的位宽只有在启用Has TUSER时才需要配置默认不需要配置。若启用了Has TLAST及Has TUSER时IP核配置则如下图所示图 2 IP核的配置启用Has TLAST及Has TUSER时模块AXI接口会多出几根线通常仅进行复乘运算时不需要进行配置。Multiplier Construction配置乘法器结构内容如下Use LUTs使用逻辑资源(LUT/FF)进行复乘运算该方式需要消耗大量的LUT资源仅在DSP资源已经用尽或输入数据位宽很小时再使用。Use Mults使用DSP资源进行复乘运算默认推荐使用该种方式。Optimization Goal配置需要使用几个DSP只有在选择使用DSP资源时该选项才被激活内容如下Resource使用3个DSP默认选择该选项。Performance使用4个DSP多消耗一个DSP但是输出延迟低追求速度首选。Flow Control配置IP核输出流控制内容如下NonBlocking非阻塞只要IP核有输入就一直输出无论下游是否来得及处理信号默认选择该选项。Blocking阻塞选择此选项会在输出端多出一个AXI的tready信号的输入该信号由IP核下游产生可以使IP核暂停输出。2.2. Configuration and Output输出配置和IP核是实施细则如下图所示图 3 输出配置及实施细则图中右侧是IP核的配置与输出。Output Rounding输出舍入模式内容如下Truncate直接截断顾名思义就是直接舍弃多余的低位该模式最为简单不会产生额外的资源消耗但会产生直流偏置误差若对精度不敏感可使用此模式。Random Rounding随机舍入。该模式需配合随机数发生器使用适用于精度要求较高的场景中。该截位方式具体使用方法参考下述文章FPGA系列--IP核输出中不同截位方式的区别https://blog.csdn.net/MugTalksElectro/article/details/162818797?spm1011.2124.3001.6209Output Width输出位宽默认输出位宽输入A位宽输入B位宽1。Channel CTRL这里与上述输入端配置内容相同且当输入端使能了Has TLAST、Has TUSER时此处才需要进行配置。Core Latency输出延迟时钟配置内容如下。Latency Configuration时钟配置可选项包括Automatic自动、Manual手动两种模式默认为自动固定输出延迟为6个时钟周期。Mininum Latency最小延迟值Latency Configuration 为Manual模式时可对此值进行配置范围为0-55默认不需进行配置。Control Signals控制信号内容如下。ACLKEN时钟使能若勾选此选项则IP核新增一个时钟使能信号该信号高电平有效即高电平时IP核工作低电平时IP核暂停工作默认不勾选。ARESETn复位信号若勾选此选项则IP核新增一个复位信号该信号低电平有效即低电平时会使IP核复位内部寄存器赋值为初始状态恢复高电平时IP核正常工作默认不勾选。2.3. Implementation detailsIP核实施细则如图3左侧所示由图可见其消耗DSP资源为3个资源随输入位宽增大而增加。左侧下部分为输入输出接口其中输入为A、B两个通道输入数据为32位其中高16位为虚部、低16位为实部输出结果为73位其中[72:40]为虚部数据、[32:0]为实部数据。3. IP核接口名称方向位宽描述aclkinput[0:0]时钟s_axis_a_tvalidinput[0:0]通道A输入数据有效信号s_axis_a_tdatainput[31:0]通道A输入数据0-15位为实部数据、16-31位为虚部数据s_axis_b_tvalidinput[0:0]通道B输入数据有效信号s_axis_b_tdatainput[31:0]通道B输入数据0-15位为实部数据、16-31位为虚部数据m_axis_dout_tvalidoutput[0:0]输出数据有效信号m_axis_dout_tdataoutput[79:0]输出数据0-32位为实部数据、40-72位为虚部数据4. 仿真仿真代码如下所示。module TB_Complex_Multiplier(); reg Reset ;//定义复位 reg Main_CLK ;//定义时钟 //产生时钟信号 always #5 Main_CLK ~Main_CLK; initial begin Reset 1b1; Main_CLK 1b0; #20; Reset 1b0; end //系统计数器 reg [31:0] Cnt_sys; always ( posedge Main_CLK )begin if( Reset ) Cnt_sys 0; else if( Cnt_sys 32d199) Cnt_sys Cnt_sys 1b1; else Cnt_sys Cnt_sys; end reg Test_a_data_valid ;//测试数据A使能 reg [15:0] Test_a_data_i ;//测试数据A实部 reg [15:0] Test_a_data_q ;//测试数据A虚部 reg Test_b_data_valid ;//测试数据B使能 reg [15:0] Test_b_data_i ;//测试数据B实部 reg [15:0] Test_b_data_q ;//测试数据B虚部 always ( posedge Main_CLK or posedge Reset )begin if( Reset )begin Test_a_data_valid 1b0 ; Test_a_data_i 16d0; Test_a_data_q 16d0; Test_b_data_valid 1b0 ; Test_b_data_i 16d0; Test_b_data_q 16d0; end else if(Cnt_sys 99)begin Test_a_data_valid 1b1 ; Test_a_data_i -16d6195; Test_a_data_q -16d1825; Test_b_data_valid 1b1 ; Test_b_data_i 16d751; Test_b_data_q 16d725; end else begin Test_a_data_valid 1b0 ; Test_a_data_i 16d0; Test_a_data_q 16d0; Test_b_data_valid 1b0 ; Test_b_data_i 16d0; Test_b_data_q 16d0; end end //测试Complex_Multiplier wire [79:0] Test_dout ;//测试数据输出结果 wire Test_dout_valid ;//测试数据输出使能 Complex_Multiplier_ip U_Complex_Multiplier_ip ( .aclk ( Main_CLK ),// input wire aclk .s_axis_a_tvalid ( Test_a_data_valid ),// input wire s_axis_a_tvalid .s_axis_a_tdata ( {Test_a_data_q,Test_a_data_i} ),// input wire [31 : 0] s_axis_a_tdata .s_axis_b_tvalid ( Test_b_data_valid ),// input wire s_axis_b_tvalid .s_axis_b_tdata ( {Test_b_data_q,Test_b_data_i} ),// input wire [31 : 0] s_axis_b_tdata .m_axis_dout_tvalid ( Test_dout_valid ),// output wire m_axis_dout_tvalid .m_axis_dout_tdata ( Test_dout ) // output wire [79 : 0] m_axis_dout_tdata ); wire [32:0] Test_dout_i;//测试数据输出结果实部 wire [32:0] Test_dout_q;//测试数据输出结果虚部 assign Test_dout_i Test_dout[32: 0]; assign Test_dout_q Test_dout[72:40]; endmodule假设通道A的数据为-6195-1825i、通道B的数据为751725i则结果应为-3329320-5861950i仿真结果如下图所示。由图可知IP核在输入数据6个时钟周期后输出结果且结果值与理论相同。图 4 FPGA仿真结果