CORDIC算法在FPGA中的实现

合集下载

基于CORDIC算法的平方根计算模块的Verilog实现

基于CORDIC算法的平方根计算模块的Verilog实现

例2-28 基于CORDIC算法的平方根计算模块的Verilog实现。

① MATLAB代码为了便于读者理解,首先用MATLAB实现计算sqrt(x2+y2)的Cordic算法,代码如下:function Xout = mysqrt (x, y);K = 8;An = 1;for i =1: Ka(i) = 1/(2^(i));An =An*sqrt(1+1/(4^i));end%anger = atan(a); %计算出的角度theta = 0;for i = 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代码module mysqrt(clk, x, y, fout, fy);input clk;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;reg addx1, addx2, addx3, addx4, addx5, addx6, addx7, addx8; reg addy1, addy2, addy3, addy4, addy5, addy6, addy7, addy8;always @(posedge clk) beginxtemp <= x;ytemp <= y;fout <= x8;fy <= y8;if(ytemp[15] == 0) beginaddx1 <= 1;addy1 <= 0;endelse beginaddx1 <= 0;addy1 <= 1;endif(y1[15] == 0) beginaddx2 <= 1;addy2 <= 0;endelse beginaddx2 <= 0;addy2 <= 1;endif(y2[15] == 0) beginaddx3 <= 1;addy3 <= 0;endelse beginaddx3 <= 0;addy3 <= 1;endif(y3[15] == 0) beginaddx4 <= 1;addy4 <= 0;endelse beginaddx4 <= 0;addy4 <= 1;endif(y4[15] == 0) beginaddx5 <= 1;addy5 <= 0;endelse beginaddx5 <= 0;addy5 <= 1;endif(y5[15] == 0) begin addx6 <= 1;addy6 <= 0;endelse beginaddx6 <= 0;addy6 <= 1;endif(y6[15] == 0) begin addx7 <= 1;addy7 <= 0;endelse beginaddx7 <= 0;addy7 <= 1;endif(y7[15] == 0) begin addx8 <= 1;addy8 <= 0;endelse beginaddx8 <= 0;addy8 <= 1;endend//第1次迭代模块addandsub addandsub1x(.A(xtemp),.B({ytemp[15],ytemp[15:1]}),.ADD(addx1),.Q(x1),.CLK(clk));addandsub addandsub1y(.A(ytemp),.B({xtemp[15],xtemp[15:1]}),.ADD(addy1),.Q(y1),.CLK(clk));//第2次迭代模块addandsub addandsub2x(.A(x1),.B({{2{y1[15]}},y1[15:2]}), .ADD(addx2),.Q(x2),.CLK(clk));addandsub addandsub2y(.A(y1),.B({{2{x1[15]}},x1[15:2]}), .ADD(addy2),.Q(y2),.CLK(clk));//第3次迭代模块addandsub addandsub3x(.A(x2),.B({{3{y2[15]}},y2[15:3]}), .ADD(addx3),.Q(x3),.CLK(clk));addandsub addandsub3y(.A(y2),.B({{3{x2[15]}},x2[15:3]}), .ADD(addy3),.Q(y3),.CLK(clk));//第4次迭代模块addandsub addandsub4x(.A(x3),.B({{4{y3[15]}},y3[15:4]}), .ADD(addx4),.Q(x4),.CLK(clk));addandsub addandsub4y(.A(y3),.B({{4{x3[15]}},x3[15:4]}), .ADD(addy4),.Q(y4),.CLK(clk));//第5次迭代模块addandsub addandsub5x(.A(x4),.B({{5{y4[15]}},y4[15:5]}), .ADD(addx5),.Q(x5),.CLK(clk));addandsub addandsub5y(.A(y4),.B({{5{x4[15]}},x4[15:5]}), .ADD(addy5),.Q(y5),.CLK(clk));//第6次迭代模块addandsub addandsub6x(.A(x5),.B({{6{y5[15]}},y5[15:6]}), .ADD(addx6),.Q(x6),.CLK(clk));addandsub addandsub6y(.A(y5),.B({{6{x5[15]}},x5[15:6]}), .ADD(addy6),.Q(y6),.CLK(clk));//第7次迭代模块addandsub addandsub7x(.A(x6),.B({{7{y6[15]}},y6[15:7]}), .ADD(addx7),.Q(x7),.CLK(clk));addandsub addandsub7y(.A(y6),.B({{7{x6[15]}},x6[15:7]}),.ADD(addy7),.Q(y7),.CLK(clk));//第8次迭代addandsub addandsub8x(.A(x7),.B({{8{y7[15]}},y7[15:8]}),.ADD(addx8),.Q(x8),.CLK(clk));addandsub addandsub8y(.A(y7),.B({{8{x7[15]}},x7[15:8]}),.ADD(addy8),.Q(y8),.CLK(clk));endmodule上述程序的RTL级结构如图比较复杂,这里就不再给出。

CORDIC算法

CORDIC算法

