FPGA开平方的实现
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开平方的实现的更多相关文章
- 基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- 基于 FPGA 的图像边缘检测
本文主要内容是实现图像的边缘检测功能 目录 mif文件的制作 调用 ip 核生成rom以及在 questasim 仿真注意问题 灰度处理 均值滤波:重点是3*3 像素阵列的生成 sobel边缘检测 图 ...
- 【转】基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- FPGA与simulink联合实时环路系列——实验三 按键key
实验三 按键key 实验内容 在FPGA的实验中,经常涉及到按键的使用,按键是必不可少的人机交互的器件之一,在这些实验中,有时将按键的键值读取显示到数码管.LCD或者是通过串口传送到PC的串口助手上进 ...
- FPGA与simulink联合实时环路系列——实验二LED
实验二LED 实验内容 在实验一的基础上,将simulink产生的测试信号输出到FPGA开发板上的LED灯进行显示,这里要在生成的硬件模型上进行修改,将传送到FPGA的信号输出到8个LED灯上,并且对 ...
- FPGA优化之高扇出
Fanout即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛.因此,在写代码时应尽量避免高扇出的情况.但是,在某些特殊情况下,受到 ...
- 关于 FPGA 内部信号扇入扇出
扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门电路的扇入系数为1—5,最多不超过8.扇出系数是指一个门的输出端所驱动同类型门的个数,或称负载能力.一般门电路的扇出系数为8,驱动器的扇出系数 ...
- FPGA Timing笔记
很多FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题.决定FPGA的timing关键是什么?如何才能跑到更快的频率呢? A. 第一步需要了解FPGA的timing路 ...
- FPGA的引脚VCCINT 、VCCIO VCCA
首先是看到FPGA在配置的时候有三种不同的电VCCINT .VCCIO VCCA,于是就查了下有什么不同: FPGA一般会有许多引脚,那它们都有什么用呢? VCCINT为施加于 FPGA 内核逻辑的电 ...
随机推荐
- tkinter对话框和窗体
1.标准对话框(tkinter.messagebox) 常用标准对话框 tkinter.messagebox.askokcancel tkinter.messagebox.askquestiontki ...
- Lambder笔记
记录Lambda语法(λ ,匿名函数)以及三个Python常见内置函数 形如:y=f(x)=x*x 使用lambda语法将对一个变量的运算抽象出来,如同f(),或是数学中的函数.关系.映射 f = l ...
- 91.一次性处理多条数据的方法:bulk_create,update,delete
(1)bulk_create: 可以一次性的创建多个对象 示例代码如下: from django.http import HttpResponse from .models import Pulish ...
- 如何修改Jquery Mobile 设置默认选项
以下的默认配置可以通过$.mobile对象重新配置自定义命名空间s (字符, 默认: ""): 在jQuery Mobile中,甚至可以自定义象HTML5中的data-attrib ...
- Spring学习之Aspectj开发实现AOP
Aspectj是一个基于Java语言的Aop框架,它提供了强大的Aop功能. Aspectj简介: 1.Aspectj是一个面向切面的框架,它扩展了Java语言,它定义了一个Aop语法. 2.所以它有 ...
- Spring Cloud服务间调用鉴权
学习使用Spring Cloud 微服务间的调用都是RestFul风格,如何保证调用之间的安全性,这是一个很重要的问题. 通过查阅资料http://wiselyman.iteye.com/blog/2 ...
- SSM到Spring Boot-校园商铺平台
第04章 店铺注册功能模块 4-3 Thumbnailator图片处理和封装Util[通过java代码实现给图片打上水印] 4-3 Thumbnailator图片处理和封装Util[通过java代码实 ...
- IntelliJ IDEA 2019.2 LUA环境搭建说明
1.搭建GCC 添加系统环境变量PATH 为C:\MinGW\bin目录 测试命令进入CMD gcc -v 2.编译LUA cd到lua/src目录 mingw32-make min ...
- Redis分布式锁前世今生
1.redis锁前世即基于单Redis节点的分布式锁,诸如setkey value px milliseconds nx 前世者,必将经历种种磨砺,才能稍微符合一些主流.推荐自测非常好用的redis工 ...
- DOCKER 学习笔记2 认识dockerfile自定义镜像
Dockerfile 概念 Dockerfile 是一个文本文件,但包含所构建容器在运行时候的参数.库.资源配置.可以简单理解为我们现有的镜像,比如Centos/Nginx 但我们需要构建一个容器的时 ...