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. pandas中DataFrame重置设置索引

    在pandas中,经常对数据进行处理 而导致数据索引顺序混乱,从而影响数据读取.插入等. 小笔总结了以下几种重置索引的方法: import pandas as pd import numpy as n ...

  2. PAT B1095 解码PAT准考证

    半个月了,每天做几道题PAT基础题,终于把基础的95道题目做完了.总体来说,没有太难的东西,偶尔几个题目有点复杂而已. 加油,离3月份的考试越来越近了,还有155道题目等着我呢!!! B_1095题目 ...

  3. 元祖&字典

    #什么是元祖:元祖是一个不可变的列表(没有改的需求) #======================================基本使用============================== ...

  4. Thread--两线程交替打印

    package t3.copy; public class ThreadA extends Thread { private Object lock; public ThreadA(Object lo ...

  5. python 常用函数用法

    Assert 断言assert的语法其实有点像是fi 条件分支语句的“近亲”,assert这个关键字称为“断言”,当这个关键字后边的条件为false的时候,程序自动崩溃并抛出AssertionErro ...

  6. python import xx和from xx import x 中的坑

    先回顾一下理解程度 什么是不可变类型和可变类型? 可变类型是,修改变量后 引用的内存地址不变,引用的内存中的内容发生变化(是针对变量名的引用来理解). # 在a.py中定义了一个test属性 test ...

  7. Golang解析json的几种方法

    Golang解析json的几种方法 概要 使用Golang调用其它平台API接口时总会被多层的json串给恶心到,我记录一下自己解析json的几种方法. 一.自带的json包 func JsonUnm ...

  8. Faraday Future,FF2019年一季度前完成第一阶段5亿美元左右的A+轮融资,2019年年底前完成7亿美元的Pre-IPO轮融资,2020IPO

    FF2019年一季度前完成第一阶段5亿美元左右的A+轮融资,2019年年底前完成7亿美元的Pre-IPO轮融资,2020IPO 区块链公司先行宣布将对FF进行投资.EVAIO(中文名:伊娃)公司 跨链 ...

  9. 【iOS入门】UITableView加载图片

    学习带图片的列表 官方 LazyTableImages demo  http://download.csdn.net/detail/jlyidianyuan/5726749 分析源码是学习的好方法. ...

  10. 对Spring aware理解

    aware翻译过来时就是意识到,我对他的理解就是spring的感知器.是不是很诡异这个名字起得^_^ 先来看看aware接口的结构 spring提供了许多的aware,Aware.java也只是做一个 ...