作业帮 > 体裁作文 > 教育资讯

cordic算法原理

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/02 05:36:25 体裁作文
cordic算法原理体裁作文

篇一:CORDIC算法原理及matlab仿真

.1、坐标旋转数字计算机CORDIC

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

1.2、CORDIC原理

如图所示,初始向量(X(0),Y(0))旋转θ角度之后得到向量(X1,Y1),此向量有如下关系:

CORDIC算法

X1=X0*cos(θ)-Y0*sin(θ)=cos(θ)(X0-Y0*tan(θ))

Y1=Y0*cos(θ)+X0*sin(θ)=cos(θ)(Y0+X0*tan(θ))

注:θ为待求角

假设初始向量经过N次旋转之后得到新向量,且每次旋转角度δ正切值都为2的倍数,则第i次旋转角度为δ=arctan(2^(-i)),即cosδ=(1/(1+2^(-2i)))^0.5。

容易得到角度θ≈∑S(i)●δ(i),其中S(i)=1或-1,表示旋转角度的方向, 第i步旋转可以表示为:

X(i+1)=((1/(1+2^(-2i)))^0.5)●(X(i)-S(i)Y(i)2^(-i))

Y(i+1)=((1/(1+2^(-2i)))^0.5)●(Y(i)+S(i)X(i)2^(-i))

其中(1/(1+2^(-2i)))^0.5)称为校模因子,当旋转次数一定时,趋于一个常数,Π(1/(1+2^(-2i)))^0.5)≈0.6073

这样,算法每一步就可以简化为:

X(i+1)=0.6073●(X(i)-S(i)Y(i)2^(-i))

Y(i+1)=0.6073●(Y(i)+S(i)X(i)2^(-i))

从而可以看出,对于移动的角度θ,现在只需要硬件加减法器和移位器就可以算出结果。引入Z,表示i次旋转后相位累加的部分和,则:

Z(i+1)=Z(i)-S(i)arctan(2^(-i))

经过n次旋转之后,Z→0,即与目标角重合,即:

X(n)=X1=X0*cos(θ)-Y0*sin(θ)

Y(n)=Y1=Y0*cos(θ)+X0*sin(θ)

1.3、三角函数的计算

以sin/cos计算为例,可利用正/余弦的和角公式递归进行:

cos(a+b) = cos(a)cos(b) – sin(a)sin(b) = cos(a) [cos(b) – tan(a)sin(b)] sin(a+b) = sin(a)cos(b) + cos(a)sin(b) = cos(a) [tan(a)cos(b) +sin(b)] 取a=arctan(2^-k), 即tan(a)=2^-k, 则cos(b) – tan(a)sin(b) 可通过移位和减法来实现。

如果角度z可以表示为z = s0 arctan(2^0) + s1 arctan(2^-1) + ... + sn arctan(2^-n), 其中s0, s1, ..., sn取+1或-1(+1可以理解为逆时针转角,即加上一个角度; -1则相反) ,那么角度z的sin/cos计算可以通过一系列的移位和加减运算来实现。注意到cos(sk arctan(2^-k))=cos(arctan(2^-k)) 与转角方向无关。此外,z应取第一项限角度(收敛域),对於其他项限角度,可由其第一项限对应角度变换得到。

相类似地,sinh/cosh的计算利用以下公式:

cosh(a+b) = cosh(a)cosh(b) + sinh(a)sinh(b) = cosh(a) [cosh(b) + tanh(a)sinh(b)]

sinh(a+b) = sinh(a)cosh(b) + cosh(a)sinh(b) = cosh(a) [tanh(a)cosh(b) + sinh(b)]

取a=arctanh(2^-k), 即tanh(a)=2^-k, 则cosh(b) + tanh(a)sinh(b) 可通过移位和减法来实现。如果参数z可以表示为z = s1 arctanh(2^-1) + s2

arctanh(2^-2) + ... + sn arctanh(2^-n), 其中s1, s2, ..., sn取+1或-1 ,那么z的sinh/cosh计算可以通过一系列的移位和加减运算来实现。

