



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、北京邮电大学实验报告信号与信息处理综合实验(FPGA实验)实验三 CORDIC算法学院 :信息与通信工程学院班级 :学号 :姓名 :一 实验目的掌握 FPGA设计中的流水线技术; 掌握 CORDIC算法的基本原理及其实现方法; 了解通过在片内生成 ROM的方式进行在板模块测试的方法。二 实验内容1)按实验指导书所给出的步骤,在FPGA上实现 CORDIC算法用于计算 sin(x);2)修改程序使其能够用于计算。三 实验过程3.1 CORDIC算法原理CORDIC算法的全称是 CoordinateRotationDigitalComputer ,可以用于实现对多种超越函数的运算。 CORDIC算
2、法将多种难以用硬件电路直接实现的复杂运算分解为统一的简单移位 - 加法的迭代运算形式, 结构规则、运算周期可以预测、适合于集成电路实现。所谓的超越函数是指变量之间的关系不能用有限次加、 减、乘、除、乘方、开方运算表示的函数。如指数函数、对数函数、三角函数和反三角函数等都是超越函数。最初的 CORDIC算法由于 1959 年提出, 用于计算三角函数。 1971 年,Walther 提出了统一的 CORDIC算法,引入了参数 m 将 CORDIC实现的三种迭代模式:圆周、双曲和线性变换统一于一个表达式下。 CORDIC算法目前使用非常广泛,被称为算法中的瑞士军刀。下面我们首先介绍CORDIC算法的
3、基本原理。笛卡尔坐标系中的旋转变换可以表示为:提取变成如果在这一表达式中限制,则括号内部分不包含乘法运算,移位相加即可实现。实际上,任意角度的旋转都可以转化为一系列角度满足旋转的组合,假定总共旋转次,第次旋转角度满足,那么为一系列常数。由此可知,每次旋转角度的绝对值是事先确知的,只是旋转方向不同。基于这种限制,将第次旋转的方程转化为:去掉则每次运算只包含移位和加法运算。当趋于无穷大时,的连乘积:即算法本身存在增益实际实现中 N 不可能很大,因此这一增益与次数有关:若事先确定迭代次数, 则增益为一确定值, 旋转角度由一系列所决定角度累加方程:与方程一起构成三个迭代方程。CORDIC算法有两种工作
4、模式,一种称为旋转模式,另一种称为向量模式。旋转模式就是将输入的复向量旋转指定的角度;向量模式则将输入向量旋转到 x 轴上,并记录旋转方向向量。旋转模式下,每次旋转方向的确定由残留角的符号决定,其工作模式为:Where旋转模式的目标是使。如果采用向量模式,则旋转角度不预先确定,目标是使,即将输入向量旋转到轴上,旋转方向由残留值的正负决定。Where向量模式结果适当选择初始值和工作模式,能直接计算,复向量幅度,极坐标和笛卡尔坐标的变换等。例如和的计算可以通过旋转模式得到,选择初值:设为待求角度,则向量模式可用于计算,要求输入以两个数的商形式给出, 同时能计算复向量幅度实际上, CORDIC算法还
5、可以推广到双曲线和直线上Where三种情况下的 CORDIC可以统一到以下框架下:流水线方式下的统一CORDIC实现方式如下图所示:3.2 用 CORDIC算法计算1)建立工程,并将压缩包中的Cordic.v添加到工程中;2)为该文件设计测试文件,并进行功能仿真和时序仿真,观察并分析从一个角度值 x 的输入到它对应的 sin(x) 输出所对应的时间;3)按以下步骤在工程中添加一个 ROM IPCore;输入 IPcore 文件名并点击 Next,选择下的,并点击 Next。存储器类型选择单口ROM点击 Next ,在第二个页面上设置RAM的位宽和深度,例如:点击 Next ,在第 3 个配置页
6、面上找到下图所示位置:此处需要加载用于初始化存储器的文件。根据文件中注释所提供的量化规则设置一些角度值存在一个 .coe 文件中, .coe 文件的样例见压缩包中的 angle.coe ,可用任一文本编辑器打开,文件以“ memory_initialization_radix=16;memory_initialization_vector=“开头,其后的数据以十六进制表示, 数据之间以空格或逗号分割, 文件的长度和数据位宽应与 ROM的设置保持一致。其他选项保持为默认选项,点击Generate按钮生成 IPcore 。此时在工程目录下的 ipcore_dir 文件夹中会产生一系列与设定的 IP
7、 core 同名的文件,其中包含一个 .v 文件和一个 .xco 文件, xco 文件是包含 IP core 配置信息的核心文件, .V 文件的格式与 verilog module 相同,其内容较为复杂,对使用者而言通常只关注它的模块头,作为实例化时的参考。4)产生一个用于在板测试的顶层文件, 将 cordic 模块和 ROM模块在该文件中进行实例化,参加压缩包中的 cordic_top.v5)添加约束文件, 参见压缩包中的cordic.ucf文件。自行设置 Chipscope 中的信号连接,用 Chipscope 工具进行在板测试,记录数据,并计算迭代次数为 8 次时的平均误差。;6)修改迭
8、代次数为10 次,重新进行仿真和测试。3.3 用 CORDIC算法计算将程序修改为计算的工作模式,重复上述测试。四 实验分析4.1 用 CORDIC算法计算(8 次迭代)实验原理8 次迭代的输入角度值和输出函数值均采用10 位二进制数表示用表示,因此200H表示,100H表示;用表示函数值;此时采用补码形式,对应,对应;初值为设输入的角度值为 16 进制表示数 X,将 X 换算成带符号的十进制数 x,则与角度值之间的换算关系为设 CORDIC算法计算得到的输出函数值为 Y,将 Y 换算成 10 进制带符号数 y,则计算结果的 10 进制表示为实验描述本程序中所有角度和函数值都是采用二进制表示,
9、具体描述如下:1) 模块名: Cordic ;2)角度值:采用10 位二进制表示,用表示,因此 200H表示,100H表示;3)函数值:采用10 位二进制补码表示,用表示函数值;此时采用补码形式,对应,对应;4) 输入及输出参数: clk :时钟信号;rst :重置信号;ena:启动信号,该信号置 1 时系统开始运算过程; phase_in (10 位二进制数):输入的角度值;sin_out (10 位二进制数):输出的函数值 ;5) 函数变量cos_out (10 位二进制数):计算得到的函数值,与 sin_out同时产生但不输出;phase_in_reg (10 位二进制数):程序中实际参
10、与运算的角度值,下面会进行说明;x0-x8 、y0-y8 、z0-z8 (均为 10 位二进制数):在迭代算法中使用的临时参数,x和 y 参数存储三角函数值, z 存储角度值。 x0、y0、z0 存储初值,其它参数存储 8 次迭代的临时值 ;quadrant ( 10 个 1 位存储器):存储输入角度值的相位信息,具体用处见下面说明 ;PIPELINE:流水线,必须和数据位长相同。本程序使用10 级流水线。主要工作流程下面进行算法当中数据变化的详细说明:1) 初值问题这里置其原因是2) 迭代运算此段代码是程序的主要部分,简单的说就是实现CORDIC算法的旋转模式:Where它采用二进制位运算,
11、对一些复杂地方进行相应说明:正负的判断:通过判断符号位(首位) ;的实现:即每次迭代时对或作除 2操作具体实现方法为把原二进制值向右移动一位,移出的空位补0; 每次迭代时,的值要减去的角度值满足公式3) 结果处理利用三角函数性质, 由于结果是在角度位于第一象限情况下获得的,因此作如下处理:输入角度在第一象限:值不变,值不变;输入角度在第二象限:值不变,值取反;输入角度在第三象限:值取反,值取反;输入角度在第四象限:值取反,值不变;取负方法:所有二进制位取反加一(补码)。4.2 用 CORDIC算法计算(10 次迭代)这个程序是对 8 次迭代的程序进行修改后获得的,基本代码与工作流程完全相同,以
12、下只说明修改的地方。1)数据位长度:由上述公式可得,每次、和的变化范围随迭代次数增加而减小,若仍采用原先的 10 位二进制数存储数据,到了较高次迭代时会出现数据过小而无法完全表示的情况,因此数据位长需要增加。本程序中,、和位长度都增加到 16。2)增加迭代次数及对应临时变量,修改输出变量;3)重新计算原程序使用的角度值,优化计算结果;4)修改测试文件的信号,以实现位长的对应;5)修改相关判断语句。4.3 用 CORDIC算法计算(8 次迭代)实验原理实验原理与上述实验类似,这里不再累述。实验描述本程序中的角度值、函数值、函数变量等与上述实验类似,这里不再累述。输入及输出参数有所变化,具体变化的
13、参数描述如下:phase_in_x (10 位二进制数):输入 x 值;phase_in_y (10 位二进制数):输入 y 值;sin_out:输出值;cos_out :输出值;主要工作流程主要工作流程与上述实验类似,这里不再累述。五 实验结果及分析5.1 计算,迭代次数为 8 次仿真结果分析仿真图如下:从上图可以看出,10 比特数据位宽时进行8 次 CORDIC算法迭代之后所得的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术, 8 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。仿真结果分析仿真图
14、如下:从上图可看出,10 比特数据位宽时进行8 次 CORDIC算法迭代之后所得的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。误差分析我们将 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.1
15、0140.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 计算,迭代次数为 10 次仿真结果分析仿真图如下:从上图可以看出
16、,16 比特数据位宽时进行10次 CORDIC算法迭代之后所得的结果曲线符合正弦函数特性,说明 CORDIC算法取得了较为正确的运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术, 10 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。仿真结果分析仿真图如下:从上图可以看出,16 比特数据位宽时进行10次 CORDIC算法迭代之后所得的结果曲线符合正弦函数特性,说明CORDIC算法取得了较为正确的运算结果。误差分析我们将 0 到 90 度对应角度值的实验值与理论值填入了表格进行对比,直观的显示了上述规律,结果如下所示:度数5.62511.2516.87522.528
17、.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.99
18、521.0000误差0.00000.00000.00010.00000.00000.00070.00000.0000从表格可以看出, 16 比特 10 次迭代的平均误差非常小,在保留四位小数的条件下几乎没有误差,与前面的仿真图相符,说明实验结果正确。同时说明16 比特10 次迭代的计算精度要优于 10 比特 8 次迭代的计算精度。5.3 计算,迭代次数为8 次仿真结果分析仿真图如下:从上图可以看出,10 比特数据位宽时进行8 次 CORDIC算法迭代之后所得的结果在一定误差范围内是符合要求的,说明 CORDIC算法取得了较为正确的运算结果(误差较大的原因可能是数据位宽较小或者是迭代次数过少)。
19、同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术, 8 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。六 遇到问题分析1)最主要的问题是最开始的时候对实验原理不是十分了解,导致在后来进行十次迭代的改进时不知道如何下手。2)虽然进行最开始的几组数据仿真时并没有出现问题,但实际上结果已经是不正确的了。原因是我们不会使用仿真功能当中的一项功能,导致没有调用出来 sin ? ( ?) 的波形。最后在助教的帮助下调用出来仿真波形。3)Modelsim 仿真输出波形出现红色线条。 进行测试文件的检查: 信号设置有误。另外流水线和数据位长不一致也会出现此情况。4)在进行最后 Chipscope 的时候一定要先将测试文件删掉,否则会带来不必要的麻烦。虽然助教将这一点进行了强调说明, 但在最后几次时由于手忙脚乱, 忘记了将 test 文件删除导致管脚的错误和仿真波形无法出现的问题。5)双击 Analyze Design Using Chipscope 时,出现了错误。经过查找发现顶层测试文件中实例化 IPCore 模块语句中, IPCore 名字与工程中创建的 IPCore 名字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论