资源描述:
《基于cordic算法的平方根计算模块的verilog实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、例2-28基于C0RD1C算法的平方根计算模块的Verilog实现。①MATLAB代码为了便于读者理解,首先用MATLAB实现计算sqrt(x2+y2)的Cordic算法,代码如下:functionXout=mysqrt(x,y);K二8;An=1;fori=1:Ka(i)=l/(27i));An=An*sqrt(1+1/(4i));end%anger=atan(a);%计算出的角度theta=0;fori=1:Ksigma=-sign(y);x=x-sigma^y/(2"i);y=y+sigma^x/(2^i);%z=z-
2、sigma^a(i);endXout=x/An;经过测试,上述程序可利用Cordic算法来计算输入数据平方和的根。②Verilog代码modulemysqrt(clk,x,y,fout,fy);inputelk;input[15:0]x;input[15:0]y;output[15:0]fout;output[15:0]fy;reg[15:0]fout;reg[15:0]fy;//采用8级流水线来实现wire[15:0]xl,yl,x2,wire[15:0]x6,y6,x7,y2,x3,y3,x4,y4,x5,y5;y7,x
3、8,y8;//reg[15:0]xtemp,ytemp;regaddxl,addx2,addx3,addx4,addx5,addx6,addx7,addx8;regaddyl,addy2,addy3,addyd,addy5,addy6,addy7,addy8;always@(poscdgcelk)beginxtemp<=x;ytemp<=y;fout<=x8;fy<=y8;if(ytemp[15]=-=0)〈二begin1;0;endaddxladdy1elsebeginaddxl<=0;addyl1;endif(yl[15
4、]——0)beginaddx2<=1;addy2<=0;endelsebeginaddx2<=0;addy2<=1;endif(y2[15]二:0)beginaddx3〈二1;addy3<=0;endelsebeginaddx3<=0;addy3<=1;endif(y3[15]==0)beginaddx4<=1;addyd<=0;endelsebeginaddx4<=0;addy4<=1;endif(y4[15]==0)beginaddx5addy5<=<=1;0;endelsebeginaddx5<=0;endaddy5<
5、=1;if(y5[15]==0)beginaddx6<=1;addy6〈=0;endelsebeginaddx6<=0;addy6<=1;endif(y6[15]——0)beginaddx7<=1;addy7<=0;endelsebeginaddx7<=0;addy7<=1;endif(y7[15]==0)beginaddx8<=1;addy8<=0;endelsebeginaddx8<=0;addy8〈=1;endend//第1次迭代模块addandsubaddandsublx(.A(xtemp),.B({ytemp[15
6、],ytemp[15:1]}),.ADD(addxl),•Q(xl),.CLK(clk));addandsubaddandsubly(•A(ytemp),•B({xtemp[15],xtemp[15:1]}),.ADD(addyl),.Q(yl),.CLK(clk));//第2次迭代模块addandsubaddandsub2x(.A(xl),.B({{2{yl[15]}},yl[15:2n),.ADD(addx2),.Q(x2),.CLK(clk));addandsubaddandsub2y(•八(yl),.B({{2{xl
7、[15]}},xl[15:2]}),•ADD(addy2),.Q(y2),.CLK(clk));//第3次迭代模块addandsubaddandsub3x(.A(x2),.B({{3{y2[15]}},y2[15:3]}),.ADD(addx3),.Q(x3),.CLK(clk));addandsubaddandsub3y(.A(y2),.B({{3{x2[15]}},x2[15:3]}),.ADD(addy3),.Q(y3),.CLK(clk));//第4次迭代模块addandsubaddandsub4x(.A(x3),•
8、B({{4{y3[15]}},y3[15:4]}),.ADD(addx4),.Q(x4),.CLK(clk));addandsubaddandsuMy(•A(y3),.B({{4{x3[15]}},x3[15:4]}),.ADD(addy4),.Q(y4),.CLK(clk));//第5次