北邮 FPGA 实验三.docx_第1页
北邮 FPGA 实验三.docx_第2页
北邮 FPGA 实验三.docx_第3页
北邮 FPGA 实验三.docx_第4页
北邮 FPGA 实验三.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学实验报告信号与信息处理综合实验(FPGA实验)实验三 CORDIC算法学院: 信息与通信工程学院 班级: 学号: 姓名: 一 实验目的掌握FPGA设计中的流水线技术;掌握CORDIC算法的基本原理及其实现方法;了解通过在片内生成ROM的方式进行在板模块测试的方法。二 实验内容1)按实验指导书所给出的步骤,在FPGA上实现CORDIC算法用于计算sin(x);2)修改程序使其能够用于计算x2+y2。三 实验过程3.1 CORDIC算法原理CORDIC算法的全称是Coordinate Rotation Digital Computer ,可以用于实现对多种超越函数的运算。CORDIC算法将多种难以用硬件电路直接实现的复杂运算分解为统一的简单移位-加法的迭代运算形式,结构规则、运算周期可以预测、适合于集成电路实现。所谓的超越函数是指变量之间的关系不能用有限次加、减、乘、除、乘方、开方运算表示的函数。如指数函数、对数函数、三角函数和反三角函数等都是超越函数。最初的CORDIC算法由J.D.Volder 于1959 年提出, 用于计算三角函数。 1971 年,Walther 提出了统一的CORDIC 算法,引入了参数m 将CORDIC 实现的三种迭代模式:圆周、双曲和线性变换统一于一个表达式下。CORDIC算法目前使用非常广泛,被称为算法中的瑞士军刀。下面我们首先介绍CORDIC算法的基本原理。笛卡尔坐标系中的旋转变换可以表示为:x=xcos-ysiny=ycos+xsin提取 cos 变成x=cos(x-ytan)x=cos(y+xtan)如果在这一表达式中限制 tan=2-i,则括号内部分不包含乘法运算,移位相加即可实现。实际上,任意角度的旋转都可以转化为一系列角度满足 tan=2-i 旋转的组合,假定总共旋转 N 次,第 i 次旋转角度满足 tan=2-i,那么 cos 为一系列常数。由此可知,每次旋转角度的绝对值是事先确知的,只是旋转方向不同。基于这种限制,将第 i 次旋转的方程转化为:xi+1=Kixi-yidi2-iyi+1=Kiyi+xidi2-iKi=costan-12-i=1/1+2-2idi=1去掉 Ki 则每次运算只包含移位和加法运算。当 N 趋于无穷大时, Ki 的连乘积:K=0cosarctan12n0.607253即算法本身存在增益 An=1.647实际实现中N不可能很大,因此这一增益与次数有关:An=n1+2-2i若事先确定迭代次数,则增益为一确定值,旋转角度由一系列 +1,-1 所决定 角度累加方程:zi+1=zi-ditan-1(2-i)与方程xi+1=Kixi-yidi2-iyi+1=Kiyi+xidi2-i一起构成三个迭代方程。CORDIC算法有两种工作模式,一种称为旋转模式,另一种称为向量模式。 旋转模式就是将输入的复向量旋转指定的角度;向量模式则将输入向量旋转到x轴上,并记录旋转方向向量。旋转模式下,每次旋转方向的确定由残留角的符号决定,其工作模式为:xi+1=xi-yidi2-iyi+1=yi+xidi2-izi+1=zi-ditan-1(2-i)Wheredi= -1 if zi0 , +1 otherwise旋转模式的目标是使 zn=0。如果采用向量模式,则旋转角度不预先确定,目标是使 yn=0,即将输入向量旋转到 x 轴上,旋转方向由残留 y 值的正负决定。xi+1=xi-yidi2-iyi+1=yi+xidi2-izi+1=zi-ditan-1(2-i)Wheredi= +1 if yi0 , -1 otherwise向量模式结果xn=Anx02+y02yn=0zn=z0+tan-1(y0/x0)An=n1+2-2i适当选择初始值和工作模式,能直接计算 sin(), cos(), arctan(),复向量幅度,极坐标和笛卡尔坐标的变换等。例如 sinx 和 cosx 的计算可以通过旋转模式得到,选择初值:y0=0, x0=1/Anz0 设为待求角度,则xn=Anx0cosz0yn=Anx0sinz0向量模式可用于计算 arctan(),要求输入以两个数的商形式给出,同时能计算复向量幅度zn=z0+tan-1(y0/x0)xn=Anx02+y02实际上,CORDIC算法还可以推广到双曲线和直线上xi+1=xi-yidi2-iyi+1=yi+xidi2-izi+1=zi-ditan-1(2-i)Wheredi= -1 if zi0 ,+1 otherwisexn=Anx0coshz0+y0sinhz0yn=Any0coshz0+x0sinhz0z0=0An= n1-2-2ixn=Anx02-y02y0=0zn=z0+tanh-1(y0/x0)An= n1-2-2i三种情况下的CORDIC可以统一到以下框架下:xi+1=xi-myidi2-iyi+1=yi+xidi2-izi+1=zi-diei流水线方式下的统一CORDIC实现方式如下图所示:3.2 用CORDIC算法计算sin(x)1)建立工程,并将压缩包中的Cordic.v添加到工程中;2)为该文件设计测试文件,并进行功能仿真和时序仿真,观察并分析从一个角度值x的输入到它对应的sin(x)输出所对应的时间;3)按以下步骤在工程中添加一个ROM IPCore;输入IPcore文件名并点击Next,选择下的,并点击Next。存储器类型选择单口ROM点击Next,在第二个页面上设置RAM的位宽和深度,例如:点击Next,在第3个配置页面上找到下图所示位置:此处需要加载用于初始化存储器的文件。根据文件中注释所提供的量化规则设置一些角度值存在一个.coe文件中,.coe文件的样例见压缩包中的angle.coe,可用任一文本编辑器打开,文件以“memory_initialization_radix=16;memory_initialization_vector=“开头,其后的数据以十六进制表示,数据之间以空格或逗号分割,文件的长度和数据位宽应与ROM的设置保持一致。其他选项保持为默认选项,点击Generate按钮生成IPcore。此时在工程目录下的ipcore_dir文件夹中会产生一系列与设定的IP core同名的文件,其中包含一个.v文件和一个.xco文件,xco文件是包含IP core配置信息的核心文件,.V文件的格式与verilog module相同,其内容较为复杂,对使用者而言通常只关注它的模块头,作为实例化时的参考。4)产生一个用于在板测试的顶层文件,将cordic模块和ROM模块在该文件中进行实例化,参加压缩包中的cordic_top.v5)添加约束文件,参见压缩包中的cordic.ucf文件。自行设置Chipscope中的信号连接,用Chipscope工具进行在板测试,记录数据,并计算迭代次数为8次时的平均误差。;6)修改迭代次数为10次,重新进行仿真和测试。3.3 用CORDIC算法计算x2+y2将程序修改为计算 x2+y2 的工作模式,重复上述测试。四 实验分析4.1 用CORDIC算法计算sin(x)(8次迭代)4.1.1. 实验原理8次迭代的输入角度值和输出函数值均采用10位二进制数表示用00000000001111111111表示02,因此200H表示,100H表示/2;用00000000001111111111表示函数值-1+1;此时采用补码形式,0511对应0+1,5121024对应-10;x0初值为29*1An=134H设输入的角度值为16进制表示数X,将X换算成带符号的十进制数x,则与角度值之间的换算关系为=x512设CORDIC算法计算得到的输出函数值为Y,将Y换算成10进制带符号数y,则计算结果的10进制表示为sinx=y5124.1.2. 实验描述本程序中所有角度和函数值都是采用二进制表示,具体描述如下:1) 模块名:Cordic;2) 角度值:采用10位二进制表示,用 00000000001111111111 表示 02,因此200H表示 ,100H表示 /2; 3) 函数值:采用10位二进制补码表示,用 00000000001111111111 表示函数值 -1+1;此时采用补码形式,0511 对应 0+1,5121024 对应 -10;4) 输入及输出参数:clk:时钟信号;rst:重置信号;ena:启动信号,该信号置1时系统开始运算过程;phase_in(10位二进制数):输入的角度值;sin_out(10位二进制数):输出的 sin() 函数值;5) 函数变量cos_out(10位二进制数):计算得到的 cos 函数值,与sin_out同时产生但不输出;phase_in_reg(10位二进制数):程序中实际参与运算的角度值,下面会进行说明;x0-x8、y0-y8、z0-z8(均为10位二进制数):在迭代算法中使用的临时参数,x和y参数存储三角函数值,z存储角度值。x0、y0、z0存储初值,其它参数存储8次迭代的临时值;quadrant(10个1位存储器):存储输入角度值的相位信息,具体用处见下面说明;PIPELINE:流水线,必须和数据位长相同。本程序使用10级流水线。4.1.3. 主要工作流程下面进行算法当中数据变化的详细说明:1) 初值问题这里置 x0=1/An其原因是xn=Anx0sinz02) 迭代运算此段代码是程序的主要部分,简单的说就是实现CORDIC算法的旋转模式:xi+1=xi-yidi2-iyi+1=yi+xidi2-izi+1=zi-ditan-1(2-i)Wheredi= -1 if zi0 ,+1 otherwise它采用二进制位运算,对一些复杂地方进行相应说明: zi(di) 正负的判断:通过判断符号位(首位); 2-i 的实现:即每次迭代时对 xi 或 yi 作除2操作具体实现方法为把原二进制值向右移动一位,移出的空位补0; 每次迭代时,z 的值要减去的角度值满足公式 tan-12-i3) 结果处理利用三角函数性质,由于结果是在角度位于第一象限情况下获得的,因此作如下处理:输入角度在第一象限:sinx 值不变,cosx 值不变;输入角度在第二象限:sinx 值不变,cosx 值取反;输入角度在第三象限:sinx 值取反,cosx 值取反;输入角度在第四象限:sinx 值取反,cosx 值不变;取负方法:所有二进制位取反加一(补码)。4.2 用CORDIC算法计算sin(x)(10次迭代)这个程序是对8次迭代的程序进行修改后获得的,基本代码与工作流程完全相同,以下只说明修改的地方。1)数据位长度:由上述公式可得,每次、和的变化范围随迭代次数增加而减小,若仍采用原先的10位二进制数存储数据,到了较高次迭代时会出现数据过小而无法完全表示的情况,因此数据位长需要增加。本程序中,xi、yi 和 zi 位长度都增加到16。2)增加迭代次数及对应临时变量,修改输出变量;3)重新计算原程序使用的角度值,优化计算结果;4)修改测试文件的信号,以实现位长的对应;5)修改相关判断语句。4.3 用CORDIC算法计算x2+y2(8次迭代)4.3.1. 实验原理实验原理与上述实验类似,这里不再累述。4.3.2. 实验描述本程序中的角度值、函数值、函数变量等与上述实验类似,这里不再累述。输入及输出参数有所变化,具体变化的参数描述如下:phase_in_x(10位二进制数):输入x值;phase_in_y(10位二进制数):输入y值;sin_out:输出值 xn=Anx2+y2;cos_out:输出值 yn;4.3.3. 主要工作流程主要工作流程与上述实验类似,这里不再累述。五 实验结果及分析5.1 计算sin(x),迭代次数为8次5.1.1. Modelsim仿真结果分析仿真图如下:从上图可以看出,10比特数据位宽时进行8次CORDIC算法迭代之后所得 sin(x) 的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,8次迭代运算需要一定的时间,从而产生了从输入到输出的时延。5.1.2. Chipscope仿真结果分析仿真图如下:从上图可看出,10比特数据位宽时进行8次CORDIC算法迭代之后所得 sin(x) 的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。5.1.3. 误差分析我们将0到90度对应角度值的实验值与理论值填入了表格进行对比,直观的显示了上述规律,结果如下所示:度数5.62511.2516.87522.528.12533.7539.37545理论值0.09800.19510.29030.38270.47140.55560.63440.6716实验值0.06250.04690.17190.28130.34380.45310.55470.6563误差0.03550.14820.11840.10140.12760.10250.07970.0153度数50.62556.2561.87567.573.12578.7584.37590理论值0.77300.83150.88200.92390.95690.98010.99521实验值0.68750.74220.87500.92190.94530.96880.98440.9766误差0.08550.08930.00700.00200.01160.01130.01080.0234从表格可以看出,10比特8次迭代的平均误差比较小,与前面的仿真图相符,说明实验结果正确。5.2 计算sin(x),迭代次数为10次5.2.1. Modelsim仿真结果分析仿真图如下:从上图可以看出,16比特数据位宽时进行10次CORDIC算法迭代之后所得 sin(x) 的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,10次迭代运算需要一定的时间,从而产生了从输入到输出的时延。5.2.2. Chipscope仿真结果分析仿真图如下:从上图可以看出,16比特数据位宽时进行10次CORDIC算法迭代之后所得 sin(x) 的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。5.2.3. 误差分析我们将0到90度对应角度值的实验值与理论值填入了表格进行对比,直观的显示了上述规律,结果如下所示:度数5.62511.2516.87522.528.12533.7539.37545理论值0.09800.19510.29030.38270.47140.55560.63440.6716实验值0.09800.19510.29030.38270.47140.55560.63440.7071误差0.00000.00000.00000.00000.00000.00000.00000.0355度数50.62556.2561.87567.573.12578.7584.37590理论值0.77300.83150.88200.92390.95690.98010.99521实验值0.77300.83150.88190.92390.95690.98080.99521.0000误差0.00000.00000.00010.00000.00000.00070.00000.0000从表格可以看出,16比特10次迭代的平均误差非常小,在保留四位小数的条件下几乎没有误差,与前面的仿真图相符,说明实验结果正确。同时说明16比特10次迭代的计算精度要优于10比特8次迭代的计算精度。5.3 计算x2+y2,迭代次数为8次5.3.1. Modelsim仿真结果分析仿真图如下:从上图可以看出,10比特数据位宽时进行8次CORDIC算法迭代之后所得 x2+y2 的结果在一定误差范围内是符合要求的,说明CORDIC算法取得了较为正确的运算结果(误差较大的原因可能是数据位宽较小或者是迭代次数过少)。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,8次迭代运算需要一定的时间,从而产生了从输入到输出的时延。六 遇到问题分析1)最主要的问题是最开始的时候对实验原理不是十分了解,导致在后来进行十次迭代的改进时不知道如何下手。2)虽然进行最开始的几组数据仿真时并没有出现问题,但实际上结果已经是不正确的了。原因是我们不会使用仿真功能当中的一项功能,导致没有调用出来 sin() 的波形。最后在助教的帮助下调用出来仿真波形。3)Modelsim仿真输出波形出现红色线条。进行测试文件的检查:信号设置有误。另外流水线和数据位长不一致也会出现此情况。4)在进行最后Chipscope的时候一定要先将测试文件删掉,否则会带来不必要的麻烦。虽然助教将这一点进行了强调说明,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论