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
其中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
itr=10時(shí)
此時(shí)最大誤差為7.10543*10**-15
itr=50時(shí)
此時(shí)最大誤差為7.10543*10**-15
由itr分別取8,10,50后所得到的理論值與線性迭代算出的值做差所得到的誤差圖可知,并不是迭代次數(shù)越多精度越小,當(dāng)?shù)螖?shù)達(dá)到一個(gè)臨界值后,迭代的次數(shù)其實(shí)對(duì)商的影響就不是很大了。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21801瀏覽量
606358 -
除法器
+關(guān)注
關(guān)注
2文章
14瀏覽量
13918 -
時(shí)序
+關(guān)注
關(guān)注
5文章
392瀏覽量
37445
原文標(biāo)題:FPGA基于線性迭代法的除法器設(shè)計(jì)(一)
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于FPGA的除法器純邏輯設(shè)計(jì)案例
![基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>除法器</b>純邏輯設(shè)計(jì)案例](https://file.elecfans.com/web1/M00/BF/34/pIYBAF7pfVaANo-vAABcpPBu2gc064.png)
matlab牛頓迭代法全解
問題:matlab實(shí)現(xiàn)牛頓迭代法求解非線性方程
基于牛頓迭代法的FPGA定點(diǎn)小數(shù)計(jì)算
高速硬件除法器
參數(shù)尋優(yōu)的迭代法的基本原理是什么?伺服控制系統(tǒng)常用參數(shù)尋優(yōu)算法是什么?
迭代法迭代陣譜半徑新上界
物理光學(xué)迭代法計(jì)算任意形狀開口腔體RCS
用迭代法求指紋圖像中的閥值
![用<b class='flag-5'>迭代法</b>求指紋圖像中的閥值](https://file1.elecfans.com//web2/M00/A4/30/wKgZomUMMxCAb_csAAD16mM4rRA175.gif)
并行除法器 ,并行除法器結(jié)構(gòu)原理是什么?
實(shí)例九— 除法器設(shè)計(jì)
![實(shí)例九— <b class='flag-5'>除法器</b>設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論