Developed by:
笛卡尔坐标平面旋转
x 2 = x 1 cos θ – y 1 sin θ y 2 = x 1 sin θ + y 1 cos θ
Top
4.2
• 在 xy 坐标平面上将点 ( ( x 1, y 1 ) 旋转 θ 角度到点 ( x 2, y 2 ) 的标准方法如 下所示 :
y2
CORIDC 技术并不是什么新鲜的东西。事实上它可以追溯到 1957 年由 J. Volder 发表的一篇文章。在上个世纪 五十年代, 在大型实际的计算机中的实行移位相加受到了当时技术上的限制, 所以使用 CORDIC 变得非常必 要。到了七十年代,Hewlett Packard 和其他公司出产了手持计算器 , 许多计算器使用一个内部 CORDIC 单元来 计算所有的三角函数 ( 了解这件事的人们一定还记得,那时求一个角度的正切值需要延迟大约 1 秒中 )。 二十世纪八十年代,随着高速度乘法器与带有大存储量的通用处理器的出现, CORDIC 算法变得无关紧要了。 然而在二十一世纪的今天, 对于 FPGA 来说, CORDIC 一定是在 DSP 应用中 ( 诸如 多输入多输出 (MIMO), 波束形成以及其他自适应系统 ) 计算三角函数的备选技术。
x2 y2
例如一个 90o 相移为 :
=
cos θ – sin θ x 1 sin θ cos θ y 1
x2 y2
–y1 x1 0 – 1 = = 1 0 y1 x1
x1
y1 -y1 x2 x1
Developed by:
伪旋转
• 通过提出因数 cos θ ,方程可写成下面的形式 : x 2 = x 1 cos θ – y 1 sin θ = cos θ ( x 1 – y 1 tan θ ) y 2 = x 1 sin θ + y 1 cos θ = cos θ ( y 1 + x 1 tan θ ) • 如果去除 cos θ 项,我们得到 伪旋转 方程式 : ˆ = cos θ ( x – y tan θ ) = x – y tan θ x 2 1 1 1 1 ˆ = cos θ ( y + x tan θ ) = y + x tan θ y 2 1 1 1 1

cordic算法求角度的verilog实现

cordic算法求角度的verilog实现

cordic算法求角度的verilog实现摘要:1.引言2.CORDIC 算法原理3.Verilog 实现4.测试与结果5.结论正文:1.引言CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算法)算法是一种求解正切、余切、正弦、余弦等三角函数的算法。

该算法通过迭代坐标旋转的方式,实现角度的精确计算。

在FPGA 设计和数字信号处理领域,CORDIC 算法有着广泛的应用。

本文将介绍一种基于Verilog 的CORDIC 算法实现,以及如何用于求解角度。

2.CORDIC 算法原理CORDIC 算法的基本思想是利用简单的移位、加法和查表运算,迭代计算三角函数值。

以计算正切函数为例,假设输入角度为θ,初始化两个坐标轴(I 和Q)的值都为1,然后进行迭代计算:1)计算k*I + d*Q,其中k 为角度的整数部分,d 为角度的小数部分,I 为余弦值,Q 为正弦值。

2)更新I 和Q 的值:I = I * cos(d) - Q * sin(d),Q = I * sin(d) + Q *cos(d)。

3)判断是否达到精度要求,如果满足则输出结果,否则继续迭代。

3.Verilog 实现以下是一个基于Verilog 的CORDIC 算法求角度的实现:```verilogmodule cordic_algorithm(input wire clk,input wire reset,input wire angle_in,output reg angle_out);reg [31:0] I;reg [31:0] Q;reg [31:0] k;reg [31:0] d;always @(posedge clk or posedge reset) beginif (reset) beginI <= 1;Q <= 1;k <= 0;d <= 0;end else begin// 计算k*I + d*Q[31:0] temp_k = {angle_in[31:0], k[31]};[31:0] temp_d = {angle_in[31:0], d[31]};k <= temp_k;d <= temp_d;// 更新I 和Q 的值I <= I * cos(d) - Q * sin(d);Q <= I * sin(d) + Q * cos(d);// 判断是否达到精度要求if (abs(angle_in - (I + Q)) < 1) beginangle_out <= 32"b0;end else beginangle_out <= 32"b1;endendendendmodule```4.测试与结果为了验证CORDIC 算法的正确性,我们可以编写测试平台并在FPGA 上运行。

对称矩阵特征值分解的FPGA实现

对称矩阵特征值分解的FPGA实现

对称矩阵特征值分解的FPGA实现刘永勤【摘要】针对应用于MUSIC DOA估计的数据协方差矩阵特征值分解的需要,给出一个特征值分解的硬件实现方案,并阐述了基本思想.设计采用基于CORDIC的Jacobi算法实现实对称矩阵特征值分解,并在FPGA上对5×5矩阵进行了硬件仿真,经过理论分析和实验验证,该设计可以计算出全部特征值和特征向量,为MUSIC算法的FPGA实现奠定了基础.%Aiming at the needs of the data covariance matrix eigenvalue decomposition used in DOA estimation such as MUSIC,a hardware implementation scheme of the eigenvalue decomposition is provided and the basic idea is described in this paper. The Jacobi algorithm based on CORDIC is adopted in the design to achieve real symmetric matrix eigenvalue decomposi-tion,and conduct the hardware emulation for 5×5 matrix in FPGA. The results of theoretical analysis and experimental verifica-tion show that the design can calculate all eigenvalues and eigenvectors,and has laid the foundation for FPGA implementation of MUSIC algorithm.【期刊名称】《现代电子技术》【年(卷),期】2017(040)012【总页数】4页(P15-18)【关键词】MUSIC算法;特征值分解;Jacobi算法;CORDIC算法;FPGA【作者】刘永勤【作者单位】西安理工大学自动化与信息工程学院,陕西西安 710048;渭南师范学院数学与物理学院,陕西渭南 714099【正文语种】中文【中图分类】TN911-34;TN929.1多信号分类(MUSIC)[1]算法是波达方向(DOA)估计技术中最具代表性的高分辨力算法之一,因其突破了传统方法的瑞利极限而广受人们青睐。

