Vivado IP核之复数浮点数累加 Floating-point

Vivado IP核之复数浮点数累加 Floating-point 快速实现多个数据相加


前言

        在FPGA中,常常都会设计到浮点数的累加,单纯的两个两个的相加会占用大量的时钟周期,无意中发现xilinx提供的Floating-point IP核具有累加功能,那这就非常方便了,可以节约大量的时钟周期。上次在网上搜了半天也没搜到累加IP核的配置,所以我打算将该IP核实现累加的操作过程记录下来。


提示:以下是本篇文章正文内容,均为作者本人原创,写文章实属不易,希望各位在转载时附上本文链接。

一、Floating-point IP核配置步骤

         上面这张图片是对那几个位数配置的说明,之所以要配置他们,是因为这个IP核不是直接累加浮点数,而是先转为定点数累加完成后再转回浮点数。图片当中有说可以配置它推荐的位数累加,虽然有转为定点数这个过程,但跟用单精度浮点数累加一样。也就是位数达到一定的要求下,能完完全全保证精度。此处我没有将位数配置那么高,配置的太高要的DSP资源就很多。

二、仿真

1.顶层代码

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/15 19:55:41
// Design Name: 
// Module Name: complex_accumulator_ip
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module complex_accumulator_ip(
    input                               clk                        ,
    input                               valid                      ,//执行加法有效信号
    input              [  31:0]         re_a                       ,//复数a的实部
    input              [  31:0]         im_a                       ,//复数a的虚部
    input                               last                       ,//累加最后一个数据标志信号
    output                              res_valid                  ,//结果有效信号
    output                              res_last                   ,//全部数据累加完标志信号
    output             [  31:0]         re_res                     ,//运算结果实部
    output             [  31:0]         im_res                      //运算结果虚部
    );
    
    
    
float_accumulator_ip u1_float_accumulator_ip(                       //实部累加
    .aclk                              (clk                       ),
    .s_axis_a_tvalid                   (valid                     ),
    .s_axis_a_tdata                    (re_a                      ),
    .s_axis_a_tlast                    (last                      ),
    .m_axis_result_tvalid              (res_valid                 ),
    .m_axis_result_tdata               (re_res                    ),
    .m_axis_result_tlast               (res_last                  ) 
);

float_accumulator_ip u2_float_accumulator_ip(                       //虚部累加
    .aclk                              (clk                       ),
    .s_axis_a_tvalid                   (valid                     ),
    .s_axis_a_tdata                    (im_a                      ),
    .s_axis_a_tlast                    (last                      ),
    .m_axis_result_tvalid              (                          ),
    .m_axis_result_tdata               (im_res                    ),
    .m_axis_result_tlast               (                          ) 
);

endmodule

2.仿真代码

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/15 19:56:43
// Design Name: 
// Module Name: complex_accumulator_ip_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module complex_accumulator_ip_tb();
reg                                     clk                        ;
reg                                     valid                      ;
reg                    [  31:0]         re_a                       ;
reg                    [  31:0]         im_a                       ;
reg                                     last                       ;
wire                   [  31:0]         re_res                     ;
wire                   [  31:0]         im_res                     ;
wire                                    res_valid                  ;
wire                                    res_last                   ;

always #1 clk=!clk;
initial begin clk=0;valid=0;last=0;re_a=0;im_a=0;
#1 last=0;
#2 re_a=32'b00111111100000000000000000000000;                       //1
     im_a=32'b00111111100000000000000000000000;                     //1
     valid=1;
#2 re_a=32'b01000000000000000000000000000000;                       //2
     im_a=32'b01000000000000000000000000000000;                     //2
#2 re_a=32'b01000000010000000000000000000000;                       //3
     im_a=32'b01000000010000000000000000000000;                     //3
     last=1;
#2 last=0;valid=0;
//#3 valid=0;
end

complex_accumulator_ip u1_complex_accumulator_ip(
    .clk                               (clk                       ),
    .last                              (last                      ),
    .valid                             (valid                     ),//执行加法有效信号
    .re_a                              (re_a                      ),//复数a的实部
    .im_a                              (im_a                      ),//复数a的虚部
    .re_res                            (re_res                    ),//运算结果实部
    .im_res                            (im_res                    ),//运算结果虚部
    .res_valid                         (res_valid                 ),
    .res_last                          (res_last                  ) 
);

endmodule

三、仿真结果分析

        仿真结果如图所示,可知该模块成功实现了3个复数浮点数的累加,结果输出延时26个时钟周期,和前面IP核配置的延时一致。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了如何利用IP核快速实现复数浮点数累加的基本操作,大家如果想用它来完成更多的数据累加,自己则要修改代码或者理解操作后自己编写代码。

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vivado IP核是Xilinx公司开发的一种可配置的IP核生成工具,可以用于快速生成各种功能的IP核。其中,MIPI D-PHY是一种用于手机、摄像头、显示器等设备的高速串行接口协议。 MIPI D-PHY测试可以通过使用Vivado IP核生成MIPI D-PHY核,并在FPGA平台上进行测试来完成。首先,我们需要在Vivado中创建一个新的项目,选择适当的FPGA型号和开发板。然后,通过Vivado IP核生成我们所需要的MIPI D-PHY核,并将其添加到我们的项目中。 在项目中添加MIPI D-PHY IP核后,我们可以对其进行配置,并将其连接到其他逻辑电路或外部设备。配置参数包括数据通道的位宽、时钟频率、电源电压等。我们还可以配置其他相关的设置,如时钟延迟、电源方案等。 完成配置后,我们可以执行仿真来验证MIPI D-PHY的功能。可以通过发送和接收模拟数据来模拟实际的通信过程,并检查传输的正确性和稳定性。仿真结果应该与预期的规格要相符。 完成仿真后,可以通过将设计生成比特流文件并下载到FPGA平台上来进行硬件验证。在FPGA上运行实际的测试数据,观察MIPI D-PHY的性能指标,例如误码率、数据传输速率等。这些指标应该与设计规格及MIPI D-PHY协议相符。 总结来说,通过使用Vivado IP核生成MIPI D-PHY核,并在FPGA平台上进行测试,我们可以验证MIPI D-PHY核的功能和性能,确保其正常工作并符合规格要

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迎风打盹儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值