FPGA实验二报告.docx
- 文档编号:7705529
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:14
- 大小:774.40KB
FPGA实验二报告.docx
《FPGA实验二报告.docx》由会员分享,可在线阅读,更多相关《FPGA实验二报告.docx(14页珍藏版)》请在冰点文库上搜索。
FPGA实验二报告
信息与通信工程学院
信息与信号处理综合实验报告
(FPGA部分)
题目:
CORDIC算法
班级:
专业:
信息工程
姓名:
学号:
一、实验目的
(1)掌握FPGA设计中的流水线技术;
(2)掌握Cordic算法的基本原理及其实现方法;
(3)了解通过在片内生成ROM的方式进行在板模块测试的方法。
二、实验内容
(1)按实验指导书所给出的步骤,在FPGA上实现Cordic算法用于计算sin(x)。
(2)修改程序使其能够用于计算
。
(扩展)
三、算法原理解释
实验要求的两部分功能:
cordic算法求算sin(x)和
均在均在圆周系统下分别使用旋转模式和向量模式实现,所以这里也只简单介绍圆周系统下的cordic算法
1.旋转模式
Figure1.圆周系统平面坐标旋转
由图知:
如果使用迭代的方法,旋转的角度可以在多步之内完成,每一步旋转完成其中一小部分,多步之后将会完成一个平面旋转。
为计算更加方便,令
,其中
表示下一次旋转的旋转方向。
为了能确定下一次的旋转方向,我们引入
,如果
大于0,即为还没有转到目标角度,下一次为逆时针旋转,即
,若
小于0,说明向量已经旋转超过了目标角度,需要往回转,即顺时针旋转,则
。
依此机制迭代多次,多个
(i=0…n)相乘会出现增益K。
K取决于迭代次数,对于所有初始向量和所有旋转角度而言,K为一个常数(按实验指导书中,此处K=0.6073)
旋转模式中,Z为输入,是需要旋转的角,当Z旋转变为0时,程序结束,即为已知目标角度,经过旋转将一向量从0度旋转到目标角度。
经N次迭代后,上述方程转化为:
所以如果设
,那么N次迭代后Cordic算法输出变为:
,这里我们要计算sinx所以只要输出y即可。
2.向量模式
向量模式中,XY为输入,当Y=0时结束,大致算法思想变为已知某向量位置,经过旋转,最终使向量转到x轴上结束。
迭代过程大致与旋转模式相同,但在旋转方向判断上,改用
代替
,如果
大于0,即为向量还在x轴上方,下一次为顺时针旋转,即
,若
小于0,说明向量已经旋转到x下方,需要往回转,即逆时针旋转,则
。
向量模式下最终的结果为:
四、算法的FPGA实现
由于实验中的text文件中代码相对简单,均是给输入变量赋初值并不断累加的过程,此处就不在赘述,只相对详细的介绍主函数的部分,另外,chipscope部分实验指导书中也已经细致的阐述,此处只简单介绍需要改动的部分。
1.六次迭代计算sin(X)
(1)主要输入及输出变量释义:
DATA_WIDTH=8;
//数据长度,主要由迭代次数决定,随迭代次数增多,
的值会越来越小,需要表示精度就越来越高,当迭代6次时,
=1.7899°,即20h’00145d,所以用8位恰好可以表示。
PIPELINE=8;//流水线长度,关于流水线的部分将在后面详细阐述。
phase_in;//输入的角度值
phase_in_reg;//将输入角度经过变换后,实际参与运算的值
sin_out;//输出sin的值
eps;//转过的角度值
x0~7,y0~7,z0~7;//中间变量,分别储存第i次迭代后的函数值
(2)程序流程图:
由于代码较长,所以这里只用流程图代替说明。
(3)程序说明
a)关于角度值与函数值:
由于输入时,参与运算的都是旋转的角度值,范围是0~2π,而输出时为sinx值,是函数值,有正负,范围为-1~+1。
于是这里规定:
在输入中,将0000_0000~1111_1111表示0~2π的角度值,0000_0001表示360/256。
在输出时,采用补码表示,第一位为符号位,0000_0000~0111_1111表示0~+1,1000_0000~1111_1111表示
1~
。
最低位表示
。
b)关于X的初值:
前面算法说明的时候已经说过,这里取k,即0.60725,但由于是用16进制表示,先转换成二进制。
因为是有符号位8位二进制数,恰好k第一位也是0,所以只要直接乘以27,左移7位再转化即可。
c)关于象限和Z正负的判断:
由于坐标系总是将所有数从大到小分成四部分(即四个象限),所以前两位即为象限信息,[00]为第一象限,[01]为第二象限,[10]为第三象限,[10]为第四象限。
Z的首位即为符号位,0为正,1为负。
d)象限调整的必要性:
不管是旋转模式还是向量模式,最大旋转角度大约在-99.88°~99.88°,也就是说旋转覆盖角度只能为第一四象限,所以要进行象限调整。
e)X、Y计算中
的实现方法:
相当于对上一次的X、Y值除2,采用向右移位,空位补0的方法实现
f)流水线的采用原因及长度选取:
如果某个设计的处理流程分为若干步骤,且整个数据处理是单流向的,没有反馈或迭代运算,前一个步骤的输出是下个步骤的输入,可以采用流水线结构。
如Figure2,流水线结构类似于一个移位寄存器组,能并行工作,所以提高了工作效率和运算速度,在这里它还控制了输出位置。
Figure2.流水线设计时序示意图
在本程序中,除了6次迭代需要6个移位寄存器外,还有一个象限判断和一个赋初值的过程,所以需要长度为8的流水线控制。
quadrant[PIPELINE:
0]中储存的是象限信息,为输出时的补码变换提供信息。
(4)实验结果
a)modelsim仿真结果
Figure3.modelsim6次迭代仿真波形
实验结果分析:
函数输出波形基本为正弦形状,不过有几处毛刺,并且波形阶梯状仍较为明显。
仿真成功。
b)Chipscope仿真波形
Figure4.六次迭代chipscope波形-busplot(半个周期)
由Figure4看出,这是输出仅为半个周期的sin(x)的波形,这主要是angle.coe文件中的初值设定的原因,将初值向后多赋32个数,变成64个数。
输出如下图Figure5。
Figure5.六次迭代chipscope波形-busplot(一个周期)
Figure6.六次迭代chipscope波形–waveform(半个周期)
(5)误差计算
由chipscope波形中,将各角度的实际值分别取出,即隔64位的数分为一组,取其平均值,结果如下表所示,可知六次迭代的平均误差约为0.028。
Table1.6次迭代误差计算
角度值
理论值
实际值
误差
22.5°
0.383
0.347
0.036
45°
0.707
0.719
0.012
67.5°
0.924
0.890
0.034
90°
1
0.980
0.02
112.5°
0.924
0.947
0.023
135°
0.707
0.695
0.012
157.5°
0.383
0.352
0.031
180°
0
0.060
0.060
(6)误差分析:
(六次与十次迭代误差产生原因相同,不再赘述)
i.test文件中设定100ns后,ena=1,开始运行程序,但波形在大约186ns才开始生成,延迟原因应为六次迭代的运算时间造成的时延,可推算六次迭代时间约为86ns。
ii.由于位长限制,arctan(2-i)计算得出的值一定会有舍去的部分,有些次运算舍去的部分可能较大,经过迭代的累积,可能会产生较大的误差。
通过与十次迭代对于
值的重新计算得到
iii.的图像对比得知,这也是Figure3中红圈部分毛刺产生原因。
iv.由于迭代次数的限制,可能Z还并没有很接近0,导致图中阶梯状的原因。
v.迭代运算中,x、y的值有移位的操作来进行每次的除2操作,其间被移除的数据也造成了误差。
2.十次迭代计算sin(x)
由于10次迭代和6次迭代原理相同只是增加了迭代次数,这里只阐述和6次迭代的不同之处。
(1)10次迭代时需要变动的位置
a)DATA_WIDTH由8位改为12位,由于如果迭代10次,原来数据长度由于
值太小无法表示;
b)增加变量。
原来的x,y,z的中间变量由8个变为12个;
c)流水线由原来的8增加到12。
判断象限和赋初值的过程未变,迭代次数增加,
流水线长度也相应增加;
d)增加第7次迭代到第10次迭代的代码;
e)将ipcore和chipscope文件设置中的writewidth和datawidth分别由8改为12;
f)更改test文件和top文件中的相应数据位长;
g)更新由于数据精度变化而更加精确地
值,如table2中所示。
其中数据精度的修改:
Table2.Θ值精度修改
8位
12位
8位
12位
45°
8’h20
12’h200
2°
8’h01
12’h014
24°
8’h12
12’h12e
0.9°
12’h00a
14°
8’h09
12’h0a0
0.4°
12’h005
7°
8’h04
12’h051
0.2°
12’h002
4°
8’h02
12’h029
0.1°
12’h001
(2)实验结果
a)Modelsim仿真波形
Figure7.十次迭代modelsim仿真波形
波形分析:
由于增加了迭代次数和数字精度,图形阶梯化和毛刺明显减少,图像更加平滑。
仿真基本成功。
b)Chipscope波形
Figure8.十次迭代chipscope波形--busplot
Figure9.十次迭代chipscope波形--waveform
3.10次迭代计算
(1)主要输入输出变量释义:
DATA_WIDTH=12;//数据长度
PIPELINE=12;//流水线长度
x_ini;//输入的x的初值
y_ini;//输入的y的初值
x_out;//输出的x的值
x_temp;
y_temp;//为将向量调整到0~45度角使用的中间变量
(2)程序流程
基本与旋转模式下10次迭代相同,判断上一时刻的y值正负带入不同迭代方程
(3)程序说明
a)关于x的输出:
由算法原理阐述过的,迭代后的x值为
,所以要在输出前乘k。
通过移位来实现更加精确。
x_out<=((x10>>1)+(x10>>4)+(x10>>5)+(x10>>7)+(x10>>8)+(x10>>10)+(x10>>11)
b)关于向量调整到0°到45°:
由于向量旋转只能覆盖一四象限,所以还是要先将向量调节到第一象限。
另外由于我们是判断y的正负来确定旋转方向,角度小于45°的角,角度的变化对于y值的影响较为明显,所以如果所求向量角度在45°~90°范围内,先将x与y互换,转换到0°~45°的范围内进行计算,这样收敛的速度会比较快,在相同的迭代次数的条件下可以减少误差。
(4)实验结果
a)Modelsim仿真波形
Figure10.平方和求根modelsim波形
波形分析:
Test文件中设定y值不变,x值增加,当x增加到0001_0000_0000时,x归零再循环,于是理论图形应是双曲线一只的一部分。
仿真图像大体与理论分析相符,只是由于迭代次数还是较少,图形结阶梯化仍旧比较明显。
由图中看出,在100ns时ena置一后,在125ns左右才产生波形,所以推测算法在进行10次迭代运算时产生的延时约为25ns。
b)Chipscope仿真波形:
Figure11.平方和求根chipscope波形--busplot
Y不变恒等于12'h100
Figure12.平方和求根chipscope波形--waveform
(5)误差分析
i.X、Y移位操作被省略的数值会造成误差,另外x_out的输出中的系数也是靠移位产生的,也会产生一定误差。
ii.最终10次移位可能仍没有完全移到x轴上,期间会有较小的误差。
五、出现的错误和解决方法
1.一开始modelsim仿真无波形,出现的是一条直线
解决方法:
后来发现是显示的设置问题,将format中改为analog(automatic)。
2.一开始仿真出来的波形不完整,只有sin(x)的不到一个周期的图像。
解决方法:
仿真时间太短,因为这里text文件中写的是clk5ns翻转一次,所以在8192000ps时差不多会有不到四个周期。
3.Modelsim仿真正常的情况下,chipscope仿真波形输出时常数。
解决方法:
最后发现时在ipcore设置的时候将singleportROM错选为singleportRAM,最后修改设置成功输出。
4.在第一次chipscope输出后发现代码出现错误,更改代码正确后,第二次输出波形仍错误。
解决方法:
应该勾选清空硬件中之前的记忆,勾选后重新仿真,波形正确。
5.当输出初值改为一个周期时,波形出现如下状况(见Figure13)
Figure13.十次迭代输出一个周期的出错波形
解决方法:
输出格式的错误,当输出格式更改为有符号十进制数的时候输出正常。
六、心得体会
因为原理相对之前的实验较复杂,在理解原理上花了比较长的时间,但同时也对cordic算法,及其fpga实现旋转模式、向量模式有了较为透彻的理解,同时刚刚接触了ipcore和top、chipscope文件等,只是对其有了一个大体上的理解,希望能在以后的实验中对其能有更深刻的理解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 实验 报告