两种逐次逼近的开平方算法sqrt

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

此处两种算法优势:通过移位、或运算 完成平方值的比较,无需乘法器。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值