背景
利用Verilog 和 vivado做FFT时,FFT算法中需要对中间结果乘旋转因子WNr,会有带有小数复数运算,利用Vivado 中Complex Multiplier ip核可以很好的解决这个运算,但是本人在使用过程中出现了小数点对应不齐的问题。
解决
输入和输出的位宽一定要匹配。
代码如下
`timescale 1ns/1ns
module complex(
input [11:0] A_real,
input [11:0] A_imag,
input [11:0] B_real,
input [11:0] B_imag,
output [24:0] C_real,
output [24:0] C_imag
);
reg clk;
wire [63:0] out;
// assign A_real = 12'd5;
// assign A_imag = 12'd0;
// assign B_real = 12'd7;
// assign B_imag = 12'd0;
assign A_real = 12'b000000000000;
assign A_imag = 12'b001011001100;
assign B_real = 12'b000000000000;
assign B_imag = 12'b000010110101;
assign C_real = out[56:32];
assign C_imag = out[24:0];
cmpy_0 u_cmpy_0 (
.aclk(clk), // input wire aclk
.s_axis_a_tvalid(1'b1), // input wire s_axis_a_tvalid
.s_axis_a_tdata({4'd0,A_imag,4'd0,A_real}), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(1'b1), // input wire s_axis_b_tvalid
.s_axis_b_tdata({4'd0,B_imag,4'd0,B_real}), // input wire [31 : 0] s_axis_b_tdata
// .m_axis_dout_tvalid(m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata(out) // output wire [79 : 0] m_axis_dout_tdata
);
initial begin
clk = 1;
end
always #5 clk = ~clk;
endmodule
运行截图如下