z应取[-ln2, ln2]范围内的值,否则应先预处理 z = z’– pln2, 求得cosh(z’)/sinh(z’)的值,则

cosh(z) = cosh(z’)cosh(pln2) + sinh(z’)sinh(pln2) = ½[cosh(z’) + sinh(z’)]2^p + ½[cosh(z’) – sinh(z’)]2^-p

sinh(z) = sinh(z’)cosh(pln2) + cosh(z’)sinh(pln2) = ½[cosh(z’) + sinh(z’)]2^p + ½[sinh(z’) – cosh(z’)]2^-p 。

sin/cos和sinh/cosh的计算是CORDIC算法的两个特例,CORDIC算法可描述如下:

给定初始值x(0), y(0), z(0),

x(k+1) = x(k) – ms(k)y(k)2^-q(m,k), y(k+1) = y(k) + s(k)x(k) 2^-q(m,k), z(k+1) = z(k) – s(k)d(k),

其中m表示模式,q(m,k) 为移位序列,s(k) 取+1或-1表示旋转方向,d(k) 为递进角度。

1.4、CORDIC的MATLAB 运算

以cos(a)/sin(a)计算为例,m = 1, x(0) = 1, y(0) = 0, z(0) = a, s(k) = sign(z(k)),移位序列q(1,k): 0, 1, 2, ..., 递进角度为

d(k)=arctan(2^-q(1,k)) 。

下面是实现的Matlab程序(保存为m文件):

function [sin,cos] =cordic(angle);

% 初始化

x = 1;

z = angle;

a = 0;

d = 1;

k = 0.6073; %K 增益

x = k*x;

while a<100 %此处不能判断d的符号控制循环,会死循环.应用a次数控制. if z >=0

d=1;

else

d=-1;

end

%迭代

xNew=x;

x=xNew-(y*d*(1/2^a));

y=y+(xNew*d*(1/2^a));

z=z-(d*(atan(1/2^a)));

a=a+1;

end

cos= x

sin= y

k值为cos(arctan(1)), cos(arctan(2^-1)), ..., cos(arctan(2^-K) 的连积值,收敛为0.6072529350。

以cosh(a)/sinh(a)计算为例,m = -1, x(0) = 1, y(0) = 0, z(0) = a, s(k) = sign(z(k)),移位序列q(-1,k): 1, 2, 3, 4, 4, 5, ... (3n+1重复两?a href="http://www.zw2.cn/zhuanti/guanyuwozuowen/" target="_blank" class="keylink">我员Vな樟玻?4, 13, 40, ...), 递进角度为d(k)=arctanh(2^-q(-1,k)) 。

通过对初始值和旋转方向s(k) 的选择,模式m=0可以计算乘法和除法; 模式m=1可以计算sin/cos/arcsin/arccos/arctan; 模式m=-1可直接计算

sinh/cosh/exp/arctanh/ln/sqrt, 间接计算arcsinh/arccosh,参见[1]。 MATLAB 代码实现2:

m=1;

u=1;

K=1.6468;

a=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ];

y0=0;

x0=1/K;

angle = 30;

z0=angle*pi/180;

for i=1:length(a)

x=x0-m*u*y0*2^(-a(i));

y=y0+u*x0*2^(-a(i));

z=z0-u*atan(2^(-a(i)));

x0=x;

y0=y;

u=sign(z0);

end

cosine = x;

sine = y;

编辑本段现实意义

由于具有频率精度高、转换时间短、频谱纯度高以及频率相位易编程等特点,数控振荡器(NCO)被广泛应用于软件无线电数字上、下变频以及各种频率和相位数字调制解调系统中。NCO传统的实现方法主要有查表法、多项式展开法或近似法,但这些方法在速度、精度、资源方面难以兼顾。而采用CORDIC算法来实现超函数时,则无需使用乘法器,它只需要一个最小的查找表(LUT),利用简单的移位和相加运算,即可产生高精度的正余弦波形,尤其适合于FPGA的实现。

