Vivado IP核之复数浮点数除法 Floating-point

目录

前言

一、复数浮点数除法示例

二、Floating-point IP核配置步骤

三、整体思路

四、仿真

1.顶层代码

2.仿真代码

五、仿真结果分析

总结


前言

随着制造工艺的不断发展,现场可编程逻辑门阵列(FPGA)的集成度越来越高,应用也越来越广,其中在对数字信号进行处理时必然要用到一些数学处理类的IP核。最近正在研究空域自适应抗干扰技术研究的FPGA硬件实现,其中不免要用到一些IP核,今天介绍如何运用vivado当中的Floating-point这个IP核实现复数浮点数除法,希望对各位的学习能起到一定的帮助作用。


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

一、复数浮点数除法示例

为了后面仿真便于分析结果,在此我们就列举复数浮点数除法的例子,仿真时直接用下面的例子进行仿真,来验证仿真结果是否正确。

example:设浮点数a=32'h4057AE14+j32'h400F5C29,即a=3.37+j2.24,浮点数b=32'h3FE51EB8+j32'hC039999A,即b=1.79-j2.9,则a/b=32'hBD236E2F+32'h3F97E5C9,即a/b=-0.0399+j1.1867,注意该结果只保留了四位小数。

二、Floating-point IP核配置步骤

关于Floating-point IP核的加减乘除如何配置在前面的文章都已经讲解过,不会的同学看我前面的文章,此处不再赘述。

三、整体思路

根据公式我们先用六个并行乘法器计算ac,bd,ad,bc,cc,dd的结果,然后再用一个减法器和两个加法器并行计算bc-ad和ac+bd、cc+dd,最后再用两个除法器并行计算即可。在我的IP核配置中,乘法器IP核延时为8个时钟,加法器与减法器IP核延时为11个时钟,除法器IP核延时为28个时钟,为了确保万无一失,在我的代码中,对于数据有效信号Valid多给了一两个时钟。整个顶层代码中,计数cnt尤为重要,很多中间变量的变化都取决于cnt的数值。代码中我注释的地方也比较多,本次设计思路也不难,相信大家能看懂的。

四、仿真

1.顶层代码