CORDIC算法的优化及硬件实现

CORDIC算法的优化及硬件实现

CORDIC算法的优化及硬件实现【摘要】本文介绍了CORDIC算法的基本原理并分析了其优化的方法,在QUARTUS9.0平台上基本实现了其功能,有效的降低了资源的消耗并提升了工作频率。

【关键词】CORDIC优化;FPGA;仿真CORDIC算法全称为坐标旋转数字计算机,它是由J.V older于1959年提出,cordic的运用大大降低了常用函数如sin,cos,sinh,cosh等在硬件上实现的难度,它主要是将复杂的函数在硬件上通过加减和移位运算递归计算出函数值,由于以上特性使得这一算法特变适合在FPGA上实现。

1.CORDIC算法基本原理CORDIC算法主要是在一个平面上某一向量(x1,y1)经过旋转角后得到新的向量(x2,y2),如图1所示。

根据变换规则二者有如下关系:2.传统CORDIC算法的局限性及优化CORDIC算法在FPGA中主要通过流水线来实现,通常要将提前算出作为的输入预先存储到ROM中,随着流水线级数的增加ROM表的容量成指数增长增加了系统的资源消耗,CORDIC每次运算都要经过多次迭代随着迭代次数的增加计算速度受到很大的影响,一个结果往往要经过多个时钟周期才能得到,此外传统的CORDIC算法的角度范围受到很大的约束,旋转的最大的角度范围为-99.88≤≤99.88无法达到0≤≤360必须对输入的角度预先进行处理才能使其达到收敛针对以上情况采取优化反正切函数表来减少迭代次数,简化校正因子等可以解决资源和速度的缺陷,对于角度的收敛问题采用分象限法如表1。

对于一个15级流水线可以通过以上的方法减少到12次迭代减少了3级流水线,并且减少了ROM的使用量提高了运行效率。

3.CORDIC算法硬件的实现由于CORDIC算法主要通过加减以及移位来实现,说以特别适合在FPGA 上实现,在这里我采用Altera公司的Cyclon2器件组中的EP2C5Q208C8整个实现过程都是在Quartus9.0中完成图2为系统的整体架构。

指数函数CORDIC算法的FPGA定点化技术

指数函数CORDIC算法的FPGA定点化技术

