FPGA实现CORDIC算法

  |  

1.1CORDIC算法简介

坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如Sin,Cos,Sinh,Cosh等函数,由J. Volder于1959年提出,首先用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。J. Walther在1974年用它研究了一种能计算出多种超越函数的统一算法。

2.1FPGA设计

FPGA中的设计逻辑结构如图所示:

image

在modelsim中验证程序:

z θ y 实际值 理想值 误差
25736 90° 0011 1111 1111 1111 0.999877 1.0 -0.000123
20017 70° 0011 1100 0010 0001 0.939514 0.939692 -0.000178
12868 45° 0010 1101 0100 0010 0.70715 0.707106 0.000044
8579 30° 0001 1111 1111 1101 0.499816 0.5 -0.000194
2860 10° 0000 1011 0010 0001 0.173889 0.173648 0.000241
0 0000 0000 0000 0100 0.000244 0 0.000244
z θ x 实际值 理想值 误差
25736 90° 0000 0000 0000 0010 0.000122 0 0.000122
20017 70° 0001 0101 1110 0101 0.342102 0.342020 0.000082
12868 45° 0010 1101 0100 0010 0.70715 0.707106 0.000044
8579 30° 0011 0111 0110 1111 0.86615 0.866025 0.000125
2860 10° 0011 1111 0000 0110 0.984741 0.984808 -0.000067
0 0011 1111 1111 1111 0.999877 1.0 -0.000123

得到的二进制数值含义为:

0:符号位 0表示正数,1表示负数

0:整数位 0:整数为0,1整数为1

1:小数第一位:1表示小数为0.5…

这里提示可以找网上的进制转换器(支持浮点运算的即可)

比如这个进制转换器,想算出实际值的话,把输出的16位二进制数扔进去,删掉开头两个0,也就是剩14位,然后在开头加上0.就变成小数形式,直接转换出来的就是十进制答案


2.2必要说明

testbench代码段中,看注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
initial
begin
clk = 0;
rst = 1;
z = 0;
#5 rst = 0;
#50 z = 25736;
/*这里有个坑,如果#xx的这个间隔时间过短,仿真结果会有问题,建议#20以上*/
#50 z = 20017;
#50 z = 12868;
#50 z = 8579;
#50 z = 2860;
#50 z = 2860;

#1000 $stop;
end

2.3仿真实际结果图

image

tips: 仿真出来的这一小段一小段的数字可以直接用鼠标点右键操作复制

文章目录
  1. 1.1CORDIC算法简介
  2. 2.1FPGA设计
    1. 2.2必要说明
    2. 2.3仿真实际结果图
本站总访问量 | 本页面被访问 | 本站访客数
载入天数...载入时分秒...