数字控制振荡器(NCO,numerical controlled oscillator)是软件无线电、直接数据频率合成器(DDS,Direct digital synthesizer)、快速傅立叶变换(FFT,Fast Fourier Transform)等的重要组成部分,同时也是决定其性能的主要因素之一,随着芯片集成度的提高、在信号处理、数字通信领域、调制解调、变频调速、制导控制、电力电子等方面得到越来越广泛的应用。

篇二:CORDIC算法

电子系统设计实验

生姓名 级 号 绩 周鹏勋 电信093 09401200325 谭会生 导教师

电气与信息工程学院

2012年12 月 7日

CORDIC算法设计

一、设计目的:

1、 掌握并熟悉使用EDA软件。

2、 更加了解EDA的这种模块化设计思想。

3、 能够熟练使用verilog语言。

4、 掌握CORDIC算法的原理。

二、设计思想:

ODRDIC算法( Coordinate Rotational Digital Computer,坐标旋转计算机)是一种用于计算一些常用的基本运算函数和算术操作的循环迭代算法。其基本思想是用~系列与运算基数相关的角度的不断偏摆从而逼近所需旋转的角度,从广义上讲它是一个数值性计算逼近的方法,由于这些固定的角度与计算基数有关,运算只有移位和加/减。若用传统的乘、除等计算方法,需要占用大量的 资源,甚至有时是难以实现的,这样就不能满足设计者的要求。IC算法正是为解决这种问题而产生的,它在硬件电路的实现上只用到了移位和加僦,就大大节约了FFGA的资源,使得这些算法在硬件上可以得到较好地实现,从而可以满足设计者的要求。本文讨论了∞ RDIC算法的 实现,并借助Ⅱ)A工具和硬件描述语言删.对这种算法进行验证和实现。

CORDIC算法包含圆周系统,线性系统,双曲系统三种旋转系统。本文仅以圆周系统推导如下。该系统完成的是一个平面坐标旋转如图1所示,可以看出,将向量(X , )旋转 角,得到一个新的向量(Xi,Yi),那么有:

式中R为圆周的半径, 为旋转角度。写成矩阵形式:

三、实验步骤:

1、流水线单元电路设计:

module cordicpipe(clk,ena,xi,yi,zi,xo,yo,zo);

parameter width = 16;

parameter pipeid = 1;

input clk,ena;

input[width-1:0]xi,yi;

input[19:0]zi;

output[19:0]zo;

output[width-1:0]xo,yo;

wire[width-1:0]dx,dy,xcatan,ycatan;

wire[19:0]atan,zcatan;

wire zneg,zpos;

reg[width-1:0]xo,yo;

reg[19:0]zo;

assign dx = delta(xi,pipeid);

assign dy = delta(yi,pipeid);

assign atan = catan(pipeid); assign zneg = zi[19]; assign zpos = !zi[19]; assign xcatan = addsub(xi,dy,zneg); assign ycatan = addsub(yi,dx,zpos); assign zcatan = addsub(zi,atan,zneg); always @(posedge clk) begin if(ena) begin xo = xcatan; yo = ycatan; zo = zcatan; end end function [19:0]catan; input n; begin case(n) 0:catan = 20'h20000; 1:catan = 20'h12e40; 2:catan = 20'h9fb4; 3:catan = 20'h5111; 4:catan = 20'h28b1; 5:catan = 20'h145d; 6:catan = 20'h0a2f; 7:catan = 20'h0518; 8:catan = 20'h028c; 9:catan = 20'h0146; 10:catan = 20'h0a3; 11:catan = 20'h0051; 12:catan = 20'h0029; 13:catan = 20'h0014; 14:catan = 20'h000a; 15:catan = 20'h0005; 16:catan = 20'h0003; 17:catan = 20'h0001; default:catan = 20'h0000; endcase end endfunction function[15:0]delta;

parameter w1 = 16;

parameter w2 = 4;

parameter lo = 12;

input[15:0]arg;

input[3:0]cnt;

