IP核产生正弦函数..docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IP核产生正弦函数.

本文介绍如何使用xilinx的CORDIC 核生产一个sin和cos波形?cordic的原理就不介绍了,百度一大堆,我们知道原理后,需要去使用它。环境:xilinx ISE 14.5 ?cordic 4.0modelsim?首先是IP核的选项设置,照例的有图才方便学习~?标注1:选择函数的类型,我们选择计算sin和cos值。标注2:选择cordic的结构,是字串行还是并行,我们选择并行。标注3:选择输出流水线类型,我们选择不要流水线。关于cordic的计算结构,是并行还是串行,datasheet上面有介绍时序图:?看时序图可知,serial类型计算一个值,需要的clk比parallel需要的多,但是datasheet后面有说serial占用的资源少。如果感兴趣可以看datasheet上介绍的二者的内部结构。serial 占用的资源少,需要的clk多,也会使端口多出几个PIN,控制起来麻烦一点,如下图:?关于输出流水线类型,我们选择NO Pipelining ,如果选择其他的,那么输出的结果会延迟不定时的clk才产生,当然好处是节省资源。选择NO Pipelining 时, 1个clk就出一个计算值,有点费资源。文档的最后有对二者的资源占用比较,可以参考。如果对延时不在意,但是想节省资源的话,就选择优化。datasheet相关介绍:?标注1:选择相位角的格式,我们选择Scaled Radians(意思是多少PI)。标注2:选择数据宽度,这个和你需要多少位宽的数据有关,我们选择16位。标注3:舍位模式,选择的是近似值。对于相位角格式,datasheet的定义为:数据的有效值的定义为:相位角:?第一位是符号位,第二、三位是整数位,其他是小数位。sin数据: 第一位符号位,第二位整数位,其他小数位。cos数据:第一位符号位,第二位整数位,其他小数位。数据的舍位模式:(具体可以看下表)??标注1:选择阶乘和精度,0表示根据数据来自动选择。标注2:选择cordic算法的范围,将输出值控制在-pi/4 ~ +pi/4之间还是-pi ~ +pi之间。标注3:选择PIN,本来sin和cos功能是可以不要RDY的,但是我需要RDY来查看什么时候输出数据才有效。标注2的详解:?如果你要生成正弦余弦波,那么你的Coarse Rotation必须选上,让输出数据是整个圆平面。这样设置好的cordic IP核只是第一步,下一步是来设置合适的相位phase,以产生完整的波形。datasheet所示:我设置的数据位是16位,那么+1.0 - 16‘h2000; ? -1.0 - 16he000;(暂时给定phase的步进为16’h00C0,至于怎么确定,下面会说到,cordic的时钟我设置的是100Mhz)如果直接让phase从 16‘h2000?到 16he000?,那么波形就会变成这样:原因是,16‘h2000 到 16he000 之间有一长段的phase是大于+1和小于-1的,cordic IP核会当做+1和-1计算,所以才会一直是相同的值。那么怎样才能产生完整的正弦波?我们将phase从16he000 到 16‘h2000 ,仿真结果为:发现有的地方是完整的波形了,那么现在我们需要找到波形的衔接点:我选取x_out的二个波谷做一个周期,那么找到二个波谷对应的phase即可,注意cordic计算是需要clk,当rdy为1时,数据才有效,所以我们要找到延时的clk数。我用cnt来计算,大概11个clk,数据有效。(注意不同的cordic设置会产生不同的延时,所以cnt不是固定的)那波谷对应的phase是向前数11个clk对应的phase:16‘hd980?同样找到另一个波谷的phase值为:16‘h1940?仿真产生完整的正弦余弦波:?测试的testbench:?那么步进的phase怎么计算呢?我选择的是16’h00C0,十进制是192。刚才提到了,+1 到 -1(16‘h2000 到 16he000)之前有 :16he000 - 16‘h2000 = 16‘hC000,也就是49152.256 * 192 = 49152,那么当步进取192的时候,256个clk就可以从2000加到E000了。这样不会出现起始数据不定的状况。这里建议数值是49152的约数比较好,当然不是它的约数也行。16‘h00C0 - 0000 0000 1100 0000,按照datasheet的phase数据格式:000,0 0000 1100 0000,也就是十进制的0.0234375。而这个数的角度值为:0.0234375 * 180° = 4.21875°,也就是每个clk步进4.21875°。一个圆有360°,那么从0°到360°一共步进360° / 4.21875° 约

文档评论(0)

kaiss + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档