采用线性逼近法结合32段线性查找表的方式来实现1/z的计算。
首先将1/32-1/64的定点化数据存放到ROM中,ROM中存放的是扩大了2^20 次方的数字四舍五入后的整数部分。n值越大,精度越大,误差越小。这里取n=20;
ROM中存储的数据是1/(32+i)*2^20的四舍五入的整数部分。
32-64间的数据可以通过查表来实现,其他的数据则采用的是线性逼近的方法。
线性逼近的步骤为:
1.确定最高非零比特位的位置
2.对z进行左移或者右移,得到zp
3.zp查找ROM,得到1/zp,以及1/(zp+1),
4.求的1/zp-1/(zp+1),为误差A
5.N=z-zp*2^(m-5)
6.B=A/2^(m-5)*N
7.将扩大的部分缩小回去,或者缩小了的放大回去,那么1/z=(1/zp-B)*(1/2^(m-5))
代码插入:
module top_inv( input clk,syn_rst, input [20:0]dataa, input [20:0]datab, //input [20:0]ampout, output reg [19:0]inv // output reg done ); reg [4:0] address1; reg [4:0 ]address2; wire [4:0] m; // wire done; reg [19:0]invr; reg [20:0] ampout_r; reg [20:0] ampout_r1; wire [20:0] ampout; reg [20:0] ampoutr1,ampoutr2,ampoutr3,ampoutr4; wire [19:0] inv_r1; wire [19:0] inv_r2; reg [20:0] diff_r; reg [19:0] diffr; reg [19:0] diff; reg [19:0] N; reg [19:0] N1; reg en; always @(