建立一个顶层模块,命名为float_complex_div

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/26 12:30:21
// Design Name:
// Module Name: float_complex_div
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//计算公式: (a+bi)/(c+di)=( ac+bd+(bc-ad)i )/(c^2+b^2)module float_complex_div(input clk,                // 输入时钟信号        input rst_n,              //输入复位信号input start,              //输入开始信号input [31:0] re_a,        //输入被除数a的实部input [31:0] im_a,        //输入被除数a的虚部input [31:0] re_b,        //输入除数b的实部input [31:0] im_b,        //输入除数b的虚部output reg over,          //输出计算完成信号output reg [31:0] re_res, //输出计算结果的实部output reg [31:0] im_res  //输出计算结果的虚部);//reg definereg [5:0] cnt;            //过程计数标志reg valid1;               //乘有效信号 reg valid2;               //加减有效信号 reg valid3;               //除有效信号//wire definewire [31:0] result1;      //结果1wire [31:0] result2;      //结果2wire [31:0] result3;      //结果3wire [31:0] result4;      //结果4wire [31:0] result5;      //结果5wire [31:0] result6;      //结果6wire [31:0] result7;      //结果7wire [31:0] result8;      //结果8wire [31:0] result9;      //结果9wire [31:0] result10;     //结果10wire [31:0] result11;     //结果11always @(posedge clk or negedge rst_n)if(!rst_n)cnt<=0;else if(start==1)beginif(cnt<6'd56)    cnt<=cnt+1;elsecnt<=0;endelse if(start==0)cnt<=0;always @(posedge clk or negedge rst_n) if(!rst_n)  valid1<=0;else if(6'd0<cnt<=6'd9)valid1<=1;elsevalid1<=0;always @(posedge clk or negedge rst_n)if(!rst_n)  valid2<=0;else if(6'd12<cnt<=6'd24)valid2<=1;elsevalid2<=0; always @(posedge clk or negedge rst_n)if(!rst_n)  valid3<=0;else if(6'd24<cnt<=6'd53)valid3<=1;elsevalid3<=0;always @(posedge clk or negedge rst_n)if(!rst_n)  begin over<=0;re_res<=0;im_res<=0; endelse if(cnt==6'd55)begin  over<=1;re_res<=result10;im_res<=result11;  endelsebegin over<=0;re_res<=0;im_res<=0; endfloat_mul_ip u1_float_mul_ip(                       //乘法器1    计算ac.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(re_a),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(re_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result1));float_mul_ip u2_float_mul_ip(                       //乘法器2    计算bd.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(im_a),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(im_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result2));float_mul_ip u3_float_mul_ip(                       //乘法器3    计算ad.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(re_a),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(im_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result3));  float_mul_ip u4_float_mul_ip(                       //乘法器4    计算bc.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(im_a),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(re_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result4));   float_mul_ip u5_float_mul_ip(                       //乘法器5    计算c*c.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(re_b),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(re_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result5));    float_mul_ip u6_float_mul_ip(                       //乘法器6    计算d*d.aclk(clk),.s_axis_a_tvalid(valid1),.s_axis_a_tdata(im_b),.s_axis_b_tvalid(valid1),.s_axis_b_tdata(im_b),.m_axis_result_tvalid(),.m_axis_result_tdata(result6));                          float_sub_ip u1_float_sub_ip(                    //减法器   计算bc-ad.aclk(clk),.s_axis_a_tvalid(valid2),.s_axis_a_tdata(result4),.s_axis_b_tvalid(valid2),.s_axis_b_tdata(result3),.m_axis_result_tvalid(),.m_axis_result_tdata(result7));     float_add_ip u1_float_add_ip(                  //加法器1  计算ac+bd.aclk(clk),.s_axis_a_tvalid(valid2),.s_axis_a_tdata(result1),.s_axis_b_tvalid(valid2),.s_axis_b_tdata(result2),.m_axis_result_tvalid(),.m_axis_result_tdata(result8));float_add_ip u2_float_add_ip(                  //加法器2   计算cc+dd.aclk(clk),.s_axis_a_tvalid(valid2),.s_axis_a_tdata(result5),.s_axis_b_tvalid(valid2),.s_axis_b_tdata(result6),.m_axis_result_tvalid(),.m_axis_result_tdata(result9));                float_div_ip u1_float_div_ip(                  //除法器1   计算(ac+bd)/(cc+dd).aclk(clk),.s_axis_a_tvalid(valid3),.s_axis_a_tdata(result8),.s_axis_b_tvalid(valid3),.s_axis_b_tdata(result9),.m_axis_result_tvalid(),.m_axis_result_tdata(result10));  float_div_ip u2_float_div_ip(                  //除法器2   计算(bc-ad)/(cc+dd).aclk(clk),.s_axis_a_tvalid(valid3),.s_axis_a_tdata(result7),.s_axis_b_tvalid(valid3),.s_axis_b_tdata(result9),.m_axis_result_tvalid(),.m_axis_result_tdata(result11));     endmodule

2.仿真代码

建立一个仿真模块,命名为float_complex_div_tb,用来仿真顶层模块。

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/26 13:32:30
// Design Name:
// Module Name: float_complex_div_tb
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//module float_complex_div_tb();reg clk;             // 输入时钟信号        reg rst_n;           //输入复位信号reg start;           //输入开始信号reg [31:0] re_a;     //输入因数a的实部reg [31:0] im_a;     //输入因数a的虚部reg [31:0] re_b;     //输入因数b的实部reg [31:0] im_b;     //输入因数b的虚部wire over;           //输出计算完成信号wire [31:0] re_res;  //输出计算结果的实部wire [31:0] im_res;  //输出计算结果的虚部float_complex_div u1_float_complex_div(  //例化顶层模块.clk(clk),.rst_n(rst_n),.start(start),.re_a(re_a),.im_a(im_a),.re_b(re_b),.im_b(im_b),.over(over),.re_res(re_res),.im_res(im_res)
);
always #5 clk=~clk;
initial beginclk=1'b0;rst_n=1'b1;start=1'b0;
#5;     rst_n=1'b0;
#10;     rst_n=1'b1;start=1'b1;re_a=32'h4057ae14;im_a=32'h400f5c29;   re_b=32'h3fe51eb8;im_b=32'hc039999a;
#560    start=1'b0;endendmodule

五、仿真结果分析

仿真结果如图1所示,对比前面所列举复数浮点数除法的例子,可知该模块成功实现了复数浮点数的除法。该结果为32'hBD23891A+j32'h3F97E634,即-0.039925672+j1.1867127,如果保留四位小数就为-0.0399+j1.1867,这与本文开始介绍的例子是符合的。

图1 仿真结果

总结

本次介绍了复数浮点数的除法。

