




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Experiment 05:CORDIC 算法建模故事说到,在原公式的尽头,终于找到最适合硬件的简化公式,它不仅没有浮点数(被定点数取代),而且操作也只有位移与加减而已。不过,这次的任务却非常严重,要建立有史以来第一只数学模块,它是 CORDIC 算法的雏形,而且会影响未来的走势。擦掉冷汗以后,就要踏出人生中关键的一步 .代码 5.1首先是建立常量表,但没有数组机能的描述语言,要如何建模常量表,其实是一件有趣。常见的方法就是利用片上内存制作查表,但是笔者并不打算这样做,取而代之是尝试另一种更大胆的做法。如代码 5.1 是伪代码的常量表,对此 Verilog 可以这样描述。代码 5.2如代码 5
2、.2 所示,可以atan 内存,32 位的位宽,16 位计数范围,以及 16位的补偿精度,然后再为赋予初值。理论上,这种行为会使综合器消耗片上内存制作查表,然而是否如此,具体还要考虑怎样使用它,详情成数组来对待即可。往后再。读者暂时把它当1.for(i = 0; i 0)4.tx = x + y i;ty = y - x i;x = tx;y = ty;angle += atani;1.reg 31:0 atan 15:0;2.3.initial begin4.atan0 = 32d2949120; atan1 = 32d1740992; atan2 = 32d919872; atan3 =
3、32d466944;5.atan4 = 32d234368; atan5 = 32d117312; atan6 = 32d58688; atan7 = 32d29312;6.atan8 = 32d14656; atan9 = 32d7360; atan10 = 32d3648; atan11 = 32d1856;7.atan12 = 32d896; atan13 = 32d448; atan14 = 32d256; atan15 = 32d128;8.end1.constatan = 2949120, 1740992, 919872, 466944,2.234368, 117312, 5868
4、8, 29312,3.14656, 7360, 3648, 1856,4.896, 448, 256, 128 ;代码 5.3如代码 5.3 所示,这是 CORDIC 算法的操作,它比较麻烦,因为里面有FOR 循环以及符号位,此外还要数组。按照传统,如果使用查表的话,建模肯定会大费周章,所以笔者决定犯规一点,对此 Verilog 可以这样描述。代码 5.4如代码 5.4 所示,笔者采用最喜爱的仿顺序操作,第 1 行先带有符号位的寄存器,步骤 0 是前期操作,xy 给予 216 的补偿精度。步骤 116 表示矢量移动 16 次,其中 y作为参考系,如果 y 大于 0 值就执行相加关系的操作。注意
5、,实现 y0 的前提条件,y必须是符号位. 如果不是,那么 y31 = 0 也有一样的效果。第 1011 行是带符号位的位移操作,操作对象必须事先利用 singed 关键字符号位才有效。老实说,笔者也是第一次使用“”操作符而已,平常都不太位的存在。第 1213 行则是更新 xy 坐标,第 14 行更新角度。有符号1.reg signed 31:0 x,y,tx,ty,deg; / 带符号位的寄存器 2.reg 7:0i;3.0: / 补偿精度begin x = input_x 16; y = input_y 16; deg = 32d0; i 0 )/ 矢量向上旋转beginty = y i-
6、1;/ y 带符号位位移tx = x i-1;/ x 带符号位位移x = x + ty;/ 更新 x 坐标y = y - tx;/ 更新 y 坐标deg = deg + atani-1;/ 递增角度 15.i i;ty = y + x i;x = tx;y = ty;angle -= atani;18.代码 5.5如代码 5.5 所示,这是相减关系的操作,基本上它和代码 5.5 很相似,只是加减关系被改变而已。前面,常量表是否会消耗片上内存,最终还是要取决使用过程,然而这里只有操作而已,所以代码 5.2 会建造基于逻辑资源的查表。这样做仅仅适合围的查表而已,如果查表太大可能会不所有逻辑资源。以
7、上,就是建模最关键的几个地方。图 5.1 实验五的建模图。如图 5.1 所示,这是实验五的建模图,这里有一只名为 CORDIC 的功能模块,左边是调用信号以及 32 位宽的输入信号 xy,右边是 32 位宽的输出信号 Data。这里补充一些小知识,反正切有很多名字,其中 arctan(y/x)是将 y 与 x 坐标一个参数,反之atan(y,x)则是将y 与 x 坐标视为两个参数。好了,让来瞧一瞧这只模块的。cordic.v1.module cordic 2.(inpLOCK,RESET,input iCall,output oDone,input 31:0ix,input 31:0iy,ou
8、tput 31:0oData, 9.else/ 矢量向下旋转beginty = y i-1;/ y 带符号位位移tx = x i-1;/ x 带符号位位移x = x - ty ;/ 更新 x 坐标y = y + tx ;/ 更新 y 坐标deg = deg - atani-1;/ 递减角度 24.i = i + 1b1;25. end以上内容是相关的端口,注意 q 开始是仿真作用的信号。以上内容为常量,这是查表作用的 atan 常量表。以上内容为相关的寄存器以及复位操作。else if( iCall )case( i )34.0:35.begin x = ix; y = iy; deg = 3
9、2d0; i 0 )39.begin40.ty = y i-1;41.tx = x i-1;42.x = x + ty;20.reg signed 31:0 x,y,tx,ty,deg; 21.reg 7:0i;22.reg isDone; 23.always (edge CLOCK or negedge RESET )if( !RESET )begin27. x,y,tx,ty,deg = 32d0,32d0,32d0,32d0,32d0 ;28.i = 8d0;isDone = 1b0;end12.reg 31:0 atan 15:0;13.14.initial begin15.atan0
10、 = 32d2949120; atan1 = 32d1740992; atan2 = 32d919872; atan3 = 32d466944;16.atan4 = 32d234368; atan5 = 32d117312; atan6 = 32d58688; atan7 = 32d29312;17.atan8 = 32d14656; atan9 = 32d7360; atan10 = 32d3648; atan11 = 32d1856;18.atan12 = 32d896; atan13 = 32d448; atan14 = 32d256; atan15 = 32d128;19.end10.
11、output 31:0q_deg,q_y,q_x 11. );以上内容为是 CORDIC 的操作。步骤 0 赋值 xy 寄存器,顺便也一些 deg 寄存器。步骤 116操作,同时也表示矢量移动 16 次,其中 y 作为旋转的参考系,如果它大于 0 直就执行相加关系的操作。当中,ty 与 tx 是带符号位位移的临时 xy 坐标,然后再更新成为下一个 xy 坐标。完后,deg 寄存器也递增 atan 指定的内容。以上内容为 改变了而已。操作。这是矢量的相减关系操作,它与上面大同小异,只是加减关系被以上内容为操作。步骤 1718 是返回操作。以上内容为输出驱动。其中 oData 的驱动对象是 deg
12、,反之 q的家伙都是仿真assign oDone = isDone;assign oData = deg;assign q_deg,q_y,q_x = deg,y,x ; 68.69. endmodule57.17:58.begin isDone = 1b1; i = i + 1b1; end 59.60.18:61.begin isDone = 1b0; i i-1;50.tx = x i-1;x = x - ty ;y = y + tx ;deg = deg - atani-1;54.i = i + 1b1;55.end56.y = y - tx;deg = deg + atani-1;4
13、5.i = i + 1b1;46.end作用的信号。cordic.vttimescale 1 ps/ 1 psmodule cordic_simulation(); 3.reg CLOCK;reg RESET;reg iCall;7.reg 31:0 ix;8.reg 31:0 iy;wire 31:0 oData;wirne;wire 31:0q_deg,q_y,q_x; 12.initialbeginRESET = 0; #10; RESET = 1;CLOCK = 0; forever #1 CLOCK = CLOCK;end 18.19.cordic U120.(.CLOCK(CLOC
14、K),.RESET(RESET),.iCall(iCall),.ix(ix),.iy(iy),.oData(oData),.oDonne),.q_deg( q_deg ),29.q_y( q_y ),30.q_x( q_x ) 31.);32.33.reg 7:0i;34.always (edge CLOCK or negedge RESET )if( !RESET )begin38.i = 8d0;以上内容为激励文件,具体内容笔者就不解释了。仿真结果:图 5.3 实验五的仿真结果之一。图 5.3 是实验五的仿真结果,大致过程如下:arctan(255/1)= 89.99839.iCall =
15、 1b0;40. ix,iy = 32d0,32d0 ;endelsecase( i )45.0: / x = 1, y = 25546.if( oDone ) begin iCall = 1b0; i = i + 1b1; end47.else begin iCall = 1b1; ix = 1 * 65536; iy = 255 * 65536; end 48.49.1: / x = 255, y = 1,50.if( oDone ) begin iCall = 1b0; i = i + 1b1; end51.else begin iCall = 1b1; ix = 255 * 65536
16、; iy = 1 * 65536; end 52.53.2: / x = 4, y = 3,54.if( oDone ) begin iCall = 1b0; i = i + 1b1; end55.else begin iCall = 1b1; ix = 4 * 65536; iy = 3 * 65536; end 56.57.3: / x = 1, y = 1 58.if( oDone ) begin iCall = 1b0; i = i + 1b1; end59.else begin iCall = 1b1; ix = 1 * 65536; iy = 1 * 65536; end 60.61.4:62.i = i;63.64.endcase65.66. endmodule以上是计算机得到的浮点数结果。最后让恭喜一下自己,终于利用硬件实现 CORDIC 算法,而且速度极快,大20个时钟之内完成运算,另外误差也可已接受。但是距离开派
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玩具行业人才培养与产业发展考核试卷
- 工程项目跟踪考核试卷
- 电子专用设备的智能调度与优化考核试卷
- 档案馆在数字治理中的角色考核试卷
- 电玩具电池选择与应用考核试卷
- 智能仪器仪表安全认证考核试卷
- 玻璃仪器在激光切割机优化中的应用考核试卷
- 2025届贵州省重点中学高三第二轮复习测试卷数学试题(五)
- 2025专营授权销售协议的合同
- 《东欧剧变和苏联解体》社会主义国家的改革与演变课件
- 人类行为与社会环境课件
- 搞好班组安全建设
- 富马酸伊布利特幻灯课件
- 新译林版高一英语新教材必修三全册课文及翻译(英汉对照)
- 陕西省潼关县潼峪-蒿岔峪金矿开采项目环评报告
- 高中化学常见晶体的结构及晶胞
- 着色探伤作业指导书
- 2002-2022广东省深圳市中考数学历年真题(共24套最全)学生版+解析版
- 2022年法考重难点专题刑法习题及答案解析
- GB/T 4857.13-2005包装运输包装件基本试验第13部分:低气压试验方法
- GB/T 28724-2012固体有机化学品熔点的测定差示扫描量热法
评论
0/150
提交评论