分享
分享赚钱 收藏 举报 版权申诉 / 16

类型北邮 FPGA 实验三.doc

  • 上传人:精品资料
  • 文档编号:8192668
  • 上传时间:2019-06-13
  • 格式:DOC
  • 页数:16
  • 大小:999.60KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    北邮 FPGA 实验三.doc
    资源描述:

    1、1北京邮电大学实验报告信号与信息处理综合实验(FPGA 实验)实验三 CORDIC 算法学院: 信息与通信工程学院 班级: 学号: 姓名: 2一 实验目的掌握 FPGA 设计中的流水线技术;掌握 CORDIC 算法的基本原理及其实现方法;了解通过在片内生成 ROM 的方式进行在板模块测试的方法。二 实验内容1)按实验指导书所给出的步骤,在 FPGA 上实现 CORDIC 算法用于计算 sin(x);2)修改程序使其能够用于计算 。2+2三 实验过程3.1CORDIC 算法原理CORDIC 算法的全称是 Coordinate Rotation Digital Computer ,可以用于实现对多

    2、种超越函数的运算。CORDIC 算法将多种难以用硬件电路直接实现的复杂运算分解为统一的简单移位-加法的迭代运算形式,结构规则、运算周期可以预测、适合于集成电路实现。所谓的超越函数是指变量之间的关系不能用有限次加、减、乘、除、乘方、开方运算表示的函数。如指数函数、对数函数、三角函数和反三角函数等都是超越函数。最初的 CORDIC 算法由 J.D.Volder 于 1959 年提出, 用于计算三角函数。 1971 年,Walther 提出了统一的 CORDIC 算法,引入了参数 m 将 CORDIC 实现的三种迭代模式:圆周、双曲和线性变换统一于一个表达式下。CORDIC 算法目前使用非常广泛,被

    3、称为算法中的瑞士军刀。下面我们首先介绍 CORDIC 算法的基本原理。笛卡尔坐标系中的旋转变换可以表示为:=+提取 变成 cos =()=(+)如果在这一表达式中限制 ,则括号内部分不包含乘法运算,移位 =2相加即可实现。实际上,任意角度的旋转都可以转化为一系列角度满足旋转的组合,假定总共旋转 次,第 次旋转角度满足 =2 i ,那么 为一系列常数。由此可知,每次旋转角度的绝对值是 =2 事先确知的,只是旋转方向不同。基于这种限制,将第 次旋转的方程转化为: i +1=23+1=+2=cos(tan12)=1/1+22=1去掉 则每次运算只包含移位和加法运算。 当 趋于无穷大时, 的连乘积:

    4、N = 0cosarctan(12)0.607253即算法本身存在增益 =1.647实际实现中 N 不可能很大,因此这一增益与次数有关:=n 1+22若事先确定迭代次数,则增益为一确定值,旋转角度由一系列 所 +1, -1 决定 角度累加方程:+1=tan1(2)与方程+1=2+1=+2一起构成三个迭代方程。CORDIC 算法有两种工作模式,一种称为旋转模式,另一种称为向量模式。 旋转模式就是将输入的复向量旋转指定的角度;向量模式则将输入向量旋转到 x轴上,并记录旋转方向向量。旋转模式下,每次旋转方向的确定由残留角的符号决定,其工作模式为:+1=2+1=+2+1=tan1(2)Where= 1

    5、 0 , +1 旋转模式的目标是使 。 z=0如果采用向量模式,则旋转角度不预先确定,目标是使 ,即将输入向量 y=0旋转到 轴上,旋转方向由残留 值的正负决定。 x y +1=24+1=+2+1=tan1(2)Where= +1 0 , 1 向量模式结果=20+20=0=0+tan1(0/0)=n 1+22适当选择初始值和工作模式,能直接计算 , , , () () ()复向量幅度,极坐标和笛卡尔坐标的变换等。例如 和 的计算可以通过旋转模式得到,选择初值: x 0=0, 0=1/设为待求角度,则0 =00=00向量模式可用于计算 ,要求输入以两个数的商形式给出 ,同时能计 ()算复向量幅度

    6、=0+tan1(0/0)=20+20实际上,CORDIC 算法还可以推广到双曲线和直线上+1=-2+1=+2+1=tan1(2)Where= -1 0 ,+1 =00+0sinh0)=00+0sinh0)50=0= 122=20200=0=0+tanh1(0/0)= 122三种情况下的 CORDIC 可以统一到以下框架下:+1=2+1=+2+1=流水线方式下的统一 CORDIC 实现方式如下图所示:3.2 用 CORDIC 算法计算 ()1)建立工程,并将压缩包中的 Cordic.v 添加到工程中;2)为该文件设计测试文件,并进行功能仿真和时序仿真,观察并分析从一个角度值 x 的输入到它对应的

    7、 sin(x)输出所对应的时间;3)按以下步骤在工程中添加一个 ROM IPCore;6输入 IPcore 文件名并点击 Next,选择下的 ,并点击 Next。存储器类型选择单口 ROM点击 Next,在第二个页面上设置 RAM 的位宽和深度,例如:点击 Next,在第 3 个配置页面上找到下图所示位置:此处需要加载用于初始化存储器的文件。根据文件中注释所提供的量化规则设置一些角度值存在一个.coe 文件中,.coe文件的样例见压缩包中的 angle.coe,可用任一文本编辑器打开,文件以“memory_initialization_radix=16;memory_initializatio

    8、n_vector=“开头,其后的数据以十六进制表示,数据之间以空格或逗号分割,文件的长度和数据位宽应与 ROM 的设置保持一致。其他选项保持为默认选项,点击7Generate 按钮生成 IPcore。此时在工程目录下的 ipcore_dir 文件夹中会产生一系列与设定的 IP core 同名的文件,其中包含一个.v 文件和一个.xco 文件,xco 文件是包含 IP core 配置信息的核心文件,.V 文件的格式与 verilog module 相同,其内容较为复杂,对使用者而言通常只关注它的模块头,作为实例化时的参考。4)产生一个用于在板测试的顶层文件,将 cordic 模块和 ROM 模块

    9、在该文件中进行实例化,参加压缩包中的 cordic_top.v5)添加约束文件,参见压缩包中的 cordic.ucf 文件。自行设置 Chipscope 中的信号连接,用 Chipscope 工具进行在板测试,记录数据,并计算迭代次数为 8次时的平均误差。 ;6)修改迭代次数为 10 次,重新进行仿真和测试。3.3 用 CORDIC 算法计算 x2+2将程序修改为计算 的工作模式,重复上述测试。 x2+2 四 实验分析4.1 用 CORDIC 算法计算 (8 次迭代)()4.1.1. 实验原理8 次迭代的输入角度值和输出函数值均采用 10 位二进制数表示用 表示 ,因此 200H 表示 ,10

    10、0H 表示 ;0000000000111111111102 /2用 表示函数值 ;00000000001111111111-1+1此时采用补码形式, 对应 , 对应 ;05110+1 5121024-10初值为x029* 1An=134H设输入的角度值为 16 进制表示数 X,将 X 换算成带符号的十进制数 x,则与角度值之间的换算关系为=512设 CORDIC 算法计算得到的输出函数值为 Y,将 Y 换算成 10 进制带符号数y,则计算结果的 10 进制表示为=51284.1.2. 实验描述本程序中所有角度和函数值都是采用二进制表示,具体描述如下:1) 模块名:Cordic;2) 角度值:采

    11、用 10 位二进制表示,用 表示 ,因 00000000001111111111 02此 200H 表示 ,100H 表示 ; /23) 函数值:采用 10 位二进制补码表示,用 表示函数 00000000001111111111 值 ;此时采用补码形式, 对应 , 对应 -1+1 0511 0+1 5121024 ; -104) 输入及输出参数:clk:时钟信号;rst:重置信号;ena:启动信号,该信号置 1 时系统开始运算过程;phase_in(10 位二进制数):输入的角度值;sin_out(10 位二进制数):输出的 函数值 ; () 5) 函数变量cos_out(10 位二进制数)

    12、:计算得到的 函数值,与 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) 初值问

    13、题这里置 x0=1/其原因是 =002) 迭代运算此段代码是程序的主要部分,简单的说就是实现 CORDIC 算法的旋转模式:+1=-2+1=+2+1=tan1(2)Where9= -1 0 ,+1 它采用二进制位运算,对一些复杂地方进行相应说明: 正负的判断:通过判断符号位(首位) ;() 的实现:即每次迭代时对 或 作除 2 操作2 具体实现方法为把原二进制值向右移动一位,移出的空位补 0; 每次迭代时, 的值要减去的角度值满足公式z tan123) 结果处理利用三角函数性质,由于结果是在角度位于第一象限情况下获得的,因此作如下处理:输入角度在第一象限: 值不变, 值不变;输入角度在第二象

    14、限: 值不变, 值取反;输入角度在第三象限: 值取反, 值 取反;输入角度在第四象限: 值取反, 值不变;取负方法:所有二进 制位取反加一(补码) 。4.2 用 CORDIC 算法计算 (10 次迭代)()这个程序是对 8 次迭代的程序进行修改后获得的,基本代码与工作流程完全相同,以下只说明修改的地方。1)数据位长度:由上述公式可得,每次、和的变化范围随迭代次数增加而减小,若仍采用原先的 10 位二进制数存储数据,到了较高次迭代时会出现数据过小而无法完全表示的情况,因此数据位长需要增加。本程序中, 、 和 位长度x 都增加到 16。2)增加迭代次数及对应临时变量,修改输出变量;3)重新计算原程

    15、序使用的角度值,优化计算结果;4)修改测试文件的信号,以实现位长的对应;5)修改相关判断语句。4.3 用 CORDIC 算法计算 (8 次迭代)x2+24.3.1. 实验原理实验原理与上述实验类似,这里不再累述。4.3.2. 实验描述本程序中的角度值、函数值、函数变量等与上述实验类似,这里不再累述。输入及输出参数有所变化,具体变化的参数描述如下:phase_in_x(10 位二进制数):输入 x 值;phase_in_y(10 位二进制数):输入 y 值;sin_out:输出值 ; =2+2cos_out:输出值 ; 104.3.3. 主要工作流程主要工作流程与上述实验类似,这里不再累述。五

    16、实验结果及分析5.1 计算 ,迭代次数为 8 次()5.1.1. Modelsim 仿真结果分析仿真图如下:从上图可以看出,10 比特数据位宽时进行 8 次 CORDIC 算法迭代之后所得的结果曲线符合正弦函数特性,说明 CORDIC 算法取得了较为正确的 () 运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,8 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。5.1.2. Chipscope 仿真结果分析仿真图如下:11从上图可看出,10 比特数据位宽时进行 8 次 CORDIC 算法迭代之后所得的结果曲线符合正弦函数特性,说明 CORDIC 算法取得了较为正

    17、确的 () 运算结果。5.1.3. 误差分析我们将 0 到 90 度对应角度值的实验值与理论值填入了表格进行对比,直观的显示了上述规律,结果如下所示:度数 5.625 11.25 16.875 22.5 28.125 33.75 39.375 45理论值 0.0980 0.1951 0.2903 0.3827 0.4714 0.5556 0.6344 0.671612实验值 0.0625 0.0469 0.1719 0.2813 0.3438 0.4531 0.5547 0.6563误差 0.0355 0.1482 0.1184 0.1014 0.1276 0.1025 0.0797 0.01

    18、53度数 50.625 56.25 61.875 67.5 73.125 78.75 84.375 90理论值 0.7730 0.8315 0.8820 0.9239 0.9569 0.9801 0.9952 1实验值 0.6875 0.7422 0.8750 0.9219 0.9453 0.9688 0.9844 0.9766误差 0.0855 0.0893 0.0070 0.0020 0.0116 0.0113 0.0108 0.0234从表格可以看出,10 比特 8 次迭代的平均误差比较小,与前面的仿真图相符,说明实验结果正确。5.2 计算 ,迭代次数为 10 次()5.2.1. Mod

    19、elsim 仿真结果分析仿真图如下:13从上图可以看出,16 比特数据位宽时进行 10 次 CORDIC 算法迭代之后所得的结果曲线符合正弦函数特性,说明 CORDIC 算法取得了较为正确的 () 运算结果。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,10 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。5.2.2. Chipscope 仿真结果分析仿真图如下:从上图可以看出,16 比特数据位宽时进行 10 次 CORDIC 算法迭代之后所得的结果曲线符合正弦函数特性,说明 CORDIC 算法取得了较为正确的 () 运算结果。5.2.3. 误差分析我们将 0 到 90

    20、 度对应角度值的实验值与理论值填入了表格进行对比,直观的显14示了上述规律,结果如下所示:度数 5.625 11.25 16.875 22.5 28.125 33.75 39.375 45理论值 0.0980 0.1951 0.2903 0.3827 0.4714 0.5556 0.6344 0.6716实验值 0.0980 0.1951 0.2903 0.3827 0.4714 0.5556 0.6344 0.7071误差 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0355度数 50.625 56.25 61.875 67.5 73

    21、.125 78.75 84.375 90理论值 0.7730 0.8315 0.8820 0.9239 0.9569 0.9801 0.9952 1实验值 0.7730 0.8315 0.8819 0.9239 0.9569 0.9808 0.9952 1.0000误差 0.0000 0.0000 0.0001 0.0000 0.0000 0.0007 0.0000 0.0000从表格可以看出,16 比特 10 次迭代的平均误差非常小,在保留四位小数的条件下几乎没有误差,与前面的仿真图相符,说明实验结果正确。同时说明 16 比特 10 次迭代的计算精度要优于 10 比特 8 次迭代的计算精度。

    22、5.3 计算 ,迭代次数为 8 次x2+25.3.1.Modelsim 仿真结果分析仿真图如下:15从上图可以看出,10 比特数据位宽时进行 8 次 CORDIC 算法迭代之后所得的结果在一定误差范围内是符合要求的,说明 CORDIC 算法取得了较 2+2 为正确的运算结果(误差较大的原因可能是数据位宽较小或者是迭代次数过少) 。同时可以看出,从输入到输出有一定的时延,本程序采用流水线技术,8 次迭代运算需要一定的时间,从而产生了从输入到输出的时延。六 遇到问题分析1)最主要的问题是最开始的时候对实验原理不是十分了解,导致在后来进行十次迭代的改进时不知道如何下手。2)虽然进行最开始的几组数据仿

    23、真时并没有出现问题,但实际上结果已经是不正确的了。原因是我们不会使用仿真功能当中的一项功能,导致没有调用出来 sin() 的波形。最后在助教的帮助下调用出来仿真波形。3)Modelsim 仿真输出波形出现红色线条。进行测试文件的检查:信号设置有误。另外流水线和数据位长不一致也会出现此情况。4)在进行最后 Chipscope 的时候一定要先将测试文件删掉,否则会带来不必要的麻烦。虽然助教将这一点进行了强调说明,但在最后几次时由于手忙脚乱,忘记了将 test 文件删除导致管脚的错误和仿真波形无法出现的问题。5)双击 Analyze Design Using Chipscope 时,出现了错误。经过

    24、查找发现顶层测试文件中实例化 IPCore 模块语句中,IPCore 名字与工程中创建的 IPCore 名字不一致,经过修改得到正确结果。6)在十次迭代的试验过程中,在波形图极点和零点处出现了失真的情况,最后发现原因是 cordic_top.v 文件中变量的位数为八次迭代的位数,而没有改成十次迭代的位数,将它进行修改后得到了正确的结果。167)在仿真结果出来后,分析结果时不知道该怎么计算理论值和实际值,后来分析了实验原理并且跟同学一起讨论才得以解决。8)分析理论值和实际值时,一开始我们按照上下一一对应的关系来对比发现误差特别大,后来我们将结果值画成波形图分析两者的关系找到了理论值和实际值之间的

    25、对应关系使问题得到了解决。七 心得体会本次实验是最后一次 FPGA 实验,我进一步加深了对 FPGA 设计中的流水线技术的理解和掌握,学习了 Cordic 算法的基本原理,掌握了通过在片内生成ROM 的方式进行在板模块测试的方法。我觉得这次实验的难点在于对 Cordic 算法原理的理解,它是一种数值逼近的方法,用一系列固定的角度不断偏摆逼近所需要的角度,实现包括乘法、平方根、三角函数、向量旋转以及指数运算。它是一个迭代的过程,适当选取一些固定的角度值,可以使运算只需进行移位和加减操作。非常适合硬件的实现,用数字方式解决实时问题。在实验之前,我们充分学习了实验指导书上的内容,结合给出的程序,在网上查找资料,用了比较多的时间才完成了扩展要求。发现问题和解决问题的过程激发了我们对于这个实验的兴趣,实验成果也使我们感到成就感。总而言之,此次实验使我对 FPGA 的相关知识又有了新的了解,令我受益匪浅。

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:北邮 FPGA 实验三.doc
    链接地址:https://www.docduoduo.com/p-8192668.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开