FPGA实现全流水arccos,arcsin,任意次开方操作

  • 项目背景
  • 任意次开方根操作,单浮点精度,流水线操作
  • acos 和 asin 的计算,定点操作,流水线操作
  • 一定要关注点赞加收藏啊

项目背景

因为算法需要降低难度,所以对算法进行了调整,调整过后需要使用arccos,arcsin,三次开平方根操作,所以查找资料编写了一下IP,用于使用,希望能帮到大家,如果对你有帮助请点赞,关注加收藏啊。

任意次开方根操作,单浮点精度,流水线操作

原理:就是对输入数据进行指数和对数变换,将开方根操作改成指数,对数和乘法运算,有因为ln是有输入范围的,所以需要先对输入数据进行sign判断。公式如下

module cubicroot #(yinzi = 32'h3EAAAAAB    //开根号因子,对于三次开方根 = 1/3 ;
)
(
/*
模块功能: root
任意幂次开方根备注:
1.纯浮点计算
2.流水线计算
*/// Systeminput clk,input rst_n,// Inputinput din_en,input [31:0] din,input din_last,     // 略// Output output dout_en,output [31:0] dout,output dout_last    //略);//--------------- Step0 判断正负值----------------
reg din_en_r0 = 0;
reg [31:0] din_r0 = 0;
always @ (posedge clk)begindin_en_r0 <= din_en;din_r0 <= din;endreg [1:0] result=0;// 0:表示输入为0; 1:表示输入为正数; 2:表示输入为负数
always @ (posedge clk) beginif(din_en)beginif(din == 0)beginresult <= 0;endelse if(din[31] == 0)beginresult <= 1;endelsebeginresult <= 2;endendend//----------------Step1  取log|x|-------------------
wire dout_log_en;
wire [31:0] dout_log;
reg [1:0] result_r1 [22:0];
integer i;
always @ (posedge clk)beginfor (i=0;i<22;i=i+1)beginresult_r1[i+1] <=result_r1[i];endresult_r1[0] <= result;end//23延迟
floating_log log (.aclk(clk),                                  // input wire aclk.s_axis_a_tvalid(din_en_r0),            // input wire s_axis_a_tvalid.s_axis_a_tready(),            // output wire s_axis_a_tready.s_axis_a_tdata({1'b0,din_r0[30:0]}),              // input wire [31 : 0] s_axis_a_tdata.m_axis_result_tvalid(dout_log_en),  // output wire m_axis_result_tvalid.m_axis_result_tready(1'b1),  // input wire m_axis_result_tready.m_axis_result_tdata(dout_log)    // output wire [31 : 0] m_axis_result_tdata
);
wire [1:0] result_log = result_r1[22];//---------------Step 取1/3*log|x|----------------
wire dout_mul_en;
wire [31:0] dout_mul;
reg [1:0] result_r3 [6:0];
integer k;
always @ (posedge clk)beginfor (k=0;k<6;k=k+1)beginresult_r3[k+1] <=result_r3[k];endresult_r3[0] <=  result_log;endfloating_mul your_instance_name (.aclk(clk),                                  // input wire aclk.s_axis_a_tvalid(dout_log_en),            // input wire s_axis_a_tvalid.s_axis_a_tready(),            // output wire s_axis_a_tready.s_axis_a_tdata(dout_log),              // input wire [31 : 0] s_axis_a_tdata.s_axis_b_tvalid(dout_log_en),            // input wire s_axis_b_tvalid.s_axis_b_tready(),            // output wire s_axis_b_tready.s_axis_b_tdata(yinzi),              // input wire [31 : 0] s_axis_b_tdata             // 1/3.m_axis_result_tvalid(dout_mul_en),  // output wire m_axis_result_tvalid.m_axis_result_tready(1'b1),  // input wire m_axis_result_tready.m_axis_result_tdata(dout_mul)    // output wire [31 : 0] m_axis_result_tdata
);
wire [1:0] result_mul = result_r3[6];//----------------Step3 取e.^(1/3*log|x|)---------------
wire dout_en_e;
wire [31:0] dout_e;
reg [1:0] result_r2 [20:0];
integer j;
always @ (posedge clk)beginfor (j=0;j<20;j=j+1)beginresult_r2[j+1] <=result_r2[j];endresult_r2[0] <= result_mul;end//21 延迟
floating_exponential exponeetial(.aclk(clk),                                  // input wire aclk.s_axis_a_tvalid(dout_mul_en),            // input wire s_axis_a_tvalid.s_axis_a_tready(),            // output wire s_axis_a_tready.s_axis_a_tdata(dout_mul),              // input wire [31 : 0] s_axis_a_tdata.m_axis_result_tvalid(dout_en_e),  // output wire m_axis_result_tvalid.m_axis_result_tready(1'b1),  // input wire m_axis_result_tready.m_axis_result_tdata(dout_e)    // output wire [31 : 0] m_axis_result_tdata
);wire [1:0] result_e = result_r2[20];//---------Step  选择输出------------------
assign dout_en = dout_en_e;
assign dout = result_e==0?0:(result_e==1?dout_e:({1'b1,dout_e[30:0]}));endmodule

单浮点精度,流水线操作,已经验证过结果了,没有问题,采用vivado写的
yinzi = 32’h3EAAAAAB //开根号因子,对于三次开方根 = 1/3 ;
如果需要开N次根,只需要给yinzi = 1/N(浮点表示就可以) ,关于如何表示可以使用浮点数转换小工具

acos 和 asin 的计算,定点操作,流水线操作

原理:采用毕达哥拉斯和三角比,需要用到的IP有cordic (其中的sqrt和arctan)

module arccos_atan(
/*
模块功能: acos   也可以用于求asin
原理:毕达哥拉斯定理和三角比
1.纯定点计算
2.流水线计算
*/// System
input clk,
input rst_n,
// Input
input din_en,
input signed [15:0] din,    //fix16_15
input din_last,     // 略
// Output
output dout_en,
output [17:0] dout,     //fix18_15
output dout_last    //略);//------------------ Step0 x^2--------------- 定点
reg signed [30:0] X2 = 0;
reg dout_en_X2 = 0;     //fix31_30
reg [15:0] din_r1;
always @ (posedge clk)begindout_en_X2 <= din_en;din_r1 <= din;end
always @ (posedge clk)beginif(din_en)beginX2 <= din * din; endelsebeginX2 <= 0;endend//---------------- Step1 1-x^2-----------  定点
reg signed [30:0] X2_1 = 0;     //fix31_30
reg [15:0] din_r2;
reg signed [30:0] One = {1'b0,30'h3fffffff};
reg dout_en_X2_1 = 0;
always @ (posedge clk)begindout_en_X2_1 <= dout_en_X2;din_r2 <=  din_r1;end
always @ (posedge clk)beginX2_1 <= One - X2;end//--------------- Step 2 root2(1-x^2)---------- 定点
wire dout_en_root2;
wire [15:0]dout_root_2;
reg [15:0] din_x [15:0];
integer i;
always @ (posedge clk)beginfor (i=0;i<15;i=i+1)begindin_x[i+1] <=din_x[i];enddin_x[0] <= din_r2;endwire [15:0] dout_xx = din_x[15];
//16 延迟
cordic_root2    root2(      .aclk(clk),                                        // input wire aclk.s_axis_cartesian_tvalid(dout_en_X2_1 ),  // input wire s_axis_cartesian_tvalid.s_axis_cartesian_tdata({1'b0,X2_1}),    // input wire [31 : 0] s_axis_cartesian_tdata.m_axis_dout_tvalid(dout_en_root2),            // output wire m_axis_dout_tvalid.m_axis_dout_tdata(dout_root_2)              // output wire [31 : 0] m_axis_dout_tdata
);//----------------- 四象限正切 , 因为y一定是大于0,则输入定会在第一象限与第二象限,其输出也一定会是0-pi之间
wire dout_en_atan4;
wire [17:0] dout_atan4; //FIX 18_15
// 22 延迟
cordic_atan4 S4 (       .aclk(clk),                                        // input wire aclk.s_axis_cartesian_tvalid(dout_en_root2),  // input wire s_axis_cartesian_tvalid.s_axis_cartesian_tdata({7'd0,dout_root_2[15],dout_root_2,7'd0,dout_xx[15],dout_xx}),    // input wire [47 : 0] s_axis_cartesian_tdata.m_axis_dout_tvalid(dout_en_atan4),            // output wire m_axis_dout_tvalid.m_axis_dout_tdata(dout_atan4)              // output wire [23 : 0] m_axis_dout_tdata
);assign dout_en = dout_en_atan4;
assign dout = dout_atan4;
endmodule

定点,流水线操作,已经验证过结果了,没有问题,采用vivado写的,不同位宽延迟略有不同,你需要根据实际生成IP延迟进行修改,以上是求arccos,求arcsin需要添加判断,因为四象限正切的值一定会是正值,而arcsin是-pi/2 到 pi/2之间,所以最后需要修改下,很简单。

一定要关注点赞加收藏啊

FPGA实现全流水arccos,arcsin,任意次开放操作相关推荐

  1. FPGA开发全攻略——ISE基本操作

    原文链接: FPGA实战开发技巧(2) FPGA开发全攻略连载之十二:FPGA实战开发技巧(3) FPGA开发全攻略连载之十二:FPGA实战开发技巧(4) 5.2 如何进行FPGA设计早期系统规划 作 ...

  2. FPGA最全科普总结

    FPGA最全科普总结 FPGA 是可以先购买再设计的"万能"芯片.FPGA (Field Programmable Gate Array)现场可编程门阵列,是在硅片上预先设计实现的 ...

  3. FPGA开发全攻略—— 调试

    原文链接: FPGA开发全攻略连载之十三:FPGA实战开发技巧(12) 5.6 大规模设计的调试经验 在大规模设计的调试应该按照和设计理念相反的顺序,从底层测试,主要依靠ChipScope Pro 工 ...

  4. FPGA开发全攻略——概念篇

    原文链接: FPGA开发全攻略连载之一:FPGA为什么这么热? FPGA开发全攻略连载之二:为什么工程师要掌握FPGA开发知识? FPGA开发全攻略连载之三:FPGA基本知识与发展趋势(part1) ...

  5. 基于FPGA实现的流水灯实验

    版权声明:如需转载,请注明出处 https://blog.csdn.net/chengfengwenalan/article/details/79606351 基于FPGA实现的流水灯实验 一.开发环 ...

  6. 基于FPGA实现的流水灯项目

    基于FPGA实现的流水灯实验 一.开发环境 软件环境:Quartus Prime 17.1 ,notepad++,gvim,modelsim-SE,TimeGen3 硬件环境:DE2-115(Inte ...

  7. 锁相环原理及数字化,用FPGA实现全数字高阶锁相环

    FPGA实现全数字高阶锁相环 本人通信专业大三学生,非常感谢杜勇老师的<数字通信同步技术>和<锁相环技术原理>,带领小白的我从零开始一点点了解数字同步技术. 第一次写文章,记录 ...

  8. boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库

    SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库 SpringBoot操作数据库有多种方式,如 JDBC直接操作:太古老了,没人愿意这样玩 Mybatis插件:比较 ...

  9. Web全栈~27.文件和目录的操作

    Web全栈~27.文件和目录的操作 上一期 File方法介绍 File构造方法 //pathname表示完整路径,该路径可以是相对路径,也可以是绝对路径 public File(String path ...

  10. FPGA设计中,Vivado 调用IP核详细操作步骤

    FPGA设计中,Vivado 调用IP核详细操作步骤 今天给大侠带来了FPGA设计中,Vivado 调用IP核详细操作步骤,话不多说,手把手教学,请往下看. 首先咱们来了解一下vivado的IP核,I ...

最新文章

  1. 在应用程序中替换Linux中Glibc的malloc的四种方法
  2. 对某bc站的一次渗透测试
  3. Oracle %rowtype的用法
  4. 2.2数据通信的基础知识
  5. 【UIKit】UITableView.06
  6. 写项目经历的注意事项
  7. Python 高等数学问题的符号解
  8. JAVA实现GIF添加水印
  9. 3709: [PA2014]Bohater
  10. 定制QWidget标题栏的示例
  11. 三层交换机和路由器的区别
  12. R语言使用gbm包的gbm函数拟合梯度提升机回归模型:使用predict函数和训练好的模型进行预测推理、计算回归模型的评估指标MAE、MSE、RMSE、R方等指标
  13. 程序设计思维与实践 Week15 作业 A-ZJM与霍格沃兹
  14. signature=41cfe8ce7c71d9ccf90fa53bb560ae68,更新win7 sp1出现80073712错误代码
  15. 批量识别条形码和二维码
  16. YOLOv5 Detect 参数说明
  17. java8解析带有 AM/PM 的12小时制 时间字符串
  18. 如何找自己想要的项目?看这里告诉你答案
  19. ZR859 坤坤的篮球场 (单调队列)
  20. 梦幻之旅--地图编辑器开发

热门文章

  1. types是什么意思中文翻译成_types是什么意思_types的翻译_音标_读音_用法_例句_爱词霸在线词典...
  2. HTML5_用语义化标记重新定义博客
  3. HDU 3533 Escape (预处理+BFS)
  4. 运用集合实现用户的注册和登录
  5. 网络推销经典案例——所有的骗子都应该向他学习
  6. Wireshark、Sniffer 两款网络分析工具的比较
  7. Python股票量化学习(3)——简单的策略回测
  8. Veu进阶--transition动画和animation动画的使用详解
  9. excel2007 设置点击单元格设置默认值
  10. 系统设计之路:如何设计一个URL短链服务