reg[15:0]tmp;

integer n;

begin

for(n=15;n>lo;n=n-1)

begin

tmp[n] = arg[w1-1];

end

for(n=11;n>0;n=n-1)

begin

tmp[n] = arg[n+4];

end

delta = tmp;

end

endfunction

function[19:0]addsub;

input[9:0]dataa,datab;

input add_sub;

begin

if(add_sub)

addsub = dataa+datab;

else

addsub = dataa-datab;

end

endfunction

endmodule

2、基于流水线实现CORDIC算法:

module cordic(clk,ena,xi,yi,zi,xo,yo);

parameter pipeliine = 15;

parameter width = 16;

input clk,ena;

input[width-1:0]xi,yi,zi;

output[width-1:0]xo,yo;

wire[width-1:0]xo,yo;

wire[width-1:0]x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16; wire[width-1:0]y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16; wire[19:0]z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14,z15,z16; assign x0 = xi;

assign y0 = yi;

assign z0 = {zi,4'b0000};

cordicpipe uu0(clk,ena,x0,y0,z0,x1,y1,z1);

defparam uu0.width = width;

defparam uu0.pipeid = 1;

篇三:cordic算法及其FPGA硬件实现 毕业论文

摘要

摘要

随着超大规模集成电路(Very Large Scale Integrated circuit,VLSI)技术的飞速发展,经常需要用硬件快速和精确的进行一些常用的函数计算,而坐标旋转算法(Coordinate Rotational Digital Computer, CORDIC)能够将多种难以用硬件电路直接实现的复杂函数运算分解为统一的加减、移位操作,极大的降低了硬件设计的复杂性。因此,对CORDIC算法进行研究并在FPGA中实现是非常有必要的。

本文是在深入研究CORDIC算法的基础上,讨论了算法实现其基本函数的过程,利用FPGA设计并实现CORDIC算法。并且在比较了不同的方法的基础上,采用流水线结构设计实现CORDIC算法的IP核,使得算法结构较为简单,适于硬件实现。首先对所设计的程序在Matlab上搭建模型验证程序的可行性。然后在XILINX的ISE集成开发环境中完成代码的编写,最后在modelsim上进行RTL代码的仿真测试。仿真结果验证了本设计中CORDIC算法实现的真确性和有效性。

关键词:CORDIC算法;FPGA;坐标旋转算法;二分查找法;流水线结构

ABSTRACT

ABSTRACT

With the fast development of very large scale integrated circuits, hardware is often used in the quick and accurate some common functions calculation. Coordinate Rotation Digital Computer (CORDIC) can disassemble complex operations which are hardly achieved by the hardware circuit directly into unitive plus-minus and shift operation, decreasing the complexity of the hardware design. Therefore, Research and Implementation of CORDIC Algorithms based on FPGA is very necessary.

Based on the deeply research of CORDIC algorithm, the thesis discussed the application of this algorithm to achieve some basic function. Then, take the realization of coordinate by using CORDIC algorithm for instance, it was designed and carried out in the FPGA. And on the basis of comparison of the different methods, CORDIC algorithm is realized by using pipelining structure design of IP core, makes the

algorithm structure is simple, Suitable for hardware implementation. First of all, build the model in Matlab to test the feasibility of the program. Then, write the code in XILINX ISE. Finally, simulated the program in modelsim in order to validating the data is correct.

Key words: cordic algorithm; FPGA; Coordinate rotation algorithm; Binary search method; pipeline architecture

目 录

摘要 ............................................................................................................................... 1

ABSTRACT .................................................................................................................. 2

第一章 绪论 ................................................................................................................. 1

1.1 CORDIC 算法的研究背景 ............................................................................ 1

1.1.1 CORDIC算法的发展历史和特点 ...................................................... 1

1.1.2 CORDIC算法的应用现状 .................................................................. 2

1.2 国内外研究动态和选题意义......................................................................... 2

1.2.1 国内外研究动态.................................................................................. 2

1.2.2 论文的选题意义.................................................................................. 4

1.3 论文结构安排................................................................................................. 4

第二章 CORDIC算法基本原理及工作模式 ............................................................ 6

2.1 CORDIC算法基本原理 ................................................................................. 6

2.2 CORDIC算法的两种工作模式 ..................................................................... 9

2.2.1 CORDIC算法的旋转模式 .................................................................. 9

2.2.2 CORDIC算法的向量模式 ................................................................ 10

2.3 本章小结....................................................................................................... 11

第三章 CORDIC算法的FPGA设计 ..................................................................... 12

3.1 FPGA设计概述 ............................................................................................ 12

3.1.1 FPGA简介 ......................................................................................... 12

3.1.2 FPGA的基本特点 ............................................................................. 13

3.1.3 FPGA的设计流程 ............................................................................. 14

3.2 集成开发环境ISE概述............................................................................... 15

3.2.1 集成开发环境ISE简介.................................................................... 15

3.2.2 ISE集成工具及其基本功能.............................................................. 16

3.3 CORDIC算法的FPGA 串行结构实现 ...................................................... 17

3.3.1 CORDIC算法的结构框图 ................................................................ 17

3.3.2 CORDIC算法的verilog描述 ........................................................... 18

3.4 本章小结....................................................................................................... 24

第四章 CORDIC算法的仿真 .................................................................................. 26

4.1 Modelsim仿真软件 ...................................................................................... 26

4.1.1 Modelsim仿真软件简介 ................................................................... 26

4.1.1 Modelsim仿真软件特点 ................................................................... 26

4.2 Simulink软件 ................................................................................................ 27

4.2.1 Simulink简介 ..................................................................................... 27

4.2.2 Simulink功能 ..................................................................................... 27

4.2.3 Simulink特点 ..................................................................................... 28

4.3 CORDIC算法在Modelsim上进行功能仿真 ............................................. 28

4.4 CORDIC算法在Simulink与Modelsim上的联合仿真............................. 32

4.5 本章小结....................................................................................................... 34

第五章 总结与展望 ................................................................................................... 35

5.1 论文总结....................................................................................................... 35

5.2 研究课题展望............................................................................................... 36

参考文献 ..................................................................................................................... 37

致谢 ............................................................................................................................. 39

第一章 绪论

1.1 CORDIC 算法的研究背景

1.1.1 CORDIC算法的发展历史和特点

CORDIC(Coordinate Rotational Digital Computer-坐标旋转数字计算机)算法最早由 J.Volder 等人于 1959 年在美国航空控制系统的设计中提出,他的基本思想是:通过坐标轴旋转得出一个二维的函数关系式,对初始角度进行数值线性逼近,把初始角度的旋转转化成一系列基本角度逐次旋转完成,然后运用递推原理,得出一组递推公式,把每次递推得到的角度加进去,转换成一组三维的函数关系式,进一步推导,最终用圆周模型、线性模型、双曲线模型实现了加减乘除、三角函数、双曲线三角函数、平方根,指数、对数等函数的运算。20 年后,随着VLSI 的产生和迅速发展,CORDIC 算法开始被重视,并得到了广泛的应用。原始算法描述的是二维的旋转,它被应用于数字信号处理(如:傅里叶变换、数字滤波器)、计算机图像处理和机器人技术等领域。

1971年 J.S.Walther提出了统一的CORDIC算法形式它把圆周旋转 (Circularmode)双曲旋转 、(Hyperbolic mode)和线性旋转(Linear mode)统一到同一个CORDIC迭代方程里,使得采用同一套硬件设备实现多种运算功能成为可能。在1980年,Haviland和Tuszynski设计研发了一个CORDIC 处理器,它用一个迭代程序计算圆周、线性和双曲线函数。在1993年,duprat 和 muller进一步讨论了用一个冗余数字系统来描述符号位的可能性。

CORDIC算法起源于坐标的旋转,若要求平面矢量进行θ角度的旋转,则将此角度值分解θ用一组预先规定的基本角度的线性组合逼近,即进行多次大小为基本角度集内的对应角度值的旋转。而每次角度的偏转与旋转的次数相关,因此,算法将角度的基值设置为2的幂次方,幂指数用次数表示,这样,硬件编程语言可以通过移位和相加完成。这样,可以充分发挥硬件的优势,利用硬件资源,实现硬件与算法相结合的一种优化方案,由于CORDIC兼顾了简单、功耗、速度等方面的性能,特别适合VLSI(Very Large Scale Integrated circuits),超大规模集成电路实现。

在数字信号处理中,高速高精度的三角函数发生器有着广泛的应用,在通常情况下,计算三角函数、反三角函数、双曲线函数和其它超越函数有效的方法有:ROM查找表法、多项式近似法(主要是利用泰勒级数近似)、CORDIC法。

篇四:CORDIC算法设计

电子系统设计实验

(转载于:www.smhaida.com 海 达 范 文网:cordic算法原理)

生姓名 级 号 绩 X X 电子信息093班 09401200XXX XXX 导教师 电气与信息工程学院

2012年12 月 7日

CORDIC算法设计

一、设计目的:

1、 掌握并熟悉使用EDA软件。

2、 更加了解EDA的这种模块化设计思想。

3、 能够熟练使用verilog语言。

4、 掌握CORDIC算法的原理。

二、设计思想:

ODRDIC算法( Coordinate Rotational Digital Computer,坐标旋转计算机)是一种用于计算一些常用的基本运算函数和算术操作的循环迭代算法。其基本思想是用~系列与运算基数相关的角度的不断偏摆从而逼近所需旋转的角度,从广义上讲它是一个数值性计算逼近的方法,由于这些固定的角度与计算基数有关,运算只有移位和加/减。若用传统的乘、除等计算方法,需要占用大量的 资源,甚至有时是难以实现的,这样就不能满足设计者的要求。IC算法正是为解决这种问题而产生的,它在硬件电路的实现上只用到了移位和加僦,就大大节约了FFGA的资源,使得这些算法在硬件上可以得到较好地实现,从而可以满足设计者的要求。本文讨论了∞ RDIC算法的 实现,并借助Ⅱ)A工具和硬件描述语言删.对这种算法进行验证和实现。

