1.系统设计要求
1)设计一个应用CORDIC算法求解正弦函数sinθ和余弦函数cosθ的VHDL程序。
2)CORDIC算法简介
在现代信号处理中,经常会遇到三角函数、超越函数和坐标转化等问题。传统的实现方法有查找表、多项式展开等方法。这些方法在精度、速度、简单性和效率方面往往不能兼顾,而CORDIC算法则可以很好地兼顾这几方面的要求。
CORDIC是坐标旋转数字计算机(Coordinate Rotations Digital Computer)的英文字头缩写,它于1959年由J.Volder提出,首先应用于导航系统,使得矢量的旋转和定向运算不需要做复杂运算。
CORDIC算法的基本思想是通过一系列固定的、与运算基数相关的角度偏摆来逼近所需的旋转角度。可通过该算法的圆周模式、双曲线模式、线性模式等不同的实现模式,来计算乘除、平方根、正弦、余弦、反正切向量旋转以及指数运算等。由于基本运算单元只有移位与加减法,这就为CORDIC算法的FPGA实现打下了良好的基础。
2.CORDIC算法实现结构
CORDIC算法的实现有两种结构方案:迭代结构和流水线结构。
基于迭代结构的CORDIC算法实现方案只需要一组移位及加减运算的单元,硬件开销很小,但控制比较复杂,而且完成一次CORDIC运算需要多个时钟周期,当对速度要求较高时很难满足要求。
基于流水线结构的实现方案,每级CORDIC迭代运算都使用单独的一套运算单元,与基于迭代结构的实现方案相比,流水线结构的处理速度非常快,当流水线填满之后每个时钟周期就会计算出一组结果。
本设计采用流水线结构进行设计:
外部输入XI、YI、ZI作为第一级流水线单元的输入X(0)、Y(0)、Z(0);
中间各个单元首尾相接,也就是第N个单元的输入与N-1个单元的输出X(N-1), Y(N-1), Z(N-1)相连,第N个单元的输出X(N), Y(N), Z(N)又与N+1个单元的输入相连;
最后一级处理单元的输出X(N)、Y(N)、Z(N)就是整个系统的输出XO、YO、ZO。
先设计一个根据已知的( Xn-1,Yn-1,Zn-)求解( Xn,Yn ,Zn )的通用流水单元电路程序CORDICPIPE.VHD,再利用N个单元电路构成流水线,实现由(X0,Y0 ,Z0 )求解( Xn,Yn ,Zn )的CORDIC算法实现电路程序CORDIC.VHD,最后给CORDIC算法实现电路赋予确定的初值(0.60725,0,角度 ),构建一个求解正弦和余弦函数的顶层电路程序
3 . 主要模块的设计思想与源程序设计
--CORDIC.VHDL
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CORDIC IS
GENERIC(PIPELINE:INTEGER:=15;
WIDTH:INTEGER:=16);
PORT(CLK:IN STD_LOGIC;
ENA:IN STD_LOGIC;
XI:IN SIGNED(WIDTH-1 DOWNTO 0);
YI:IN SIGNED(WIDTH-1 DOWNTO 0):=(OTHERS=>'0');
ZI:IN SIGNED(WIDTH-1 DOWNTO 0);
XO:OUT SIGNED(WIDTH-1 DOWNTO 0);
YO: OUT SIGNED(WIDTH-1 DOWNTO 0));
END ENTITY CORDIC;
ARCHITECTURE ART OF CORDIC IS
TYPE XYVECTOR IS ARRAY(PIPELINE DOWNTO 0)OF
SIGNED(WIDTH-1 DOWNTO 0);
TYPE ZVECTOR IS ARRAY(PIPELINE DOWNTO 0)OF
SIGNED(19 DOWNTO 0);
COMPONENT CORDICPIPE
GENER