此處兩種演算法優勢:通過移位、或運算 完成平方值的比較,無需乘法器。
1、方法一
根據被開方數字寬,從結果的最到位[ (asize/2)-1]到最低位[0]逐次逼近。核心**理解:
tt = (v << (i + 1)) | (1 << (i + i))=2*v*2^i + 2^(2*i) = (v+2^i)^2 - v^2;// | 相當於加法。
v+2^i表示結果v的第[i]bit 新變為1,則tt代表v[i]=1後,v^2的增量。
每次變位完,需要從被開方總數r-增量tt,剩餘值繼續用於判斷後續bit變位。
parameter asize = 52;//輸入資料位寬
input [asize-1:0] a;
output reg [(asize/2)-1:0] z;
reg [asize-1:0] v, r, tt;
always @(a) begin //此段**只適用於**,無法綜合
integer i;
// r is remainder,
// tt 增加1個bit後平方值的增量
// v is current sqrt value
v = 0;
r = a;
for(i = asize/2 - 1; i >= 0; i = i - 1) begin//i迴圈0~25
tt = (v << (i + 1)) | (1 << (i + i));
if(tt <= r) begin
v = v | (1 << i);//v的對應位置1
r = r - tt;
endend
z = v;
end
2、方法二
被開方數ai為32位,結果位寬[15:0],ai[15]=1時平方值=32'h4000_0000=2^30=(2^15)*(2^15),右移15位又得到ai[15]=1。
按照每位的平方值m逐次逼近,每次m>>2,直到m>0
parameter m_s = 32'h4000_0000;
parameter a_s = 32'd1000;
reg [31:0] y = 0;
reg [31:0] b,result;//開方結果
reg [31:0] t;
reg [31:0] m = m_s;
reg [31:0] ai= a_s;//ai為輸入的32bits 資料
always @(posedge clk) begin
if (m>0) m <= m>>2;
else
result <= ( (y !=65535 ) && (a_s > (y*y+y)) ) ? y+1 :y;//做捨入判斷 +1
endalways @( * ) begin //此段**只適用於**,無法綜合
if(m>0) begin
b = y | m;//最新平方和 的累加
y = y>>1; //平方和通過每次移位,縮小為開方值
t = (ai>b) ? 32'hffff_ffff : 32'h0000_0000 ;//ai>b 表示當前bit有效為1
ai = ai - (b & t);//平方和 的剩餘未分解值
y = y | (m & t);//相當於有效平方和 的累加
endend
快速開平方取倒數的演算法
quake iii arena 雷神之鎚3 是90年代的經典遊戲之一。該系列的遊戲不但畫面和內容不錯,而且即使計算機配置低,也能極其流暢地執行。這要歸功於它3d引擎的開發者約翰 卡馬克 john carmack 事實上早在90年代初dos時代,只要能在pc上搞個小動畫都能讓人驚嘆一番的時候,john...
ACM 反覆平方法的兩種寫法
一直以來對反覆平方法都是知道個大概意思,但是一直都處於混淆的狀態,今天總結一下。網上通常看到的 是這個樣子的 1 int pow int a,int b 8 r r 9 b 2 10 11return result 12 假設b為1011的話,列出來b運算過的部分 result r的結果是 b運算過...
組合的兩種遞迴演算法
組合就是從n個物品中任意選擇m個組成一組,下面兩種遞迴演算法都可以求出不同的組合,如果待選物品當中有重複的,比如說下面 中an new char 變成 an new char,這兩種演算法依然有效,只不過要加一步去重複。tip 如果給出的陣列元素不是數字,比如是a,b,c,d,可以直接用陣列下標來進...