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

01前言
       fpga实现除法的方法有几种,比如直接用/来进行除法运算,调用ip核进行除法运算,但这两种方式都有个共同的问题——都是黑盒子,在进行时序违例处理时,往往不好操作,比如想打打拍改善下时序都不知从何下手。
02原理介绍
       我们都知道商(s)=  分子(fz)/分母(fm),该计算过程可等效于公式1
其中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.03125fm0=9/2**3 = 1.125以上部分在fpga中相当于右移由公式2、3得到fm_shift_bit = 3fz_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.9966796875f3=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 = 2 || 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;endfm_shift_bit = 0;if fm ~= 0    fm_inner = fm ;  while((fm_inner >= 2) || (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);  endelse    if fz == 0      s = 0;  else      if sign_flag == 0        s = 256 - 2^-7;      else        s = -256;    end  endend  
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;  endendfigure;plot(s_reg);title(迭代算出的结果);figure;plot(s_real_reg);title(理论结果);figure;plot(err_reg);title(误差图);grid on;      
下图迭代参数itr取不同值时的理论值与线性迭代值之间的误差图。
itr=8时
此时最大误差为2.7466*10**-7
itr=10时
此时最大误差为7.10543*10**-15
itr=50时
此时最大误差为7.10543*10**-15
由itr分别取8,10,50后所得到的理论值与线性迭代算出的值做差所得到的误差图可知,并不是迭代次数越多精度越小,当迭代次数达到一个临界值后,迭代的次数其实对商的影响就不是很大了。


智云smooth4手持稳定器评测 在同价位竞品中表现出色
Yolo系列模型的部署、精度对齐与int8量化加速
华灿光电20.84亿定增募资获批,京东方即将入主
一文了解Raspberry Pi 4各项性能跑分
是德科技在世界移动通信大会上展示 UXM 无线测试仪的最新增强
FPGA基于线性迭代法的除法器设计
反相比例放大电路和同相比例放大电路讲解
新松携并联机器人亮相中国国际制药机械博览会
基于Series8XE设计并且提供PVRIC3纹理压缩特性的器件
三星Note7和小米Note2曲面屏对比,这就尴尬了!
PyTorch教程-5.4. 数值稳定性和初始化
物联网网关采集工业设备数据实现远程监控管理
陶瓷压力传感器的结构图
世界集成电路产业格局现状如何 我国何时打破困境
lecroy力科示波器维修案例【图文详解】
《深度学习平台支撑产业智能化》百度CTO王海峰CNCC2019深度解读
常见的ESD保护器件
使用8051的控制直流风扇的温控电路
华为“吓人技术”成了一种生动超前宣誓技术决心的手段
5G发展正当时,机遇与挑战并存