指数函数CORDIC算法的FPGA定点化技术唐文明;刘桂雄【摘要】CORDIC算法广泛应用于多种超越函数求值,但其通用迭代算法难以用现场可编程门阵列(FPGA)计算宽范围定义域指数函数求解.为此,文中提出一种FPGA 定点化技术,通过收敛域扩张与迭代结构优化实现CORDIC算法的指数函数求值器.首先,应用区间压缩方法实现指数函数CORDIC算法的收敛域扩张;其次,对CORDIC算法的迭代结构进行优化;最后,通过对指数函数求值器的仿真分析与FPGA实现,采用15级流水线结构,用双曲系统CORDIC算法求解指数函数,实现指数函数CORDIC算法的收敛域扩张.仿真与实验表明:相比于通用CORDIC算法,所提算法的迭代模式节省约1/3硬件资源,少至2个乘法单元,使收敛域由[-1.1182,1.1182]扩张到[-6,6],运算结果相对误差达10-3.【期刊名称】《华南理工大学学报(自然科学版)》【年(卷),期】2016(044)007【总页数】6页(P9-14)【关键词】CORDIC算法;指数函数;区间压缩;收敛域;迭代结构优化;现场可编程门阵列【作者】唐文明;刘桂雄【作者单位】华南理工大学机械与汽车工程学院,广东广州510640;华南理工大学机械与汽车工程学院,广东广州510640【正文语种】中文【中图分类】TH878.2指数函数是一种常见超越函数,广泛应用于各种数值计算中.目前指数求值方法主要有查表法、泰勒展开式法、多项式逼近法等[1-5];其中查表法随结果精度提高或输入值范围增大,需大量存储单元;泰勒展开式法需要复杂求导运算以及大量的乘、除法器,速度慢、效率低;多项式逼近法算法非常复杂,且精度非常有限.基于坐标旋转数字计算 (CORDIC) 方法的基本思想是通过一系列与运算基数相关的固定角度不断旋转来逼近所需的旋转角度,其算法结构主要涉及移位、加法运算,便于硬件实现,但求解指数函数时因收敛域窄而导致定点化实现精度低[6-7].鉴于现场可编程门阵列(FPGA)灵活的时序、组合电路运行模式,可快速并行定点化信号处理等特点[8-9],文中研究了一种定点化指数函数双曲系统CORDIC算法的FPGA实现技术,并对输入值进行区间压缩以实现指数函数CORDIC算法的收敛域扩张[10],使CORDIC算法可以指数函数运算;并将该算法应用于超声相控阵的时间校准增益(Time Corrected Gain,TCG)功能[11-12].CORDIC算法作为一种通用迭代算法,通过控制向量可在线性坐标系、圆坐标系和双曲坐标系下旋转和定向操作,但指数计算通常在双曲坐标系下完成[13-15].图1为双曲函数坐标旋转模型图,图中,θ为射线OVn、双曲线和x轴围成面积的2倍(弧度值),φ为射线OV1、双曲线和x轴围成面积的2倍,分别对应阴影部分面积的2倍,双曲函数x2-y2=C2上点V1(x1,y1)沿着上半轴曲线移动到点Vn(xn,yn),可表示为将θ分解成一系列θi(i=1,2,…,n)累加和形式,即.令θi满足条件tanh θi=2-i,式(1)可表示为其中旋转方向因子为di,校模因子K为.当C=0时,双曲线x2-y2=C2最终退化为直线,暂不考虑K,则迭代递推关系为式中:i=1,2,3,…,n.为满足迭代序列收敛,迭代序列i的取值从第4项开始,当i=kn(kn=3kn-1+1,k1=4,n∈Z+)时,重复此次迭代,即i=1,2,3,4,4,...,13,13, (40)40….经过n次旋转后,有若取初值x1=y1=1/K,z1=θ,则有xn+1=yn+1=cosh z1+sinh z1=eθ.这就是双曲坐标指数函数CORDIC算法的求解机理.但根据式(3)可得双曲线坐标CORDIC算法的收敛范围为,其中,θmax为所有旋转面积(弧度)和,即该算法收敛的最大弧度值.由于θ的收敛范围较小,因而实际应用意义受到限制,必须对收敛域进行扩张处理.为解决双曲线坐标CORDIC算法收敛范围狭小的问题,需通过对收敛域进行扩展以满足指数函数求解算法的通用性.2.1 区间压缩方法实现指数CORDIC算法收敛域扩张对应任意初始值θ,令θ=Qln 2+γ,其中,使γ处于算法收敛域内,可得:eθ=eQln 2+γ=2Qeγ,由该式可以得到这样的启发:若整数Q能确定,则2Q可通过左移或右移位实现,可把eθ的计算等效转化为eγ的计算,通过区间压缩方法实现指数函数CORDIC算法的收敛域扩张.2.2 整数Q值和γ值定点化值处理若Q表示θ与ln 2相除得到商的整数部分,γ表示θ与ln 2相除得到的余数部分,则小数部分R表示为γ与ln 2相除得到的商,即:Q=[θ/ln 2],γ=θMOD ln 2,R=γ/ln 2,则R.FPGA通常实现定点数运算,故在求解Q、γ过程中必须进行定点化处理,扩大65 536 (216)倍实现定点化,把除法运算转换成乘法运算,有:.因可分解为整数Q和小数R两部分,故有式中,Q∈Z.2.3 Q值与定点化γ值的FPGA求解以输入值θ∈[-26,26)为例,对θ定点化后(扩大216 倍)取整,用[θ·216]表示,其位宽为24 bit;则定点化转成乘法运算后(扩大216·216 倍)取整,可用[θ·216·(216/ln 2)]⟺[θ·216·94 548]表示,其位宽为42 bit.图2给出对应的二进制数位结构图,用H10表示bit[41:32]共10 bit,则为整数部分Q,用L32表示bit[31:0]共32 bit,为小数部分R,则Q=H10即H10为整数部分Q值.若用LH16表示bit[31:16],则定点化小数部分,即216·γ≈ln 2·LH16.由于ln 2为浮点数,进行定点化(扩大216倍),得γ求解公式:216·216·γ=(ln 2·216)·LH16 ≈45 426·LH16则[45 426·LH16]位宽为32 bit.图3给出对应的二进制数位结构,用H16表示bit[31:16]共16 bit,如是有:216·γ=H16即H16为余数部分γ的定点化值(扩大216倍).根据式(5)-(8),基于FPGA定点化技术实现该算法,整数Q、γ定点化值求解原理框图如图4所示.由图4可见,只用到两个乘法器,即可实现整数Q、定点化余数γ值求解,实现定点化区间压缩,达到收敛域扩张的效果.3.1 指数CORDIC算法的FPGA实现图5为指数CORDIC算法求解指数函数的流水线结构图,由于坐标xn、yn的初值与迭代模式相同,可以合成为一个迭代通道,省掉坐标yn的迭代过程,这时式(3)转化为式中:i=1,2,3,…,n.式(9)中xi、zi迭代运算物理意义:算法只需用到两条迭代数据链,可省去一条迭代数据链,即仅对角度zi与坐标xi进行迭代,这种方式在硬件实现上可节省约1/3硬件资源[16],极大提高了FPGA处理算法的实时性.图6所示为指数函数CORDIC算法的Modelsim(FPGA编程语言行为级仿真软件)仿真结果.采用15级流水线CORDIC算法结构,输入定点化参数[θ·216],其中θ∈[-6,6].图中变量theta对应θ值、exp对应eθ指数函数值,横坐标对应仿真时间(10 ns仿真时钟周期),纵坐标为幅度,比如:此时垂直光标线位置对应的输入值θ=1,输出值为e1 ≈ 2.718 23,与理论值2.718 28相比,相对误差为%.收敛域θ∈[-6,6]时各输入值的FPGA运算结果如表1所示.可以看出,相对误差最大为-0.275%(扩大小数位),其相对误差达到10-3,可满足很多实际工程上精度的要求,在实际应用中可进一步扩大定点化倍数以减小相对误差.与工程上FPGA实现指数函数算法的经典查表法性能对比,可通过算法精度与所耗内存资源量进行分析.若精度提高L位(扩大10L倍),应用查表法,对应内存资源(单位:bit)为LRAM=10L而使用文中指数CORDIC算法求解器时,增加的二进制数位宽(单位:bit)为LB=L·log210≈3.321 9L因文中为15级流水线两个迭代通道,故增加的存储单元bit数约为由式(10)、(12)可得,基于FPGA指数求值器算法精度与消耗内存量增加关系,文中CORDIC算法与经典查表法的性能对比关系如表2所示.由表2可以看出,随着精度增加,指数求解器所耗内存资源文中CORDIC算法成线性增加,而经典查表法成指数增加,体现了文中CORDIC算法的优越性.3.2 指数CORDIC算法在TCG技术中的应用超声相控阵仪器为了对不同探测深度(时刻)的缺陷回波有统一的评判当量,使得相同尺寸缺陷回波幅度与其在材料中的深度无关,对不同深度的反射回波幅度进行增益dB补偿,将所有的深度补偿值连成一条曲线,即TCG曲线.算法上是通过增益控制器实现dB到放大倍数A的转换:dB=20lg A⟺A=e(dB·ln10)/20使用广州多浦乐电子科技有限公司生产的超声相控阵仪器(PA2000)对B型相控阵标准测试模块中深度5、10 mm的φ1 mm平底孔进行检测实验,通过式(13)做出一系列增益补偿曲线,其TCG技术增益补偿效果如图7所示.图中横坐标:左半部分A扫图表示回波幅度相对百分比 (单位:%)、右半部分B扫图表示水平扫查位移(单位:mm),纵坐标表示垂直扫查深度(单位:mm),图中B扫光标位置对应A扫图,曲线列举了5个点的增益补偿连线(先用标准工件检测,把不同深度相同直径缺陷回波增益调到相同的回波高度,再记录下每个深度缺陷所额外增加的增益(ΔdB)值,用相应ΔdB值对不同位置回波进行增益补偿形成TCG曲线,对缺陷进行评判),可以看出经TCG曲线补偿后不同深度平底孔几乎相同(图中标签①、②所示),为缺陷评判提供了有力保证.文中基于FPGA定点化技术实现CORDIC算法指数函数求值器eθ,针对收敛域狭小问题,提出一种收敛域扩张与迭代结构优化的实现方法,可推广为对任意输入值(进行定点化压缩以实现指数函数CORDIC算法收敛域的扩张,并通过FPGA实现此算法.该算法在运算量、硬件资源、分辨力等方面具有较大优势:在收敛域扩张方法上,根据输入值θ与ln 2相除的结果,通过分析商、整数、小数、余数部分的关系,最终根据关系式θ=Q·ln 2+γ,把eθ的计算等效转化为eγ(|γ|<ln 2=0.693 1处于算法收敛域内)的计算,通过区间压缩方法实现指数函数CORDIC算法的收敛域扩张;采用定点化技术计算Q与γ,仅用两个乘法器,避免了除法器使用,有利于FPGA的实现.算法只需用到两条迭代数据链,可省去一条迭代数据链,即仅对角度zi与坐标xi进行迭代,这种方式在硬件实现上可以节省约1/3硬件资源,大幅度提高FPGA处理算法实时性.通过15级的迭代流水线,对CORDIC算法指数求解器进行FPGA实现与ModelSim仿真,求解值相对误差达到了10-3,能满足很多实际工程要求,在超声相控的TCG功能中具有重要实用价值.【相关文献】[1] LAKSHMI B,DHAR A S.CORDIC architectures:a survey [J].VLSI Design,2010,2010:1-19.[2] SIDAHOAO N,CONSTANTINIDES G A,CHEUNG P Y.Architectures for function evaluation on FPGAs [C]∥Proceedings of IEEE International Symposium on Circuits and Systems.Bangkok:IEEE,2003:804-807.[3] YLOSTALO J.Function approximation using polynomials [J].IEEE Signal Processing Magazine,2006,23(5):99-102.[4] MULLER J M.A few results on table-based methods [J].Reliable Computing,1999,5(3):279-288.[5] NAGAYAMA S,SASAO T.Programmable numerical function generators based on quadratic approximation [C]∥Proceedings of Asia South Pacific Design AutomationConference.Yokohama:IEEE,2006:378-383.[6] LAKSHMI B,DHAR A S.VLSI architecture for parallel radix-4 CORDIC[J].Microprocessors and Microsystems,2013,37(1):79-86.[7] 沃焱,徐角.精确的快速极坐标谐波变换 [J].华南理工大学学报(自然科学版),2012,40(4):23-29.WO Yan,XU Jiao.Accurate and fast harmonic transform of polar coordinates [J].Journal of South China University of Technology(Natural Science Edition),2012,40(4):23-29. [8] 牟胜梅,李兆刚.一种面向FPGA的指/对数函数求值算法 [J].计算机工程与应用,2011,47(33):59-61.MOU Sheng-mei,LI Zhao-gang.FPGA-oriented evaluation algorithm for exponential and logarithm functions [J].Compu-ter Engineering and Applications,2011,47(33):59-61. [9] 牟胜梅,杨晓东.eθ 的CORDIC 迭代初值选取策略及其硬件实现 [J].计算机工程与应用,2007,43(6):79-80.MOU Sheng-mei,YANG Xiao-dong.Policy of choosing initial values for CORDIC iteration and its effect on hardware implementation of exponential function [J].Compu-ter Engineering and Applications,2007,43(6):79-80.[10] 何晓华,谢建精.基于扩张收敛域CORDIC的指数变换器设计[J].计算机仿真,2010,27(7):365-368.HE Xiao-hua,XIE Jian-jing.Design of exponential function generator based on CORDIC algorithm with expanded range of convergence [J].Computer Simulation,2010,27(7):365-368.[11] VASJANOV A,BARZDENAS V.Design of a time-gain-compensation amplifier for ultrasonic echo signal processing [C]∥Electrical,Electronic and InformationSciences.Vilnius:IEEE,2015:1-6.[12] 庞林花,文桂林.报废回收汽车零部件再利用的无损检测技术 [J].华南理工大学学报(自然科学版),2014,42 (11):55-62.PANG Lin-hua,WEN Gui-lin.A study on nondestructive testing technology for recyclingof re-usable automotive parts [J].Journal of South China University of Techno-logy (Natural Science Edition),2014,42(11):55-62.[13] 杨宇,毛志刚,来逢昌.一种改进的流水线CORDIC算法结构 [J].微处理机,2006(4):10-14.YANG Yu,MAO Zhi-gang,LAI Feng-chang.An improved pipeline structure for CORDIC [J].Icroprocessors,2006(4):10-14.[14] NASCIMENTO I,JARDIM R,MORGADO-Dias F.A new solution to the hyperbolic tangent implementation in hardware:polynomial modeling of the fractional exponential part [J].Neural Computing & Applications,2013,23(23):363-369.[15] 苏诚,韩俊刚.一种对数求值器的硬件实现 [J].协议·算法及仿真,2013,26(10):7-10.SU Cheng,HAN Jun-gang.A hardware implement of the logarithmic evaluator[J].Electronic Sci & Tech,2013,26(10):7-10.[16] 刘美娟,许建华,张超.基于CORDIC算法的对数放大器的FPGA实现 [J ].仪器仪表学,2008,29(4):328-331.LIU Mei-juan,XU Jian-hua,ZHANG Chao.Implementation of logarithmic amplifier in FPGA based on CORDIC algorithm [J].Chinese Journal of Scientific Instrument,2008,29(4):328-331.。

基于FPGA和改进CORDIC算法的NCO设计与实现

基于FPGA和改进CORDIC算法的NCO设计与实现
i mp l e me nt t he NCO b a s e d o n FPGA a nd t h e i mp r o v e d CORDI C a l g o r i t hm. I t pr o v e s t he f e a s i b i l i t y o f t h e s c h e me wi t h t h e pr ec i s i o n
Te c h ni qu e an d Me t h od
基于 F P G A和 改进 C O R D I C算 法 的 NC O设 计 与 实现
彭 奇, 习友 宝 ( 电子 科技 大 学 ,四川 成 都 6 1 1 7 3 1 )
摘 要 : 将 C O RD I C算 法 传 统 实现 中 的 象 限 转 换 从 输 出 转 移 到 输 入 进 行 处 理 , 简化 了 电路 逻 辑 。 针对 C O R D I C 算 法 的 流 水 线 结 构 做 出增 大 映 射 分 区 的 改 进 , 省 去 了流 水 线 的 第 一级 。 减 少 了 流 水 线 结 构 内旋 转 角 的一 位 数 据 宽度 。 在 F P G A 中仿 真 并 实现 了基 于该 改进 C O R D I C 算 法 的 NC O。 仿 真 结 果 有
f X 2 = X I C O S O — y j s i n O = c o s O ( l — y  ̄ t a n 0 ) , 。 、 [ y 2 = x 1 s i n 0 + y I e o s O = c o s O( y l l t a n 0 )
接数 字 频 率 合成 ( DD S) 和 各 种 数 字 信 号 发 生 器 的 核 心
De s i g n a n d i mp l e me n t a t i o n o f NCO ba s e d o n FPGA

正交幅度调制解调器的FPGA设计与仿真

正交幅度调制解调器的FPGA设计与仿真

正交幅度调制解调器的FPGA设计与仿真雷能芳【摘要】Quadrature amplitude modulation(QAM) is efficient in power and bandwidth, so it has been used widely in the field of channel modulation. The common approach to implement carrier signal of QAM is based on a look-up table, which requires a huge volume of ROM to achieve high resolution. This paper proposes a CORDIC algorithm-based pipelined architecture for implementation of QAM on FPGA, which can save considerable hardware resources and improve the speed performance. According to advantages of DSP Builder, the system is designed by utilizing VHDL and Simulink module. The correctness and feasibility of this design is verified by simulation result.%正交幅度调制技术(QAM)是一种功率和带宽相对高效的信道调制技术,因此在信道调制技术中得到了广泛的应用.它的载波信号的FPGA实现一般采用查找表的方法,为了达到高精度要求,需要耗费大量的ROM资源.提出了一种基于流水线CORDIC算法的实现方案,可有效地节省FPGA 的硬件资源,提高运算速度,并根据DSP开发工具DSP Builder的优点,采用VHDL 文本与Simulink模型图相结合的方法进行了设计.仿真结果验证了设计的正确性及可行性.【期刊名称】《现代电子技术》【年(卷),期】2011(034)019【总页数】3页(P58-60)【关键词】正交幅度调制;调制解调器;CORDIC算法;FPGA;DSP Builder【作者】雷能芳【作者单位】渭南师范学院物理与电子工程系,陕西渭南 714000【正文语种】中文【中图分类】TN914-340 引言正交幅度调制是频率利用率很高的一种调制技术。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微 处 理 机MICROPROCESSORS

・大规模集成电路设计、制造与应用・CORDIC算法在FPGA中的实现王智霞,王广生(北京工业大学电控学院,北京100022) 摘 要:CORDIC算法是在许多角度计算方面有着广泛应用的经典算法,通过考虑FPGA的结构、精度局限和速度要求,采用流水线技术(pipeline),在FPGA上用CORDIC算法实现了对于大吞吐量数据的向量倾角的计算,并对实际应用中内部步骤寄存器精度的选取给出了较为详细的方法。关键词:坐标旋转数字计算;FPGA;流水线中图分类号:TN4 文献标识码:B 文章编号:1002-2279(2007)01-0004-04

FPGABasedRealizationofCORDICAlgorithmWANGZhi-xia,WANGGuang-sheng(Beijinguniversityoftechnology,Beijing100022,China)

Abstract:CORDICalgorithmisaclassicalgorithmwithmanyapplications.Consideringthearchi2tecture,precisionandspeedofFPGA,thepipelinetechnologyisusedincomputinglargenumberofvectoranglevalues.Thisarticleprovidesthewayofconfirmthewideofinnerprocessingregister.Keywords:CORDIC;FPGA;Pipeline

1 引 言FPGA以其灵活性和使用方便在现今的数字领域已经得到了广泛的应用。但FPGA实现数字系统也有其自身的局限性,其一是器件资源的门阵列规模的限制,其二是单元延迟限制,所以,这就需要设计者充分考虑器件的实际工作能力。角度的旋转计算在数字领域尤其是数字通信领域是一种应用非常广泛的计算,如果用传统的除法器、乘法器等计算方法,需要占用大量的FPGA资源,这样就不能满足设计者的要求,需要设计者考虑其他的算法实现这种类型的计算。CORDIC算法在硬件电路的实现上只用到了加法器和移位器,这样就大大节约了FPGA的资源,从而可以满足设计者的要求。

2 CORDIC算法简介CORDIC(CoordinateRotationDigitalComputer),又名:坐标旋转数字计算,是J.Voider等人于1959

年在设计美国航空导航控制系统的过程中提出来的一种算法。下面就简要地介绍一下CORDIC算法的

基本数学思想。如图1所示,向量OA逆时针旋转θ度角得到向量OB,这个关系可以用矩阵表示如式1

[1]

:

XjYj=cosθ -sinθsinθ cosθXiYi=cosθ1 -tanθtanθ 1Xi

Yj

(1)

图1 向量旋转坐标图如果假设θ是由n个θn角度叠加而成的,那么根据式(1)得出每一步的叠加操作需要按照式(2)行Xn+1Yn+1=cosθn1 -tanθntanθn 1Xn

Yn

(2)

利用式2经过n步叠加可以表示由向量OA旋转到向量OB,如下表示:

XjYj=cosθ0・cos

θ

1...cosθn1 -tanθ0tanθ0 1...

1 -tanθntanθn 1Xi

Yi

(3)

作者简介:王智霞(1980-),女,北京人,硕士研究生,主研方向:嵌入式系统设计与实现,大规模集成电路系统设计,数字通信。收稿日期:2005-02-23

第1期2007年2月 No.1Feb.,2007王智霞等:CORDIC算法在FPGA中的实现

由于计算机进行计算采用二进制形式,所以我们选取θn=arctan(12n),这样选取θn方便了tanθn的计算,即tanθn=Sn2-n,式3前面的cosθn可以取累乘的极限即:

K=∏∞n=0cosθn=∏∞n=0cos[arctan(12n)]≈0.607253

如果我们在设计的系统中提前计算K,那么当抛开K不算时,式(2)就可以表示成式(4)[1]:

Xn+1Yn+1=1 -Sn2-nSn2-n 1Xn

Yn

θ=∑mi=0Siθi (Si={-1,1})(4)

至此,我们可以得出结论,由向量OA,在先计算K的情况下,我们可以由式4逐步的计算旋转角度后得出向量OB。计算的精度由n的大小决定,式(4)中的

S

n

由每一步的具体情况而定。

3 CORDIC算法的应用利用CORDIC算法可以进行许多运算,比如计算角度正弦、角度余弦、复数的乘法、向量的角度和模的运算等等。下面就介绍两种CORDIC算法的实际应用实例:

(1)已知:角度θ,求

:cosθ?

这个问题我们可以转换为利用CORDIC这种向量旋转的思想进行解析,建模如下(见图2):

图2 向量旋转坐标图起始向量OA为[X

i,Yi,θi]

=[1,0,0]

终止向量OB为[X

j,Yj,θj]=[cosθ,sinθ,

θ]

由OA经过n步旋转到OB,即可以得到cos

θ

设:Zn表示经过n步旋转后,得到的结果与θ

的差值,即:Z

n=θ-∑ni=0θi,通过这样的假设,

就可以

得到:

Sn=1 ZnΕ0-1 Zn<0(5)将(4)和(5)式结合,就可以得到它的逻辑表述:

IFZ(n)>=0X(n+1)=X(n)-Y(n)×2

-n

Y(n+1)=Y(n)+X(n)×2

-n

Z(n+1)=Z(n)-arctan(2

-n)

ELSEX(n+1)=X(n)+Y(n)×2

-n

Y(n+1)=Y(n)-X(n)×2

-n

Z(n+1)=Z(n)+arctan(2

-n)

(2)已知:点A(Xi,Yi),求:向量OA在坐标系

中的倾角θ?

这个问题我们可以转换为利用CORDIC这种向量旋转的思想进行解析,建模如下(见图3):

图3 坐标系旋转图如图3所示,为了方便对角度θ的计算,我们旋转了一下坐标轴,可以推断出起始向量OA为[X

i,

Yi,Zi]=[Xi,Yi,0]终止向量OB为[X

j,Yj,Zj]=[R,0,-θ]

设Z

n=∑∞n=0θn,就可以得到:

Sn=1 YnΦ0-1 Yn>0(6

)

将式(4)和式(6)结合,就可以得到它的逻辑表述:

IFY(n)<=0X(n+1)=X(n)-Y(n)×2

-n

Y(n+1)=Y(n)+X(n)×2

-n

Z(n+1)=Z(n)-arctan(2

-n)

ELSEX(n+1)=X(n)+Y(n)×2

-n

Y(n+1)=Y(n)-X(n)×2

-n

Z(n+1)=Z(n)+arctan(2

-n)

4 CORDIC的FPGA实现下面就上述的第二种应用实例,描述一下用verilog语言实现CORDIC算法的具体步骤和实现方法。(1)系统要求接口类型和精度

1)输入XY的精度为(11,10,T):10位整数、无小数位的有符号数。2)输出角度为Zπ,Z为弧度值的π前的系数,精度为(8,1,T):6位小数、1位整数的有符号数,它