CORDIC算法包含圆周系统,线性系统,双曲系统三种旋转系统。本文仅以圆周系统推导如下。该系统完成的是一个平面坐标旋转如图1所示,可以看出,将向量(X , )旋转 角,得到一个新的向量(Xi,Yi),那么有:

式中R为圆周的半径, 为旋转角度。写成矩阵形式:

三、实验步骤:

1、流水线单元电路设计:

module cordicpipe(clk,ena,xi,yi,zi,xo,yo,zo);

parameter width = 16;

parameter pipeid = 1;

input clk,ena;

input[width-1:0]xi,yi;

input[19:0]zi;

output[19:0]zo;

output[width-1:0]xo,yo;

wire[width-1:0]dx,dy,xcatan,ycatan;

wire[19:0]atan,zcatan;

wire zneg,zpos;

reg[width-1:0]xo,yo;

reg[19:0]zo;

assign dx = delta(xi,pipeid);

assign dy = delta(yi,pipeid);

assign atan = catan(pipeid); assign zneg = zi[19]; assign zpos = !zi[19]; assign xcatan = addsub(xi,dy,zneg); assign ycatan = addsub(yi,dx,zpos); assign zcatan = addsub(zi,atan,zneg); always @(posedge clk) begin if(ena) begin xo = xcatan; yo = ycatan; zo = zcatan; end end function [19:0]catan; input n; begin case(n) 0:catan = 20'h20000; 1:catan = 20'h12e40; 2:catan = 20'h9fb4; 3:catan = 20'h5111; 4:catan = 20'h28b1; 5:catan = 20'h145d; 6:catan = 20'h0a2f; 7:catan = 20'h0518; 8:catan = 20'h028c; 9:catan = 20'h0146; 10:catan = 20'h0a3; 11:catan = 20'h0051; 12:catan = 20'h0029; 13:catan = 20'h0014; 14:catan = 20'h000a; 15:catan = 20'h0005; 16:catan = 20'h0003; 17:catan = 20'h0001; default:catan = 20'h0000; endcase end endfunction function[15:0]delta;

