您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > 基于CORDIC算法的平方根计算模块的Verilog实现
例2-28基于CORDIC算法的平方根计算模块的Verilog实现。①MATLAB代码为了便于读者理解,首先用MATLAB实现计算sqrt(x2+y2)的Cordic算法,代码如下:functionXout=mysqrt(x,y);K=8;An=1;fori=1:Ka(i)=1/(2^(i));An=An*sqrt(1+1/(4^i));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-sigma*a(i);endXout=x/An;经过测试,上述程序可利用Cordic算法来计算输入数据平方和的根。②Verilog代码modulemysqrt(clk,x,y,fout,fy);inputclk;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]x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;wire[15:0]x6,y6,x7,y7,x8,y8;//reg[15:0]xtemp,ytemp;regaddx1,addx2,addx3,addx4,addx5,addx6,addx7,addx8;regaddy1,addy2,addy3,addy4,addy5,addy6,addy7,addy8;always@(posedgeclk)beginxtemp=x;ytemp=y;fout=x8;fy=y8;if(ytemp[15]==0)beginaddx1=1;addy1=0;endelsebeginaddx1=0;addy1=1;endif(y1[15]==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;addy4=0;endelsebeginaddx4=0;addy4=1;endif(y4[15]==0)beginaddx5=1;addy5=0;endelsebeginaddx5=0;addy5=1;endif(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次迭代模块addandsubaddandsub1x(.A(xtemp),.B({ytemp[15],ytemp[15:1]}),.ADD(addx1),.Q(x1),.CLK(clk));addandsubaddandsub1y(.A(ytemp),.B({xtemp[15],xtemp[15:1]}),.ADD(addy1),.Q(y1),.CLK(clk));//第2次迭代模块addandsubaddandsub2x(.A(x1),.B({{2{y1[15]}},y1[15:2]}),.ADD(addx2),.Q(x2),.CLK(clk));addandsubaddandsub2y(.A(y1),.B({{2{x1[15]}},x1[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),.B({{4{y3[15]}},y3[15:4]}),.ADD(addx4),.Q(x4),.CLK(clk));addandsubaddandsub4y(.A(y3),.B({{4{x3[15]}},x3[15:4]}),.ADD(addy4),.Q(y4),.CLK(clk));//第5次迭代模块addandsubaddandsub5x(.A(x4),.B({{5{y4[15]}},y4[15:5]}),.ADD(addx5),.Q(x5),.CLK(clk));addandsubaddandsub5y(.A(y4),.B({{5{x4[15]}},x4[15:5]}),.ADD(addy5),.Q(y5),.CLK(clk));//第6次迭代模块addandsubaddandsub6x(.A(x5),.B({{6{y5[15]}},y5[15:6]}),.ADD(addx6),.Q(x6),.CLK(clk));addandsubaddandsub6y(.A(y5),.B({{6{x5[15]}},x5[15:6]}),.ADD(addy6),.Q(y6),.CLK(clk));//第7次迭代模块addandsubaddandsub7x(.A(x6),.B({{7{y6[15]}},y6[15:7]}),.ADD(addx7),.Q(x7),.CLK(clk));addandsubaddandsub7y(.A(y6),.B({{7{x6[15]}},x6[15:7]}),.ADD(addy7),.Q(y7),.CLK(clk));//第8次迭代addandsubaddandsub8x(.A(x7),.B({{8{y7[15]}},y7[15:8]}),.ADD(addx8),.Q(x8),.CLK(clk));addandsubaddandsub8y(.A(y7),.B({{8{x7[15]}},x7[15:8]}),.ADD(addy8),.Q(y8),.CLK(clk));endmodule上述程序的RTL级结构如图比较复杂,这里就不再给出。在ModelSim6.2b中完成仿真,其结果如图2-35所示,如竖线所标,输入为170、170时,经过8个时钟周期,输出248,近似等于,如果对输出计算精度有更高的要求,则可加大迭代次数。图2-35Cordic算法的仿真结果示意图2.7本章小结本章简要介绍了Verilog硬件描述语言的发展历史和技术特点;然后介绍了相关的基本语法,这是进行FPGA设计所必须的基础知识。读者如果想要了解Verilog语言更多的细节,可参考关于Verilog语言的专著。最后给出了典型的Verilog实例,包括基本的触发器、译码器设计,常用的算术运算模块以及高级的Cordic算法模块,希望读者从中体会到Verilog的开发技巧,初步具备Verilog设计开发的基本能力。上一节下一节相关链接
本文标题:基于CORDIC算法的平方根计算模块的Verilog实现
链接地址:https://www.777doc.com/doc-7159860 .html