RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA基于線性迭代法的除法器設(shè)計(jì)

Hack電子 ? 來源:FPGA開發(fā)備忘錄 ? 作者:FPGA開發(fā)備忘錄 ? 2023-07-04 10:03 ? 次閱讀

01前言

FPGA實(shí)現(xiàn)除法的方法有幾種,比如直接用/來進(jìn)行除法運(yùn)算,調(diào)用IP核進(jìn)行除法運(yùn)算,但這兩種方式都有個(gè)共同的問題——都是黑盒子,在進(jìn)行時(shí)序違例處理時(shí),往往不好操作,比如想打打拍改善下時(shí)序都不知從何下手。

02原理介紹

我們都知道商(s)= 分子(FZ)/分母(FM),該計(jì)算過程可等效于公式1

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

其中FM0為FM/2**fm_shift_bit后所得的取值范圍為[1,2)數(shù),通過取一個(gè)合適的fm_shift_bit的值,使得FM0的值在[1,2]之間。

同理FZ0為FZ/2**fz_shift_bit后所得的取值范圍為[1,2)數(shù),通過取一個(gè)合適的fz_shift_bit的值,使得FZ0的值在[1,2]之間。

最后經(jīng)過多次迭代后,由公式1和公式4得,

當(dāng)FM0*F1*F2*......FN=1時(shí) s=FZ0*F1*F2*......FN*2**(fz_shift_bit-fm_shift_bit)

例子

利用線性迭代的方式計(jì)算33/9

步驟如下:
第1步:將分子分母轉(zhuǎn)換為[1,2)之間的數(shù)此時(shí)得
FZ0 =33/2**5 = 1.03125
FM0=9/2**3 = 1.125
以上部分在FPGA中相當(dāng)于右移
由公式2、3得到
fm_shift_bit = 3
fz_shift_bit = 5
第2步:利用公式進(jìn)行線性迭代,令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
此時(shí)由公式4得:
s=1.03125*F1*F2*F3*2**(5-3)= 3.66662624359130859375
與理論計(jì)算值誤差為4.0423075358072916666666666666667e-6

在實(shí)際過程應(yīng)用中,我們可以根據(jù)實(shí)際的誤差要求確認(rèn)迭代的次數(shù)。

01根據(jù)原理建立的matlab浮點(diǎn)數(shù)仿真模型

具體的matlab模型代碼如下所示

Code

matlab迭代運(yùn)算代碼

function s = div_float(fz, fm, itr )
%----------------------判斷結(jié)果的符號(hào)-----------------
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
%------------迭代完成后計(jì)算商-------------------
%------------當(dāng)分子分母同時(shí)等于0時(shí),令商等于0,
%------------否則,當(dāng)符號(hào)標(biāo)志為正數(shù)時(shí),令其等于商的最大值
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("迭代算出的結(jié)果");
figure;plot(s_real_reg);title("理論結(jié)果");
figure;plot(err_reg);title("誤差圖");
grid on;
 ? ?

下圖迭代參數(shù)itr取不同值時(shí)的理論值與線性迭代值之間的誤差圖。

itr=8時(shí)

此時(shí)最大誤差為2.7466*10**-7

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

itr=10時(shí)

此時(shí)最大誤差為7.10543*10**-15

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

itr=50時(shí)

此時(shí)最大誤差為7.10543*10**-15

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

由itr分別取8,10,50后所得到的理論值與線性迭代算出的值做差所得到的誤差圖可知,并不是迭代次數(shù)越多精度越小,當(dāng)?shù)螖?shù)達(dá)到一個(gè)臨界值后,迭代的次數(shù)其實(shí)對(duì)商的影響就不是很大了。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602977
  • 除法器
    +關(guān)注

    關(guān)注

    2

    文章

    14

    瀏覽量

    13889
  • 時(shí)序
    +關(guān)注

    關(guān)注

    5

    文章

    387

    瀏覽量

    37317

原文標(biāo)題:FPGA基于線性迭代法的除法器設(shè)計(jì)(一)

