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. split和join合写

    小骆驼 第一章 简介 1. // input 和截取字符 #!usr/bin/perl use strict; use warnings; while ( <> ) { chomp; pr ...

  2. 2020/1/28 PHP代码审计之命令执行漏洞

    0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...

  3. 开始新建AEM站点-周末教程

    Getting Started Developing AEM Sites - WKND Tutorial 开始新建AEM站点-周末教程 The goal for this multi-part tut ...

  4. 吴裕雄--天生自然 JAVA开发学习:基础语法

    package test; public class temp { /* 第一个Java程序 * 它将打印字符串 Hello World */ public static void main(Stri ...

  5. UML-如何画操作契约?

    1.在编写契约过程中,发现之前的领域模型不对,此时是否需要修改? 需要修改.包括:概念类.属性.关联.这就是不断迭代和进化 2.用例中复杂场景里的状态变化细节,描述过多导致用例臃肿,让人看不下去,因此 ...

  6. Linux环境系列 之【配置虚拟机】

    前言懒得讲, 不给人解决问题的程序员不是好的程序员,所有老规矩,直接上干货 This is 系列故事 如果你从这里单独看那是没有任何问题的,但是你是小白的话建议你跳去 ☞从头开始[环境概述] ☞本章节 ...

  7. gitKraken取消/关闭全屏

    如果你找不到在哪里设置的 这是配置文件  注意 fullScreen 字段,改这个字段可以改变是不是全屏,改变之前先关闭软件, 文件目录 第二张图

  8. 后台用Hbase对表单数据实现增删改查遇到的问题

    1.无法解析jsp 原因:hbase中lib下jar包会与tomcat包冲突,需要删除与tomcat冲突的包 这是我删除的几个包 之后运行就没有问题了 2.对于Hbase修改的问题 在添加数据时,HB ...

  9. 微信小程序2048开发进度(二)

    对小程序首先进行游戏架构: 实现小程序的首页展示界面,初始化棋盘格,以及NEW GAME按钮,成绩展现.

  10. 使用GitHub Pages服务进行域名URL转发

    有时,你注册了一个域名,但是你没有搭建服务器.你希望这个域名能指向你的主页/博客/微博等.但是,很多域名注册商不提供这种服务,或者这是一项收费服务.这时你可以使用GitHub来实现这一功能. 你需要导 ...