Chisel实践——利用CORDIC算法计算平方根
一、介绍
在本专栏之前的文章中:
用Chisel快速搭建FFT流水线电路
Chisel实践——短时傅里叶变换模块的实现与测试
Chisel实践——利用CORDIC算法计算对数函数
已经介绍了如何使用Chisel开发FFT运算模块和STFT模块,以及对于Chisel实现CORDIC算法的初步探索:计算对数函数。这篇文章将进一步拓展CORDIC算法在Chisel上的实现,使用其实现平方根计算,并与Vivado内的CORDIC IP核进行综合对比。
二、算法说明
本文为算法的拓展应用,详细的算法说明请参考专栏之前的文章:Chisel实践——利用CORDIC算法计算对数函数
CORDIC算法是基于移位加法和矢量旋转技术进行计算的。它主要有旋转模式(Rotation Mode)和向量模式(Vectoring Mode),两种模式又可以应用在圆坐标系、线性坐标系以及双曲坐标系。两种模式分别应用在三个坐标系,进行迭代运算,可以分别演算出8种运算。主要如下表总结:
可以看到,其实CORDIC算法可以实现的8种函数中并没有平方根函数,那应该如何实现计算平方根呢?见下图:
此过程具体的数学推导可以参考这篇文章。当取双曲坐标系进行向量模式的迭代运算时,我们可以将x的初始值设1,z的初始值设0,y设为你想进行运算的数。在迭代过程中y逐渐趋近于0,此时可以很容易地由z值得y的反双曲正切值,进而计算对数函数。
容易注意到,在这个迭代过程中,不仅仅出现了反双曲正切函数,也出现了平方根函数,因此我们可以稍作变换:设a为待求的平方根值,设x的初始值为a+1,y的初始值为a-1,z任意值皆可,经过迭代后的x值为:
即可实现求取平方根。
三、算法过程
3.1 逻辑说明
设x0 = a + 1