3种方法:

1.JPL近似的实现方法


`timescale 1ns / 1ps
module complex_abs#(parameter N=)(
clk,
syn_rst,
dataa,
datab,
ampout); input clk;
input [N-:] dataa;
input [N-:] datab;
input syn_rst;
output reg [N-:]ampout; reg [N-:]dataa_reg ;
reg [N-:]datab_reg ;
wire [N-:]dataa_abs ;
wire [N-:]datab_abs ;
reg [N-:]dataabs_max,dataabs_min ;
reg [N-:]absmin_3 ; always @(posedge clk)
begin
if(syn_rst == 'b1)
begin
dataa_reg <= 'd0 ;
datab_reg <= 'd0 ;
end
else
begin
dataa_reg <= dataa ;
datab_reg <= datab ;
end
end assign dataa_abs = (dataa_reg[] == 'b1) ? (31'd0-dataa_reg[N-:]) : dataa_reg[N-:] ;
assign datab_abs = (datab_reg[] == 'b1) ? (31'd0-datab_reg[N-:]) : datab_reg[N-:] ; always @(posedge clk)
begin
if(dataa_abs > datab_abs)
begin
dataabs_max <= dataa_abs ;
dataabs_min <= datab_abs ;
absmin_3 <= {'b0,datab_abs}+{datab_abs,1'b0} ;
end
else
begin
dataabs_max <= datab_abs ;
dataabs_min <= dataa_abs ;
absmin_3 <= {'b0,dataa_abs}+{dataa_abs,1'b0} ;
end
end always @(posedge clk)
begin
if(absmin_3 > {'b0,dataabs_max})
ampout <= {'b0,dataabs_max} - {4'b0,dataabs_max[N-:]} + {'b0,dataabs_min[N-2:1]} ;
else
ampout <= {'b0,dataabs_max} + {4'b0,dataabs_min[N-:]} ;
end endmodule


2.调用IP模块的cordic算法实现效果

可选模式可以是fraction或者intergalactic

工程中输入数据的范围是远大于2的,于是我们可以采用实现方法是将所有的数据先归一化成-2~2之间,然后再进一步的采用cordic模块

IP的配置如下

3.牛顿迭代忽略余数的实现方法

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2018/08/07 16:26:46
// Design Name:
// Module Name: sqrt
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////// module sqrt
#(
parameter d_width = ,
parameter q_width = d_width/ - ,
parameter r_width = q_width + )
(
input wire clk,
input wire rst,
input wire i_vaild,
input wire [d_width-:] data_i,//data_21,data_12,data_22, //输入 output reg o_vaild,
output reg [q_width:] data_o, //输出
output reg [r_width:] data_r //余数
); //-------------------------------------------------------------------------------- reg [d_width-:] D [r_width:]; //被开方数
reg [q_width:] Q_z [r_width:]; //临时
reg [q_width:] Q_q [r_width:]; //确认
reg ivalid_t [r_width:];
//--------------------------------------------------------------------------------
always@(posedge clk or posedge rst)
begin
if(rst)
begin
D[r_width] <= ;
Q_z[r_width] <= ;
Q_q[r_width] <= ;
ivalid_t[r_width] <= ;
end
else if(i_vaild)
begin
D[r_width] <= data_i;//data_11+data_21+data_12+data_22; //被开方数据
Q_z[r_width] <= {'b1,{q_width{1'b0}}}; //实验值设置
Q_q[r_width] <= ; //实际计算结果
ivalid_t[r_width] <= ;
end
else
begin
D[r_width] <= ;
Q_z[r_width] <= ;
Q_q[r_width] <= ;
ivalid_t[r_width] <= ;
end
end
//------------------------------------------------------------------------------- // 迭代计算过程 //-------------------------------------------------------------------------------
generate
genvar i;
for(i=r_width-;i>=;i=i-)
begin:U
always@(posedge clk or posedge rst)
begin
if(rst)
begin
D[i] <= ;
Q_z[i] <= ;
Q_q[i] <= ;
ivalid_t[i] <= ;
end
else if(ivalid_t[i+])
begin
if(Q_z[i+]*Q_z[i+] > D[i+])
begin
Q_z[i] <= {Q_q[i+][q_width:i],'b1,{{i-1}{1'b0}}};
Q_q[i] <= Q_q[i+];
end
else
begin
Q_z[i] <= {Q_z[i+][q_width:i],'b1,{{i-1}{1'b0}}};
Q_q[i] <= Q_z[i+];
end
D[i] <= D[i+];
ivalid_t[i] <= ;
end
else
begin
ivalid_t[i] <= ;
D[i] <= ;
Q_q[i] <= ;
Q_z[i] <= ;
end
end
end
endgenerate
//-------------------------------------------------------------------------------- // 计算余数与最终平方根 //--------------------------------------------------------------------------------
always@(posedge clk or posedge rst)
begin
if(rst)
begin
data_o <= ;
data_r <= ;
o_vaild <= ;
end
else if(ivalid_t[])
begin
if(Q_z[]*Q_z[] > D[])
begin
data_o <= Q_q[];
data_r <= D[] - Q_q[]*Q_q[];
o_vaild <= ;
end
else
begin
data_o <= {Q_q[][q_width:],Q_z[][]};
data_r <= D[] - {Q_q[][q_width:],Q_z[][]}*{Q_q[][q_width:],Q_z[][]};
o_vaild <= ;
end
end
else
begin
data_o <= ;
data_r <= ;
o_vaild <= ;
end
end
//--------------------------------------------------------------------------------
endmodule

三种方法的精度对比以及资源占用情况

JPL近似

IPcordic使用:

牛顿迭代

可以看出资源占用:newtoon>JPL > IPcordic,精度的估计JPL<newtoon<IPcordic,

其中JPL 的计算速度快,但是误差太高了

单独求倒数的模块    /    快速高精度求平方根倒数的算法

FPGA开平方的实现的更多相关文章

  1. 基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

  2. 基于 FPGA 的图像边缘检测

    本文主要内容是实现图像的边缘检测功能 目录 mif文件的制作 调用 ip 核生成rom以及在 questasim 仿真注意问题 灰度处理 均值滤波:重点是3*3 像素阵列的生成 sobel边缘检测 图 ...

  3. 【转】基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

  4. FPGA与simulink联合实时环路系列——实验三 按键key

    实验三 按键key 实验内容 在FPGA的实验中,经常涉及到按键的使用,按键是必不可少的人机交互的器件之一,在这些实验中,有时将按键的键值读取显示到数码管.LCD或者是通过串口传送到PC的串口助手上进 ...

  5. FPGA与simulink联合实时环路系列——实验二LED

    实验二LED 实验内容 在实验一的基础上,将simulink产生的测试信号输出到FPGA开发板上的LED灯进行显示,这里要在生成的硬件模型上进行修改,将传送到FPGA的信号输出到8个LED灯上,并且对 ...

  6. FPGA优化之高扇出

    Fanout即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛.因此,在写代码时应尽量避免高扇出的情况.但是,在某些特殊情况下,受到 ...

  7. 关于 FPGA 内部信号扇入扇出

    扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门电路的扇入系数为1—5,最多不超过8.扇出系数是指一个门的输出端所驱动同类型门的个数,或称负载能力.一般门电路的扇出系数为8,驱动器的扇出系数 ...

  8. FPGA Timing笔记

    很多FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题.决定FPGA的timing关键是什么?如何才能跑到更快的频率呢? A. 第一步需要了解FPGA的timing路 ...

  9. FPGA的引脚VCCINT 、VCCIO VCCA

    首先是看到FPGA在配置的时候有三种不同的电VCCINT .VCCIO VCCA,于是就查了下有什么不同: FPGA一般会有许多引脚,那它们都有什么用呢? VCCINT为施加于 FPGA 内核逻辑的电 ...

随机推荐

  1. tkinter对话框和窗体

    1.标准对话框(tkinter.messagebox) 常用标准对话框 tkinter.messagebox.askokcancel tkinter.messagebox.askquestiontki ...

  2. Lambder笔记

    记录Lambda语法(λ ,匿名函数)以及三个Python常见内置函数 形如:y=f(x)=x*x 使用lambda语法将对一个变量的运算抽象出来,如同f(),或是数学中的函数.关系.映射 f = l ...

  3. 91.一次性处理多条数据的方法:bulk_create,update,delete

    (1)bulk_create: 可以一次性的创建多个对象 示例代码如下: from django.http import HttpResponse from .models import Pulish ...

  4. 如何修改Jquery Mobile 设置默认选项

    以下的默认配置可以通过$.mobile对象重新配置自定义命名空间s (字符, 默认: ""): 在jQuery Mobile中,甚至可以自定义象HTML5中的data-attrib ...

  5. Spring学习之Aspectj开发实现AOP

    Aspectj是一个基于Java语言的Aop框架,它提供了强大的Aop功能. Aspectj简介: 1.Aspectj是一个面向切面的框架,它扩展了Java语言,它定义了一个Aop语法. 2.所以它有 ...

  6. Spring Cloud服务间调用鉴权

    学习使用Spring Cloud 微服务间的调用都是RestFul风格,如何保证调用之间的安全性,这是一个很重要的问题. 通过查阅资料http://wiselyman.iteye.com/blog/2 ...

  7. SSM到Spring Boot-校园商铺平台

    第04章 店铺注册功能模块 4-3 Thumbnailator图片处理和封装Util[通过java代码实现给图片打上水印] 4-3 Thumbnailator图片处理和封装Util[通过java代码实 ...

  8. IntelliJ IDEA 2019.2 LUA环境搭建说明

    1.搭建GCC 添加系统环境变量PATH  为C:\MinGW\bin目录 测试命令进入CMD    gcc -v 2.编译LUA cd到lua/src目录      mingw32-make min ...

  9. Redis分布式锁前世今生

    1.redis锁前世即基于单Redis节点的分布式锁,诸如setkey value px milliseconds nx 前世者,必将经历种种磨砺,才能稍微符合一些主流.推荐自测非常好用的redis工 ...

  10. DOCKER 学习笔记2 认识dockerfile自定义镜像

    Dockerfile 概念 Dockerfile 是一个文本文件,但包含所构建容器在运行时候的参数.库.资源配置.可以简单理解为我们现有的镜像,比如Centos/Nginx 但我们需要构建一个容器的时 ...