目录
1.源码获取方式
2.算法描述
3.部分程序
4.部分仿真图预览
1.源码获取方式
使用版本matlab2022a
获取方式1:
点击下载链接(解压密码C+123456):
m基于FPGA的cordic算法实现,输出sin和cos波形
获取方式2:
如果下载链接失效,加博主微信联系,或私信联系。
2.算法描述
CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。
Cordic算法可以利用简单的移位和加减来计算复杂的三角函数、双曲函数、对数、指数等。
Cordic算法核心思想有两点,通过已知的角度来逼近输入的角度(用移位来代替tanθ),已知角度的cosθ经过多次积累相乘趋于常数。
CORDIC为Coordinate rotation digital computer的缩写,来自于J.E.Volder发表于1959年的论文中,是一种不同于“paper and pencil”思路的一种数字计算方法,当时专为用于实时数字计算如导航方程中的三角关系和高速率三角函数坐标转换而开发。如今看来,CORDIC非但没有局限于以上方面,反而在各个数字计算如信号处理、图像处理、矩阵计算、自动控制和航空航天等各领域获得了广泛的使用并成为了各行业不可替代的基石。所谓万物皆可信号处理,信号处理相关行业的各位与CORDIC自然难舍难分。又所谓“为人不识CORDIC,读尽算法也枉然”,CORDIC算法并不新鲜,今天老生常谈下CORDIC算法,尽量将每一步公式的变换展示清楚,希望对新手有用。
ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐。其基本思想是通过一系列逐次递减的、与运算基数相关的往复偏摆以逼近最终需要达到的旋转角度。该算法仅利用加法和移位两种运算通过迭代方式进行矢量旋转, CORDIC算法由于只采用加法和移位运算,因此很适合在FPGA中实现,它可以用来实现数字下变频中的NCO、混频器和坐标变换等功能。
实现NCO的另一种方法是采用基于坐标旋转数字式计算机的算法,即CORDIC算法,基本思想是采用逐次逼近的方法实现三角函数的计算。该算法的突出优点是,仅做加减和移位运算,结合流水线,可以实现每一个时钟周期输出一个经过n次迭代的结果。
通过迭代的方式,可以用如下的式子可以知道其表达式为:
:
3.部分程序
//?????1?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx1<=8'b0000_0000;y1<=8'b0000_0000;z1<=8'b0000_0000;end
else beginif(z0[7]==1'b0)beginx1 <= x0 - y0;y1 <= y0 + x0;z1 <= z0 - 8'h20; //45degendelse beginx1 <= x0 + y0;y1 <= y0 - x0;z1 <= z0 + 8'h20; //45degendend
end//?????2?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx2<=8'b0000_0000;y2<=8'b0000_0000;z2<=8'b0000_0000;end
else beginif(z1[7]==1'b0)beginx2 <= x1 - {y1[7],y1[7:1]};y2 <= y1 + {x1[7],x1[7:1]};z2 <= z1 - 8'h12; //26degendelse beginx2 <= x1 + {y1[7],y1[7:1]};y2 <= y1 - {x1[7],x1[7:1]};z2 <= z1 + 8'h12; //26degendend
end//?????3?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx3<=8'b0000_0000;y3<=8'b0000_0000;z3<=8'b0000_0000;end
else beginif(z2[7]==1'b0)beginx3 <= x2 - {{2{y2[7]}},y2[7:2]};y3 <= y2 + {{2{x2[7]}},x2[7:2]};z3 <= z2 - 8'h09; //14degendelse beginx3 <= x2 + {{2{y2[7]}},y2[7:2]};y3 <= y2 - {{2{x2[7]}},x2[7:2]};z3 <= z2 + 8'h09; //14degendend
end//?????4?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx4<=8'b0000_0000;y4<=8'b0000_0000;z4<=8'b0000_0000;end
else beginif(z3[7]==1'b0)beginx4 <= x3 - {{3{y3[7]}},y3[7:3]};y4 <= y3 + {{3{x3[7]}},x3[7:3]};z4 <= z3 - 8'h04; //7degendelse beginx4 <= x3 + {{3{y3[7]}},y3[7:3]};y4 <= y3 - {{3{x3[7]}},x3[7:3]};z4 <= z3 + 8'h04; //7degendend
end //?????5?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx5<=8'b0000_0000;y5<=8'b0000_0000;z5<=8'b0000_0000;end
else beginif(z4[7]==1'b0)beginx5 <= x4 - {{4{y4[7]}},y4[7:4]};y5 <= y4 + {{4{x4[7]}},x4[7:4]};z5 <= z4 - 8'h02; //4degendelse beginx5 <= x4 + {{4{y4[7]}},y4[7:4]};y5 <= y4 - {{4{x4[7]}},x4[7:4]};z5 <= z4 + 8'h02; //4degendend
end //?????6?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx6<=8'b0000_0000;y6<=8'b0000_0000;z6<=8'b0000_0000;end
else beginif(z5[7]==1'b0)beginx6 <= x5 - {{5{y5[7]}},y5[7:5]};y6 <= y5 + {{5{x5[7]}},x5[7:5]};z6 <= z5 - 8'h01; //2degendelse beginx6 <= x5 + {{5{y5[7]}},y5[7:5]};y6 <= y5 - {{5{x5[7]}},x5[7:5]};z6 <= z5 + 8'h01; //2degendend
end
4.部分仿真图预览
01_115m