0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA基于线性迭代法的除法器设计

Hack电子 来源:FPGA开发备忘录 作者:FPGA开发备忘录 2023-07-04 10:03 次阅读

01前言

FPGA实现除法的方法有几种,比如直接用/来进行除法运算,调用IP核进行除法运算,但这两种方式都有个共同的问题——都是黑盒子,在进行时序违例处理时,往往不好操作,比如想打打拍改善下时序都不知从何下手。

02原理介绍

我们都知道商(s)= 分子(FZ)/分母(FM),该计算过程可等效于公式1

b2df245e-1a0e-11ee-962d-dac502259ad0.png

其中FM0为FM/2**fm_shift_bit后所得的取值范围为[1,2)数,通过取一个合适的fm_shift_bit的值,使得FM0的值在[1,2]之间。

同理FZ0为FZ/2**fz_shift_bit后所得的取值范围为[1,2)数,通过取一个合适的fz_shift_bit的值,使得FZ0的值在[1,2]之间。

最后经过多次迭代后,由公式1和公式4得,

当FM0*F1*F2*......FN=1时 s=FZ0*F1*F2*......FN*2**(fz_shift_bit-fm_shift_bit)

例子

利用线性迭代的方式计算33/9

步骤如下:
第1步:将分子分母转换为[1,2)之间的数此时得
FZ0 =33/2**5 = 1.03125
FM0=9/2**3 = 1.125
以上部分在FPGA中相当于右移
由公式2、3得到
fm_shift_bit = 3
fz_shift_bit = 5
第2步:利用公式进行线性迭代,令FM0*F1*F2*......FN=FM_PRE,使FM_PRE接近于1
由第1步得FM0=1.125 
再通过公式5和公式6得
F1=2-1.125=0.875        FM1=1.125*0.875=0.984375  
F2=2-0.9875=1.0125       FM2=0.984375*1.0125=0.9966796875
F3=2-0.9966796875=1.0033203125 
迭代 3次后FM_PRE=1.125*0.875*1.0125*1.0033203125 = 0.99998897552490234375接近于1
此时由公式4得:
s=1.03125*F1*F2*F3*2**(5-3)= 3.66662624359130859375
与理论计算值误差为4.0423075358072916666666666666667e-6

在实际过程应用中,我们可以根据实际的误差要求确认迭代的次数。

01根据原理建立的matlab浮点数仿真模型

具体的matlab模型代码如下所示

Code

matlab迭代运算代码

function s = div_float(fz, fm, itr )
%----------------------判断结果的符号-----------------
if ((fz >= 0) && (fm >= 0)) || ((fz < 0) && (fm < 0))
    sign_flag = 0;
else
    sign_flag = 1;
end


%---------------限定分子范围在[1,2)---------
if fz >=0
  fz = fz;
else 
  fz = -fz;
end


fz_shift_bit = 0;
if fz ~= 0
  fz_inner = fz ;
 while(fz_inner >= 2 || fz_inner < 1)
      if fz_inner >= 2
    fz_inner = floor(fz_inner/2);
   fz_shift_bit = fz_shift_bit + 1;
   else
    fz_inner = fz_inner * 2;
   fz_shift_bit = fz_shift_bit - 1;
  end
 end
  fz = fz/2^fz_shift_bit;
end
%fprintf('a_shift_bit = ');disp(a_shift_bit);
%---------------限定分母范围在[1,2)---------
if fm >=0
  fm = fm;
else 
  fm = -fm;
end


fm_shift_bit = 0;
if fm ~= 0
  fm_inner = fm ;
 while((fm_inner >= 2) || (fm_inner < 1))
      if fm_inner >= 2
    fm_inner = floor(fm_inner/2);
   fm_shift_bit = fm_shift_bit + 1;
   else
    fm_inner = fm_inner * 2;
   fm_shift_bit = fm_shift_bit - 1;
  end
 end
  fm = fm/2^fm_shift_bit;
end
%fprintf('b_shift_bit = ');disp(b_shift_bit);
%-----------迭代过程------------------
for cnt = 0:itr-1
  f = 2 - fm;
 fz = fz * f;
 fm = fm * f;
end
%------------迭代完成后计算商-------------------
%------------当分子分母同时等于0时,令商等于0,
%------------否则,当符号标志为正数时,令其等于商的最大值
if fm ~= 0
  s = fz * 2^(fz_shift_bit - fm_shift_bit);
%  fprintf('a = ');disp(a);
%  fprintf('b = ');disp(b);
%  fprintf('c = ');disp(c);
 if sign_flag == 0
   s = s;
  else
   s = -s;
%  fprintf('~c = ');disp(c);
 end
else 
  if fz == 0
   s = 0;
 else 
   if sign_flag == 0
    s = 256 - 2^-7;
   else
    s = -256;
  end
 end
end

Code

matlab仿真tb

clear;
clc;
close all;


itr = 8;
%-----------定义分子分母和商的精度---------------
delt_fz = 2^-4;
delt_fm = 2^-2;
delt_s = 2^-7;


cntwhole = 1;
for fz = -3232 - delt_fz
  for fm = -8 : delt_fm : 8 - delt_fm
    s = div_float(fz, fm, itr);
  
  s_real = fz/fm;
  
  if s_real >= 256
    s_real = 256 - delt_s;
  elseif s_real < -256
        s_real = -256;
    else 
        s_real = s_real;
    end
    
    err = abs(s_real - s);
    
    s_reg(cntwhole) = s;
    s_real_reg(cntwhole) = s_real;
    err_reg(cntwhole) = err;
    
    cntwhole = cntwhole + 1;
  end
