当前位置:首页 > 北邮 FPGA 实验三 - 图文
3.2 用CORDIC算法计算??????(??)
1)建立工程,并将压缩包中的Cordic.v添加到工程中;
2)为该文件设计测试文件,并进行功能仿真和时序仿真,观察并分析从一个角度值x的输入到它对应的sin(x)输出所对应的时间; 3)按以下步骤在工程中添加一个ROM IPCore;
输入IPcore文件名并点击Next,选择
下的
存储器类型选择单口ROM
5
,并点击Next。
点击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.v
5)添加约束文件,参见压缩包中的cordic.ucf文件。自行设置Chipscope中的信号连接,用Chipscope工具进行在板测试,记录数据,并计算迭代次数为8次时的平均误差。;
6)修改迭代次数为10次,重新进行仿真和测试。 3.3 用CORDIC算法计算 ????+????
将程序修改为计算 ??2+??2的工作模式,重复上述测试。
6
四 实验分析
4.1 用CORDIC算法计算??????(??)(8次迭代) 4.1.1. 实验原理
8次迭代的输入角度值和输出函数值均采用10位二进制数表示
用0000000000~1111111111表示0~2π,因此200H表示π,100H表示π/2; 用0000000000~1111111111表示函数值?1~+1;
此时采用补码形式,0~511对应0~+1,512~1024对应?1~0; x0初值为
12^9?=134??
????设输入的角度值为16进制表示数X,将X换算成带符号的十进制数x,则与角度值之间的换算关系为
xα=?π
512设CORDIC算法计算得到的输出函数值为Y,将Y换算成10进制带符号数y,则计算结果的10进制表示为
??
????????= 5124.1.2. 实验描述
本程序中所有角度和函数值都是采用二进制表示,具体描述如下: 1) 模块名:Cordic;
2) 角度值:采用10位二进制表示,用0000000000~1111111111表示0~2π,
因此200H表示 π,100H表示 π/2; 3) 函数值:采用10位二进制补码表示,用0000000000~1111111111表示函数
值?1~+1;此时采用补码形式,0~511对应0~+1,512~1024对应?1~0; 4) 输入及输出参数: clk:时钟信号; rst:重置信号;
ena:启动信号,该信号置1时系统开始运算过程; phase_in(10位二进制数):输入的角度值; sin_out(10位二进制数):输出的???????(?) 函数值; 5) 函数变量
cos_out(10位二进制数):计算得到的?????? ? 函数值,与sin_out同时产生但不输出;
phase_in_reg(10位二进制数):程序中实际参与运算的角度值,下面会进行说明; x0-x8、y0-y8、z0-z8(均为10位二进制数):在迭代算法中使用的临时参数,x和y参数存储三角函数值,z存储角度值。x0、y0、z0存储初值,其它参数存储8次迭代的临时值;
7
quadrant(10个1位存储器):存储输入角度值的相位信息,具体用处见下面说明;
PIPELINE:流水线,必须和数据位长相同。本程序使用10级流水线。 4.1.3. 主要工作流程
下面进行算法当中数据变化的详细说明: 1) 初值问题 这里置??0=1/????
其原因是xn=An???0?????????0 2) 迭代运算
此段代码是程序的主要部分,简单的说就是实现CORDIC算法的旋转模式: ????+1=???????????????2??? ????+1=????+??????????2??? zi+1=??????????tan?1(2???) Where
????= ?1 ???? ????<0 ,+1 ?????????????????
它采用二进制位运算,对一些复杂地方进行相应说明: ① zi(????) 正负的判断:通过判断符号位(首位); ②2??? 的实现:即每次迭代时对????或????作除2操作
具体实现方法为把原二进制值向右移动一位,移出的空位补0; ③ 每次迭代时,?? 的值要减去的角度值满足公式 tan?12??? 3) 结果处理
利用三角函数性质,由于结果是在角度位于第一象限情况下获得的,因此作如下处理:输入角度在第一象限:????????值不变,????????值不变;输入角度在第二象限:????????值不变,????????值取反;输入角度在第三象限:????????值取反,????????值取反;输入角度在第四象限:????????值取反,????????值不变;取负方法:所有二进制位取反加一(补码)。 4.2 用CORDIC算法计算??????(??)(10次迭代)
这个程序是对8次迭代的程序进行修改后获得的,基本代码与工作流程完全相同,以下只说明修改的地方。 1)数据位长度:由上述公式可得,每次、和的变化范围随迭代次数增加而减小,若仍采用原先的10位二进制数存储数据,到了较高次迭代时会出现数据过小而无法完全表示的情况,因此数据位长需要增加。本程序中,????、????和????位长度都增加到16。
2)增加迭代次数及对应临时变量,修改输出变量; 3)重新计算原程序使用的角度值,优化计算结果; 4)修改测试文件的信号,以实现位长的对应; 5)修改相关判断语句。
8
共分享92篇相关文档