IP核产生正弦函数解读.docx

上传人:b****3 文档编号:4959807 上传时间:2022-12-12 格式:DOCX 页数:12 大小:1.03MB
下载 相关 举报
IP核产生正弦函数解读.docx_第1页
第1页 / 共12页
IP核产生正弦函数解读.docx_第2页
第2页 / 共12页
IP核产生正弦函数解读.docx_第3页
第3页 / 共12页
IP核产生正弦函数解读.docx_第4页
第4页 / 共12页
IP核产生正弦函数解读.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

IP核产生正弦函数解读.docx

《IP核产生正弦函数解读.docx》由会员分享,可在线阅读,更多相关《IP核产生正弦函数解读.docx(12页珍藏版)》请在冰豆网上搜索。

IP核产生正弦函数解读.docx

IP核产生正弦函数解读

本文介绍如何使用xilinx的CORDIC核生产一个sin和cos波形?

cordic的原理就不介绍了,XX一大堆,我们知道原理后,需要去使用它。

环境:

xilinxISE14.5 cordic4.0modelsim 

首先是IP核的选项设置,照例的有图才方便学习~

 

标注1:

选择函数的类型,我们选择计算sin和cos值。

标注2:

选择cordic的结构,是字串行还是并行,我们选择并行。

标注3:

选择输出流水线类型,我们选择不要流水线。

关于cordic的计算结构,是并行还是串行,datasheet上面有介绍时序图:

 

看时序图可知,serial类型计算一个值,需要的clk比parallel需要的多,但是datasheet后面有说serial占用的资源少。

如果感兴趣可以看datasheet上介绍的二者的内部结构。

serial占用的资源少,需要的clk多,也会使端口多出几个PIN,控制起来麻烦一点,如下图:

 

关于输出流水线类型,我们选择NOPipelining,如果选择其他的,那么输出的结果会延迟不定时的clk才产生,当然好处是节省资源。

选择NOPipelining时,1个clk就出一个计算值,有点费资源。

文档的最后有对二者的资源占用比较,可以参考。

如果对延时不在意,但是想节省资源的话,就选择优化。

datasheet相关介绍:

 

标注1:

选择相位角的格式,我们选择ScaledRadians(意思是多少PI)。

标注2:

选择数据宽度,这个和你需要多少位宽的数据有关,我们选择16位。

标注3:

舍位模式,选择的是近似值。

对于相位角格式,datasheet的定义为:

数据的有效值的定义为:

相位角:

 第一位是符号位,第二、三位是整数位,其他是小数位。

sin数据:

第一位符号位,第二位整数位,其他小数位。

cos数据:

第一位符号位,第二位整数位,其他小数位。

数据的舍位模式:

(具体可以看下表)

 

 

标注1:

选择阶乘和精度,0表示根据数据来自动选择。

标注2:

选择cordic算法的范围,将输出值控制在-pi/4~+pi/4之间还是-pi~+pi之间。

标注3:

选择PIN,本来sin和cos功能是可以不要RDY的,但是我需要RDY来查看什么时候输出数据才有效。

标注2的详解:

 

如果你要生成正弦余弦波,那么你的CoarseRotation必须选上,让输出数据是整个圆平面。

 

这样设置好的cordicIP核只是第一步,下一步是来设置合适的相位phase,以产生完整的波形。

datasheet所示:

我设置的数据位是16位,那么+1.0->16‘h2000; -1.0->16'he000;

(暂时给定phase的步进为16’h00C0,至于怎么确定,下面会说到,cordic的时钟我设置的是100Mhz)

如果直接让phase从16‘h2000 到16'he000 ,那么波形就会变成这样:

原因是,16‘h2000到16'he000之间有一长段的phase是大于+1和小于-1的,cordicIP核会当做+1和-1计算,所以才会一直是相同的值。

那么怎样才能产生完整的正弦波?

我们将phase从16'he000到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到16'he000)之前有:

16'he000-16‘h2000=16‘hC000,也就是49152.

256*192=49152,那么当步进取192的时候,256个clk就可以从2000加到E000了。

这样不会出现起始数据不定的状况。

这里建议数值是49152的约数比较好,当然不是它的约数也行。

16‘h00C0->0000000011000000,按照datasheet的phase数据格式:

000,0000011000000,也就是十进制的0.0234375。

而这个数的角度值为:

0.0234375*180°=4.21875°,也就是每个clk步进4.21875°。

一个圆有360°,那么从0°到360°一共步进360°/4.21875°约等于85.3次。

我选择的clk为10ns,也就是85.3*10ns输出一个完整的正弦余弦波。

所以正弦余弦波的周期为1/853ns约等于1.17Mhz。

如果要产生自己想要的频率,那么需要更改步进,然后根据仿真找到衔接点的起始位置。

补充:

怎样在modelsim里面看波形,而不是数据。

 

 如果要从波形形式变回数据形式,选择Literal格式即可。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1