・5・ 1期微 处 理 机

的范围是(-1,1)。3)系统的接口,见表1,其中clk为80MHz表1 cordic模块的接口表接口名称长度类型clk1INrst1INenin1INxin11INyin11INokout1OUTzout8OUT(2)计算中间寄存器宽度的选取分析系统要求的输入X和Y的精度和输出的Z的精度进行比较,可以分析出,输出和输入的精度不对称,即:Z的精度为(8,1,T)对应的最小可以表示的角度为2.8125°XY的精度为(11,10,T),对应的可以表示的最小的角度为:45°-arctan(10221023)=0.028017可见,输入和输出误差的允许值相差非常远,这样就得到了两种精度的分析。1)如果允许输出的角度Z的最后一位不准确,那么可以以2.8125为精度进行分析,分析如下:假设计算中用到的角度精度为(9,0,T),即:8位小数,1位符号位的值,这个值与z值相同,都表示弧度值的π前的系数,小数位的最高位表示1/4π(45度),所以它能表示的最小角度为0.3515625度。根据上述假设,arctan(2-n)可以表示为下表2:表2 arctan2-n值实际值取值计算值误差arctan1/226.5650500000000100110026.718750000000.1537arctan1/414.0362400000000010100014.062500000000.02626arctan1/87.125020000000000101007.031250000000.09377arctan1/163.576330000000000010103.515624500000.060706arctan1/321.789910000000000001011.757812500000.032097误差合计0.366533 从表2中我们不难看出,由于arctan(2-n)用精度为(9,0,T)表示,有部分的误差,误差的最大合计为0.366533度,这样可以得出如下结论:用(9,0,T)表示中间计算的角度寄存器的精度,运行5步叠加结果的最大误差为:0.366533(前者的误差)+1.78991(后者的误差)=2.156443度上述计算出的最大误差为2.156度,小于2.8125度,符合z的精度范围,计算结果只会在最后一位上与z的真实结果有出入,误差在允许范围之内。2)如果不允许输出角度Z有任何的偏差,6位小数位必须全部准确,那么需要用0.028017精度进行计算,分析方法同上,最后得出的选取中间计算角度的精度是(15,0,T),即:14位小数,1位符号位的值,这个值与z值相同,都表示弧度值的前系数,小数位的最高位表示1/4π(45度),需要进行12步计算,这个过程要比第一个过程需要增加数倍的资源,

而且速度会明显变慢。根据综合后的经验得知9位加法器的延迟时间大约为3ns,而16位加法器的延迟时间大约为5ns,

系统输入的clk为80MHz,周期为1/80MHz=12.5

ns,16位加法器(XnY

n

的计算)的延迟时间可以满足

clk的速度,所以考虑到运算速度的要求,使用第一种精度和步数选取结果,即:Zn的精度为(9,0,T),5

步迭代运算。(3)一个计算过程的处理

一个计算过程的实现步骤如图4所示。

图4 计算过程步骤图1)由于系统要求输入点A(X,Y)的范围为4个象限,而文章的二.2中讲述的方法只是针对ⅠⅣ象限的,所以我们需要在开始的计算前判断点A

(X,Y)所在的象限,并将它转换到Ⅰ象限;另外,由

于我们是判断Y(n)正负来确定S(n)的正负,角度小于45的角,角度的变化对于Y值的影响比较明显,所以如果所求向量角度在45~90度的范围内,

需要先将X和Y互换,转换到0~45度的范围内进行计算,这样可以减少误差。下面介绍一个具体的例子,说明一下具体的变换过程:如图5已知点A在第三象限,经过变换后变换到第一象限变成(-X,-Y),经过判断-X<

相关文档
最新文档