此处两种算法优势:通过移位、或运算 完成平方值的比较,无需乘法器。
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;
end
end
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

本文深入探讨了两种用于计算平方根的高效算法,一种基于逐位逼近的原理,另一种利用位移操作实现快速计算。文章详细解释了算法的核心代码及其实现逻辑,适合对算法优化感兴趣的读者。

238

被折叠的 条评论
为什么被折叠?