文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于FPGA除法器純邏輯設(shè)計(jì)案例

    除法運(yùn)算。很多人覺得不就是除法嘛,直接打上/即可,但是,FPGA是不能正確綜合這個(gè)除法器的,綜合的結(jié)果只是一個(gè)固定數(shù)值,而不像其他微處理器??梢赃@么說,用
    的頭像 發(fā)表于 06-17 10:17 ?7492次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>除法器</b>純邏輯設(shè)計(jì)案例

    matlab牛頓迭代法全解

    線性方程(或方程組)問題可以描述為求 x 使得f(x) = 0。在求解非線性方程的方法中,牛頓迭代法是求非線性方程(非線性方程組)數(shù)值解的
    發(fā)表于 03-08 16:22

    問題:matlab實(shí)現(xiàn)牛頓迭代法求解非線性方程

    "matlab實(shí)現(xiàn)牛頓迭代法求解非線性方程"。通過試著運(yùn)行作者的matlab code,產(chǎn)生了如下一些疑問,請(qǐng)各位老師幫忙解答,不勝感謝。clearclcsyms x1 x2 x3
    發(fā)表于 07-05 02:53

    基于牛頓迭代法FPGA定點(diǎn)小數(shù)計(jì)算

    倒數(shù)運(yùn)算分為這兩個(gè)步驟則需要更多的時(shí)間開銷和空間開銷。而采用常規(guī)的浮點(diǎn)運(yùn)算單元(FPU)來求解的話,同樣需要很長的計(jì)算時(shí)間。本文介紹一種基于牛頓迭代法(又稱Newton-Raphson算法)的平方根
    發(fā)表于 07-18 07:33

    高速硬件除法器

    這是一個(gè)高速硬件除法器,要求畫出此硬件的除法器的工作流程圖。說明其工作原理特別是高速原理。要求有仿真時(shí)序波形圖并說出說明在fpga上驗(yàn)證器硬件功能。
    發(fā)表于 12-17 09:10

    參數(shù)尋優(yōu)的迭代法的基本原理是什么?伺服控制系統(tǒng)常用參數(shù)尋優(yōu)算法是什么?

    參數(shù)尋優(yōu)的迭代法的基本原理是什么?伺服控制系統(tǒng)常用參數(shù)尋優(yōu)算法是什么?
    發(fā)表于 10-13 06:38

    迭代法迭代陣譜半徑新上界

    引用雙嚴(yán)格對(duì)角占優(yōu)的概念,針對(duì)線性方程組bAx=在求數(shù)值解時(shí)常用的迭代方法,給出了Jacobi和Gauss-Seidel迭代法迭代陣譜半徑的新上界,該新上界優(yōu)于嚴(yán)格對(duì)角占優(yōu)矩陣條件下得
    發(fā)表于 11-18 00:07 ?6次下載

    物理光學(xué)迭代法計(jì)算任意形狀開口腔體RCS

    物理光學(xué)迭代法計(jì)算任意形狀開口腔體RCS:本文首先介紹了物理光學(xué)迭代法(IPO)的基本原理,并用此方法計(jì)算了簡單無遮擋開口腔體的RCS。在此基礎(chǔ)上,引進(jìn)遮擋判斷原則,計(jì)算了
    發(fā)表于 10-23 12:05 ?16次下載

    迭代法求指紋圖像中的閥值

    摘要:給出使用直方圖方法求閥值的例子;結(jié)合直方圖方法提出用于計(jì)算最優(yōu)閥值的迭代法,該方法是基于256級(jí)的指紋灰度圖像計(jì)算;最后給出迭代法中初值的選擇
    發(fā)表于 03-24 12:47 ?1130次閱讀
    用<b class='flag-5'>迭代法</b>求指紋圖像中的閥值

    并行除法器 ,并行除法器結(jié)構(gòu)原理是什么?

    并行除法器 ,并行除法器結(jié)構(gòu)原理是什么?   1.可控加法/減法(CAS)單元    和陣列乘法器非常相似,陣列式除法器也是一種并行運(yùn)算部件,采用大規(guī)模集成
    發(fā)表于 04-13 10:46 ?1.6w次閱讀

    高斯-牛頓迭代法簡介

    高斯牛頓迭代法簡介,包括高斯牛頓迭代法推演及及結(jié)論
    發(fā)表于 01-08 16:21 ?0次下載

    實(shí)例九— 除法器設(shè)計(jì)

    4.3 實(shí)例九 除法器設(shè)計(jì)4.3.1. 本章導(dǎo)讀要求掌握除法器原理,并根據(jù)原理設(shè)計(jì)除法器模塊以及設(shè)計(jì)對(duì)應(yīng)的測試模塊,最后在 Robei可視化仿真軟件經(jīng)行功能實(shí)現(xiàn)和仿真驗(yàn)證。設(shè)計(jì)原理這個(gè)除法器
    發(fā)表于 11-07 10:51 ?18次下載
    實(shí)例九— <b class='flag-5'>除法器</b>設(shè)計(jì)

    牛頓-拉夫遜迭代法原理及其實(shí)現(xiàn)

    直接看數(shù)學(xué)公式描述如何迭代不直觀,先來看動(dòng)圖就很容易理解牛頓迭代法為什么叫迭代法以及怎樣迭代
    的頭像 發(fā)表于 04-17 09:04 ?3230次閱讀

    FPGA常用運(yùn)算模塊-除法器

    本文是本系列的第四篇,本文主要介紹FPGA常用運(yùn)算模塊-除法器,xilinx提供了相關(guān)的IP以便于用戶進(jìn)行開發(fā)使用。
    的頭像 發(fā)表于 05-22 16:20 ?3658次閱讀
    <b class='flag-5'>FPGA</b>常用運(yùn)算模塊-<b class='flag-5'>除法器</b>

    python牛頓迭代法

    牛頓迭代法是一種數(shù)值計(jì)算方法,用于求解方程的數(shù)值近似解。它是以英國科學(xué)家艾薩克·牛頓的名字命名的,最初由牛頓在17世紀(jì)末提出。牛頓迭代法基于一個(gè)簡單的原理:一條曲線的切線近似代替這條曲線,在切線與x
    的頭像 發(fā)表于 11-21 15:06 ?1033次閱讀
    RM新时代网站-首页