FPGA之复数乘法器的设计

本文详细介绍了基于FPGA的复数乘法器设计原理,包括IP核参数设置,如操作数宽度和输出宽度的影响,并通过源文件展示了如何配置乘法器的输入和输出。在16位操作数宽度的配置下,实部和虚部分别从输出数据的特定位宽截取。仿真结果验证了设计的正确性。
摘要由CSDN通过智能技术生成

1 IP核设计原理

以下观点参考pg104文档得出
   根据pg104文档对于复数乘法的结果m_axis_dout_tdata的描述,如下图1.1所示。如果复数乘法器配置为具有 11 位的操作数宽度,那么数A的实部和A 的虚部的位宽都是11。
  复数乘法的结果的实部将占据m_axis_dout_tdata的位 10至 0,而第 15 位到 11 位将被忽略。
  复数乘法的结果的虚部将占据m_axis_dout_tdata的位 26至 16,而第 31位到 27位将被忽略。
在这里插入图片描述
在这里插入图片描述
  根据这样的推导,如果在IP核配置中,将AR/AI Operand width配置为16位,其余条件不变,如图1.2所示。打开该IP的coe文件,输出m_axis_dout_tdata的描述为.m_axis_dout_tdata(m_axis_dout_tdata) // output wire [79 : 0] m_axis_dout_tdata。可以看出,位宽为80位。由于输出数据的位宽为12位。所以,输出的实部取m_axis_dout_tdata的第11位到0位。输出的虚部取m_axis_dout_tdata的第51位到40位。
部分参数含义:
  (1)AR/AI Operand Width:选择第一个操作数宽度。 宽度适用于复数操作数的实部和虚部。
  (2)Multiplier Construction Options:允许选择使用 LUT(切片逻辑)来构建复数乘法器,或使用 DSP Slices。
  (3)Output Width:选择输出数据的实部和虚部的宽度。 这些值会自动初始化以提供全精度设置 A 和 B 操作数宽度时的乘积。复数的自然宽度乘法是输入宽度加一的总和(16*2+1)。如果输出宽度设置为小于这个自然宽度,最低有效位被截断或四舍五入,如由下一个 GUI 选择。

在这里插入图片描述
在这里插入图片描述

2 实现流程

2.1IP 参数设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 源文件

`timescale 1ns / 1ps


module my_Mult(
    input   clk     ,
    input   reset
    );

        
// I:real       Q:imag  
// 乘数a   
wire [15:0]  W_1I; 
wire [15:0]  W_1Q;    
assign W_1I=16'h7ffe; //15位的有符号数,
assign W_1Q=16'h0000;


// 乘数b   
wire  [15:0]  R_array;//阵元i信号的实部、虚部
wire  [15:0]  I_array;
assign R_array=16'h7fff; //real 实部
assign I_array=16'h0000;//imag 虚部



// 复数乘法器   
wire [79:0]   Temp_out;
wire  Mult_valid;  
cpMult16x6 cpMult16x6_1_inst (
     .aclk(clk),                         // input wire aclk
     .s_axis_a_tvalid(1'b1),             // input wire s_axis_a_tvalid
     .s_axis_a_tdata({W_1Q, W_1I}),      // input wire [31 : 0] s_axis_a_tdata
     .s_axis_b_tvalid(1'b1),            // input wire s_axis_b_tvalid
     .s_axis_b_tdata({I_array, R_array}),// input wire [31 : 0] s_axis_b_tdata
     
     .m_axis_dout_tvalid(Mult_valid),     // output wire m_axis_dout_tvalid
     .m_axis_dout_tdata(Temp_out)        // output wire [79 : 0] m_axis_dout_tdata
);

wire [31:0]   Ct_I;
wire [31:0]   Ct_Q;  

assign Ct_I = Temp_out[31:0];// 实部   为什么这样截位,见IP 的implementation details
assign Ct_Q = Temp_out[71:40];// 虚部
//assign Ct_I = Temp_out[31:16];// 实部   
//assign Ct_Q = Temp_out[71:56];// 虚部

 
 
 
endmodule


3 仿真结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值