资源描述:
《数字系统设计报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于FPGA的cordic算法设计及实现1.FPGA简介曲于本次cordic算法的设计和实现是基于FPGA的,因此,先对FPGA做一个简单介绍。FPGA(Field—Programmab1eGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。FPGA由6部分组成,分别为可编程输入/输出单元、基木可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等。FPGA设计的基木流程如门2.Cordic算法原理如图所示,初始向量(x0/y0)旋转0角度
2、之后得到向量(衍,y)此向量冇如卜关系:xr=x0cosO—yosinO=y0cosO+x0sin6注:e为待求角假设初始向量经过N次旋转Z后得到新向量,且每次旋转角度§止切值都为2的倍数,则第i次旋转角度为8=arctan(2"z),即cosS=(1/(1+2-29)°'5容易得到角度BuYs©,其屮彳=1或一1,表示旋转角度的方向,第i步旋转可以表示为:竝+1=(1/(1+2~29)0,5(为一去刃2一,)Xi+i=(1/(1+2"29)05(%+彤一°)其屮(1/(1+2-29)05称为校模因子,当旋传次数一定时,趋
3、于一个常数,口(1/(1+2~29)0,5u0.6063而由极限1曲》8^^==1可知,算法每一步就可以简化为:J(l+2-i)如=Xi—Si%2-i7i+i=yi+SiXi2—i从而可以看出,对于移动的角度e,现在只需要硬件加减法器和移位器就口J以算出结果。引入乙表示次旋转后相位累加的部分和,贝山彳+1=z:—Siarctan2~l经过n次旋转之后,Z-0,即与目标角重合。3.算法设计思路1)进行端口说明和数据类型定义。输入端口为时钟和初始相位,输出端口为sin和cos。参数设置方面将迭代次数设置为8次。输入和位在每次时
4、钟的下降沿来临吋增加2。2)初始化数据%=K,yo=0,为输入相位,输入相位的高两位表示角度在哪个象限。再增加一个符号位,即判决算子G,用来判断每次迭代的旋转方向。3)开始进行迭代运算,如果符号位彳=1,则顺时针旋转45°,否则逆时针旋转45。。一共进行八次迭代,每次迭代旋转角度的止切值都为2的倍数。4)设置9个两位寄存器,用来保存每次旋转后相位的高两位,即用来判断角度在哪个象限。5)每经过一个时钟周期,会有8个角度进行旋转,最先输入的角度进行第8次旋转,后血的7个角度依次进行第7次,第6次,第5次,……,第1次的旋转,这
5、样依次进行下去就会输岀一系列连续的正弦波和余弦波。4.功能仿真结果(用modelsim实现)5・课后感悟数字系统设计这门课已经结课了,虽然只有短短六周的课程,但是姚老师课堂上的认真讲解以及课后的严格要求让我学到了很多数字系统设计的知识,每次作业都是对我知识的提升,对于Ve川鸥语言我从什么都不懂到现在自己都可以编一些简单的小程序了,述有每周的实验课也让我对FPGA和DSP的设计流程有了新的认识。相信这些知识将会在未來给我很大的帮助。附录:源程序(verilog实现)modulecordic(sin,cos,eps,phase
6、_in,clk);input[7:0]phase_in;inputclk;outputreg[8:0]sin,cos,eps;parameterPIPELINE=8;//迭代次数为8次parameterK=8'h4D;//k=0.607253*2A7//sin和cos之间的转换取决于phase_in[7:6]reg[8:0]x0,y0,z0;reg[8:0]xl,yl,zl;reg[8:0]x2,y2,z2;reg[8:0]x3,y3,z3;reg[8:0]x4,y4,z4;reg[8:0]x5,y5,z5;reg[8:0
7、]x6,y6,z6;reg[8:0]x7,y7zz7;reg[8:0]x8,y8zz8;reg[1:0]quadrant[PIPELINED];integeri;initialbeginfor(i=0;i<=PIPEUNE;i=i+l)quadrant[i]=2'bO;end//phase_in[7:6]判断角度在哪个象限//OO表示在笫一象限;01表示在第二象限;10表示在第三象限;11表示在笫四象限〃初始化:x0=K,yO=0,z0=phasejnalways@(posedgeclk)//stage0beginxOv二
8、{UbO,K};〃增加一个符号位,0表示正y0<=9'bO;z0<={3'b0,phase」n[5:0]};//控制输入相位的范围在0到pi/2endalways@(posedgeclk)//stage1beginif(z0[8])〃顺时•针为负J表示负beginxl<=xO+yO;yl<=yO-xO;