Vivado IP核之复数浮点数除法 Floating-point相关推荐

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

    Vivado IP核之复数浮点数累加 Floating-point 快速实现多个数据相加 目录 前言 一.Floating-point IP核配置步骤 二.仿真 1.顶层代码 2.仿真代码 三.仿真结 ...

  2. Vivado IP核被锁的解除方法

    在使用vivado进行开发时,我们经常会用到别人的工程,如果我们更改工程所使用的芯片型号(Vivado工程导入IP核的原工程和当前工程的FPGA开发板不一致),或者别人的工程所用到的vivado版本与 ...

  3. Vivado IP核解锁

    Vivado工程中有IP核被锁住的情况,主要原因有用新版本的Vivado去打开旧版本的工程.Vivado工程导入IP核的原工程和当前工程的FPGA开发板不一致等. 可以通过如下步骤解锁IP核: 1.T ...

  4. Vivado IP核Global 和 out of context per IP两种综合方式区别

    Vivado IP核Global 和 out of context per IP两种综合方式区别 两者区别 OOC生成的文件 注意.注意.注意 1.更新IP核参数时需注意 2.IP核中包括高阻态时需注 ...

  5. vivado IP核知识点学习

    OCC模式 OOC是Vivado开发套件提供的一项技术,该综合模式本质上是一种自底向上(bottom-up)的综合方法,该方法可用于IP.IPI(IP Integrator)的Block Design ...

  6. Vivado IP核使用 Ln(x)函数计算

    IP核设置 Ln(x)函数计算IP核设置为一个组合电路模块,不需要时钟 测试代码 `timescale 1ns / 1ps // // Company: // Engineer: // // Crea ...

  7. vivado IP核:ILA、时钟、RAM、FIFO

    ILA vivado工具集成了逻辑分析仪,ILA IP核用于替换外部的逻辑分析仪,添加探针来监控内部信号波形变化. 1)IP Catalog 2)搜索栏可搜索IP核,如创建FIFO.RAM等. 3)搜 ...

  8. 手把手教你打包一个自己的Vivado IP核

    写在前面 模块复用是逻辑设计人员必须掌握的一个基本功,通过将成熟模块打包成IP核,可实现重复利用,避免重复造轮子,大幅提高我们的开发效率. 接下来将之前设计的串口接收模块和串口发送模块打包成IP核,再 ...

  9. 【vivado IP核学习】DDS complier v6.0使用“SIN/COS LUT only”

    DDS complier v6.0使用 根据使用需求,设置dds格式为 "sin cos lut only",赛灵思官方dds IP的说明文档对该模式的描述如下: When con ...

最新文章

  1. 表达式必须是可修改的左值怎么解决_如何解决代码腐败的味道
  2. 【设计模式】享元模式
  3. Oracle XQuery 过滤XML查询SQL
  4. C#日期格式化(转)
  5. java 获取web目录结构_Intellij Idea Javaweb 目录结构及获取项目内资源
  6. java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵
  7. linux一款不错的linux系统清理工具
  8. 防止汽轮机严重超速的技术措施 22437
  9. 360腾讯计算机比赛,巅峰对决 腾讯电脑管家VS360详尽评测
  10. 驱动安装时数字签名无效
  11. CTDC 2017 首席技术官领袖峰会 | 技术、探索、创新
  12. python阶乘函数_python 阶乘函数
  13. 蚂蚁树林小游戏玩法介绍
  14. 微信开源C++Libco介绍与应用(二)
  15. linux磁盘配额步骤详细步骤,Linux磁盘配额命令及步骤.doc
  16. 【博学谷学习记录】超强总结,用心分享| 大数据之数仓及Hive介绍
  17. 分享本地html项目给其他人访问
  18. Java学习笔记-线程中countDown()使用
  19. dns dnsmasq容器化部署
  20. python 读excel每行替换_Python脚本操作Excel实现批量替换功能

热门文章

  1. word中html页面框架怎么删,word中插入的页面怎么删除
  2. 浅谈实体店用户运营心得
  3. 二,哞哞stm32外部中断感应灯项目
  4. 什么才是合格的系统交付-交付内容说明
  5. P4 开发实践 — NG-SDN Tutorial — Exercise 1: P4Runtime Basics
  6. 一句话简述border-box和content-box的区别
  7. 实战-Android 蓝牙文件分享
  8. 趣图:深度学习背后的数学 vs import keras
  9. Java基础语法-条件结构-switch条件结构
  10. 最新(2022年)EcoVadis奖牌的评分要求和资格标准