parameter w1 = 16;

parameter w2 = 4;

parameter lo = 12;

input[15:0]arg;

input[3:0]cnt;

reg[15:0]tmp;

integer n;

begin

for(n=15;n>lo;n=n-1)

begin

tmp[n] = arg[w1-1];

end

for(n=11;n>0;n=n-1)

begin

tmp[n] = arg[n+4];

end

delta = tmp;

end

endfunction

function[19:0]addsub;

input[9:0]dataa,datab;

input add_sub;

begin

if(add_sub)

addsub = dataa+datab;

else

addsub = dataa-datab;

end

endfunction

endmodule

2、基于流水线实现CORDIC算法:

module cordic(clk,ena,xi,yi,zi,xo,yo);

parameter pipeliine = 15;

parameter width = 16;

input clk,ena;

input[width-1:0]xi,yi,zi;

output[width-1:0]xo,yo;

wire[width-1:0]xo,yo;

wire[width-1:0]x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16; wire[width-1:0]y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16; wire[19:0]z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14,z15,z16; assign x0 = xi;

assign y0 = yi;

assign z0 = {zi,4'b0000};

cordicpipe uu0(clk,ena,x0,y0,z0,x1,y1,z1);

defparam uu0.width = width;

defparam uu0.pipeid = 1;

篇五:CORDIC算法简介

CORDIC算法简介

CORDIC算法是一种旋转坐标的方法.设起点坐标为(x(1),y(1)),终点坐标为(x(2),y(2))。 由三角函数知识,得到旋转后的新坐标为

x(2)?x(1)cos??y(1)sin??cos?(x(1)?y(1)tan?)y

(2)

?xsin??ycos??cos?(x?ytan?)

(1)(1)(1)(1)

把cos?去掉后相当于把旋转后矢量的模减小了,为了保证最终的结果正确,一般在结果的后面乘上一个系数K。如果把?约束成tan??2?i(i?0,1,2,L),则正切项的乘法就变成了

i加1,cos?简单的二进制的移位运算,没旋转一次,由于在??/2~?/2内,无论?正负,

始终是正值,因而可以讲上式改为

?xi?1?Ki(xi?yitan?)

?

?yi?1?Ki(yi?xitan?)

?i其中,Ki?cos(arctan2)?1/di??1(当逆时针旋转时di??1,顺时针旋转

时di??1)。又因为

1

arctan2?i?arctan2?(i?1)?arctan2?i

2

所以

?

?arctan2?i?

i?0

?

2

事实上

?arctan2

i?0

?

?i

?99.883

也就是说,假设我们从X轴开始旋转,通过一些列逐次减少的角度旋转后,只要迭代的次数足够多,就可以实现??/2~?/2内任意角度的旋转,并且通过加法和移位运算得到目的的横坐标和纵坐标。每次旋转后得到的实际矢量和目标矢量之间的误差角度(目标角度减去实际角度)如下式:

Zi?1?Zi[arctan2?i]

其中,Z0为目标矢量角度,若Zi?0,则di??1。实际迭代后累计角度为:

ai?1?ai?di[arctan2?i]

其中,a0?0。例如,要实现68的矢量旋转,我们可以列出第i次对应的旋转角度、旋转方向、迭代后的实际角度和误差

o

旋转68的CORDIC实现

o

一旦Zi()迭代的次数确定了,?Ki也就确定了,Ki的乘积可以在实现时不做处理,而是被当做整个系统处理增益的一部分,实际的增益取决于迭代次数n。

An??当n趋于无穷大时,An的极限值约为1.647。在实现CORDIC算法时,由于An当作系统的处理增益不做处理,因此只需要移位、相加运算就可完成矢量旋转,很适合在FPGA中实现。

体裁作文