http://blog.163.com/fantasy_sunny/blog/static/1959182122013113152237210/

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

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

环境:xilinx ISE 14.5   cordic 4.0 modelsim

首先是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 -> 16'he000;

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

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

原因是,16‘h2000 到 16'he000 之间有一长段的phase是大于+1和小于-1的,cordic IP核会当做+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 -> 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° 约等于 85.3次。

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

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

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

补充:

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

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

xilinx cordic ip核的使用相关推荐

  1. XILINX CORDIC IP核使用记录

    问题简述 基于FPGA实现Sobel算法,计算出像素水平和铅直方向的微分dx,dy后,需要计算向量{dx,dy}的模与其夹角,即实现(dx)2+(dy)2\sqrt{(dx)^2 + (dy)^2} ...

  2. cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切

    赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化,三角函数的操作.我介绍下它进行反正切求解的使用: 新建个简单 ...

  3. FPGA--简易DDS信号发生器 (内涵DDS与CORDIC IP核详解)附源码

    学习内容 简易DDS信号发生器的设计与验证,产生所需的正弦波.方波锯齿波,并进行verilog验证. 实现功能 可以通过按键控制来输出不同的波形. 开发环境 xilinx spartan6开发板.IS ...

  4. vivado CORDIC ip核计算arctan记录

    文章目录 前言 一.CORDIC ip核配置 二.CORDIC ip核接口 三.仿真波形 四.工程文件 前言 本文主要记录自己使用vivado CORDIC ip 核计算arctan的过程. 一.CO ...

  5. (51)Xilinx Divider IP核配置(十一)(第11天)

    (51)Xilinx Divider IP核配置(十一)(第11天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Divider IP核配置(十一 ...

  6. (50)Xilinx Multiplier IP核配置(十一)(第10天)

    (50)Xilinx Multiplier IP核配置(十一)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Multiplier IP ...

  7. (49)Xilinx Subtracter IP核配置(十)(第10天)

    (49)Xilinx Subtracter IP核配置(十)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Subtracter IP核 ...

  8. (48)Xilinx Adder IP核配置(九)(第10天)

    (48)Xilinx Adder IP核配置(九)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Adder IP核配置(九)(第10天 ...

  9. (47)Xilinx VIO IP核配置(八)(第10天)

    (47)Xilinx VIO IP核配置(八)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx VIO IP核配置(八)(第10天) 5) ...

最新文章

  1. 分布式id 实现方式
  2. 【五线谱】踏板标记 ( 踩下踏板 Ped 标记 | 松开踏板 * 标记 | MIDI 中的对应踏板指令 | 连续控制信号 | 开关控制信号 )
  3. 【步态识别】基于深度学习的步态识别系统的MATLAB仿真,包括ALEXNET,改进CNN,GOOGLENET
  4. SQLite学习手册(内置函数)
  5. harfbuzz安装位置 linux_最新Ubuntu 20.04 LTS已发布,在Win10中该如何进行安装和使用?...
  6. javascript设计模式-singleton(单例)模式
  7. 常见的6种MySQL约束
  8. python 安装matlab,python – Anaconda在Linux上安装Matlab Engine
  9. 转 五种提高 SQL 性能的方法
  10. Cocos2d-x特殊节点对象(瓦片地图、粒子系统、视差滚动)概述
  11. 干货满满【JVM监控及诊断工具-GUI篇】
  12. 经典常用SQL语句大全(绝对的经典)
  13. 自定义UILabel,添加verticalAlignment属性
  14. RK3399 Android7.1 ACOVP导致系统死机
  15. 电销行业竞争与日俱增,西安外呼系统如何改善?
  16. 如何用Photoshop批量改变图片的大小
  17. Flex Builder 3代码格式化方法
  18. 【通識:人生哲學與幸福】從哲學到人生哲學
  19. 凌讯消防装备管理系统(3)
  20. 使用Mathtype公式编辑器生成CSDN中的数学公式

热门文章

  1. ADSL宽带80和8080端口被封
  2. 几何画板手机版_几何画板手机版
  3. android平板内存清理,需要给安卓手机清理内存么?不用!
  4. 搜索推荐业务场景下的特征系统搭建
  5. launch计算机上哪个初中,launch是什么意思
  6. apache报错:Unclean shutdown of previous Apache run
  7. 2023-01-05 长亭科技 Go 后端开发实习生二面
  8. 小龙虾是如何成为直播间爆款的
  9. MFC 学习技巧的总结
  10. 桌面美化--鼠标指针