这里要删除掉verilog/coregen目录下complex_multilier.v,并且替换掉verilog下的complex_mult.v。
这个模块实现的是复数的乘法,两个复数相乘,每个复数的实部和虚部都是16位,产生一个实部和虚部都是32位的复数。在vivado使用complex multiplier,其设置如下:
complex_mult.v代码如下:
module complex_mult
(
input clock,
input enable,
input reset,
input [15:0] a_i,
input [15:0] a_q,
input [15:0] b_i,
input [15:0] b_q,
input input_strobe,
output reg [31:0] p_i,
output reg [31:0] p_q,
output output_strobe
);
reg [31:0]a ,b;
wire [64-1:0] prod ;
reg input_strober ;
complex_multiplier mult_inst (
.aclk(clock), // input wire aclk
.s_axis_a_tvalid(input_strober), // input wire s_axis_a_tvalid
.s_axis_a_tdata(a), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(input_strober), // input wire s_axis_b_tvalid
.s_axis_b_tdata(b), // input wire [31 : 0] s_axis_b_tdata
.m_axis_dout_tvalid(output_strobe_w), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata(prod) // output wire [63 : 0] m_axis_dout_tdata
);
//如果时序不满足就采用时序电路 always @(posedge clock)
//如果时序满足就采用组合电路 always @(*)
//always @(posedge clock)
always @(*)
begin
input_strober <= input_strobe ;
output_strobe <= output_strobe_w ;
/*
if (reset) begin
p_i <= 0;
p_q <= 0;
{a,b}<=0;
end else
*/
if (enable) begin
a <={a_i,a_q};
b <={b_i,b_q};
p_i <= prod[63:63-31];
p_q <= prod[31:0];
end
end
endmodule
以下是complex_multiplier.xci文件和complex_mult.v的网盘连接
链接:https://pan.baidu.com/s/1v4WIgXzor6kLEouXQfMPJQ
提取码:0zm5