end
figure;plot(s_reg);title("迭代算出的结果");
figure;plot(s_real_reg);title("理论结果");
figure;plot(err_reg);title("误差图");
grid on;
    

下图迭代参数itr取不同值时的理论值与线性迭代值之间的误差图。

itr=8时

此时最大误差为2.7466*10**-7

b3236c9a-1a0e-11ee-962d-dac502259ad0.png

itr=10时

此时最大误差为7.10543*10**-15

b35d9ff0-1a0e-11ee-962d-dac502259ad0.png

itr=50时

此时最大误差为7.10543*10**-15

b3814e5a-1a0e-11ee-962d-dac502259ad0.png

由itr分别取8,10,50后所得到的理论值与线性迭代算出的值做差所得到的误差图可知,并不是迭代次数越多精度越小,当迭代次数达到一个临界值后,迭代的次数其实对商的影响就不是很大了。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21331

    浏览量

    593315
  • 除法器
    +关注

    关注

    2

    文章

    14

    浏览量

    13850
  • 时序
    +关注

    关注

    5

    文章

    357

    浏览量

    36963

原文标题:FPGA基于线性迭代法的除法器设计(一)

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA除法器纯逻辑设计案例

    除法运算。很多人觉得不就是除法嘛,直接打上/即可,但是,FPGA是不能正确综合这个除法器的,综合的结果只是一个固定数值,而不像其他微处理器。可以这么说,用
    的头像 发表于 06-17 10:17 6673次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>除法器</b>纯逻辑设计案例

    matlab牛顿迭代法全解

    线性方程(或方程组)问题可以描述为求 x 使得f(x) = 0。在求解非线性方程的方法中,牛顿迭代法是求非线性方程(非线性方程组)数值解的
    发表于 03-08 16:22

    基于FPGA除法器

    定点除法器的输出是商和余数的形式,但是我想让他表示成小数的形式(因为最后要送到数码管显示),该怎么装换?求大神,给点思路也可以!总共是8位显示,而整数部分和小数部分的位数不定?怎么设计
    发表于 05-15 20:01

    问题:matlab实现牛顿迭代法求解非线性方程

    "matlab实现牛顿迭代法求解非线性方程"。通过试着运行作者的matlab code,产生了如下一些疑问,请各位老师帮忙解答,不胜感谢。clearclcsyms x1 x2 x3
    发表于 07-05 02:53

    基于牛顿迭代法FPGA定点小数计算

    倒数运算分为这两个步骤则需要更多的时间开销和空间开销。而采用常规的浮点运算单元(FPU)来求解的话,同样需要很长的计算时间。本文介绍一种基于牛顿迭代法(又称Newton-Raphson算法)的平方根
    发表于 07-18 07:33

    高速硬件除法器

    这是一个高速硬件除法器,要求画出此硬件的除法器的工作流程图。说明其工作原理特别是高速原理。要求有仿真时序波形图并说出说明在fpga上验证器硬件功能。
    发表于 12-17 09:10

    参数寻优的迭代法的基本原理是什么?伺服控制系统常用参数寻优算法是什么?

    参数寻优的迭代法的基本原理是什么?伺服控制系统常用参数寻优算法是什么?
    发表于 10-13 06:38

    除法器的设计资料分享

    4.3 实例九 除法器设计4.3.1. 本章导读要求掌握除法器原理,并根据原理设计除法器模块以及设计对应的测试模块,最后在 Robei可视化仿真软件经行功能实现和仿真验证。设计原理这个除法器
    发表于 11-12 07:03

    迭代法迭代阵谱半径新上界

    引用双严格对角占优的概念,针对线性方程组bAx=在求数值解时常用的迭代方法,给出了Jacobi和Gauss-Seidel迭代法迭代阵谱半径的新上界,该新上界优于严格对角占优矩阵条件下得
    发表于 11-18 00:07 6次下载

    并行除法器 ,并行除法器结构原理是什么?

    并行除法器 ,并行除法器结构原理是什么?   1.可控加法/减法(CAS)单元    和阵列乘法器非常相似,阵列式除法器也是一种并行运算部件,采用大规模集成
    发表于 04-13 10:46 1.5w次阅读

    高斯-牛顿迭代法简介

    高斯牛顿迭代法简介,包括高斯牛顿迭代法推演及及结论
    发表于 01-08 16:21 0次下载

    实例九— 除法器设计

    4.3 实例九 除法器设计4.3.1. 本章导读要求掌握除法器原理,并根据原理设计除法器模块以及设计对应的测试模块,最后在 Robei可视化仿真软件经行功能实现和仿真验证。设计原理这个除法器
    发表于 11-07 10:51 18次下载
    实例九— <b class='flag-5'>除法器</b>设计

    牛顿-拉夫逊迭代法原理及其实现

    直接看数学公式描述如何迭代不直观,先来看动图就很容易理解牛顿迭代法为什么叫迭代法以及怎样迭代
    的头像 发表于 04-17 09:04 1831次阅读

    FPGA常用运算模块-除法器

    本文是本系列的第四篇,本文主要介绍FPGA常用运算模块-除法器,xilinx提供了相关的IP以便于用户进行开发使用。
    的头像 发表于 05-22 16:20 2156次阅读
    <b class='flag-5'>FPGA</b>常用运算模块-<b class='flag-5'>除法器</b>

    python牛顿迭代法

    牛顿迭代法是一种数值计算方法,用于求解方程的数值近似解。它是以英国科学家艾萨克·牛顿的名字命名的,最初由牛顿在17世纪末提出。牛顿迭代法基于一个简单的原理:一条曲线的切线近似代替这条曲线,在切线
    的头像 发表于 11-21 15:06 475次阅读