基于System Generator的CORDIC算法实现

基于System Generator的CORDIC算法实现


文章目录

  • 基于System Generator的CORDIC算法实现
  • 一、CORDIC算法实现
  • 1、简介
  • 2、CORDIC算法模式
  • 2、搭建CORDIC模块系统
    • 2.1 本部分设计使用到的block
    • 2.2 System Generator设计流程
      • 2.2.1 CORDIC模块设计
      • 2.2.2 参考设计模块设计
      • 2.2.3 数据输入模块设计
      • 2.2.4 比较模块设计
      • 2.2.5 CORDIC模块
    • 2.3 仿真
  • 3、使用System Generator自带的参考CORDIC模块系统
    • 3.1 本部分设计使用到的block
    • 3.2 System Generator设计流程
    • 3.3 仿真
  • 4、两种方式对比
  • 5、相关工程文件


  System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。
  CORDIC ( Coordinate Rotation Digital Computer ) 是坐标旋转数字计算机算法的简称,由 Vloder于 1959 年在设计美国航空导航控制系统的过程中首先提出[1], 主要用于解决导航系统中三角函数、 反三角函数和开方等运算的实时计算问题。 1971 年, Walther 将圆周系统、 线性系统和双曲系统统一到一个 CORDIC 迭代方程里 , 从而提出了一种统一的CORDIC 算法形式。
  CORDIC 算法应用广泛, 如离散傅里叶变换 、 离散余弦变换、 离散 Hartley 变换、Chirp-Z 变换、 各种滤波以及矩阵的奇异值分解中都可应用 CORDIC 算法。 从广义上讲,CORDIC 算法提供了一种数学计算的逼近方法。 由于它最终可分解为一系列的加减和移位操作, 故非常适合硬件实现。 例如, 在工程领域可采用 CORDIC 算法实现直接数字频率合成器。


参考文献:FPGA数字信号处理设计教程 SystemGenerator入门与提高

一、CORDIC算法实现

  本次设计针对CODIC算法详解系列教程的补充,目的有两个:一是巩固学习System Generator,二是深入理解CORDIC算法。关于System Generator的学习,请参考我的相关博文System Generator从入门到放弃系列,CORDIC算法的学习,请参考我的博文CORDIC算法详解系列。
  本文也是CORDIC算法详解(六)-CORDIC 算法的硬件实现的补充。


1、简介

  请参考System Generator从入门到放弃系列、CORDIC算法详解系列,有非常详细的推导及图文公式,还有相关的MATLAB程序。


2、CORDIC算法模式

  本次设计是利用CORDIC算法实现:
在这里插入图片描述
  为了检验CORDIC的准确性,本实验的输入数据x,y为两组随机数,CORDIC的运算结果将与浮点数运算模块的结果进行比较,能直观地看到CORDIC的准确性。
  接下来会采用两种方法设计CORDIC算法,一种是根据CORDIC算法原理在System Generator中搭建相关Model,另一种方法是直接调用System Generator中提供的模块进行设计。


2、搭建CORDIC模块系统

  迭代的次数越多计算的结果越精确,但同时消耗的资源也会增加而且系统的运行速度也会受到影响。所以需要根据具体设计的要求来选择迭代的次数,一般来说,迭代的次数不高于数据的位宽。

2.1 本部分设计使用到的block

  本次设计主要有四个部分组成:数据输入模块、参考设计模块、CORDIC设计模块和比较模块。

Xilinx block

  • System Generator(->Basic Elements):系统管理
  • Gateway In(->Basic Elements):数据输入
  • Gateway Out(->Basic Elements):数据输出

其它block

  • Random Number(Simulink->Sources):生成随机数
  • Add(Simulink->Math Operations):加法器
  • Scope(Simulink->Commonly Used Blocks):示波器
  • 其他算术Blocks

2.2 System Generator设计流程

2.2.1 CORDIC模块设计

添加subsystem 命名 CORDIC Design
基于System Generator的CORDIC算法实现_第1张图片

添加subsystem 命名 Cell0、Cell1…Cell5
  按照下图进行连接
基于System Generator的CORDIC算法实现_第2张图片
  从上图可以看出,CORDIC设计模块主要由6个迭代模块组成,每个迭代模块只是参数不同。其中常数0.72998046875是对坐标旋转后模长变化的补偿。
  下面是Cell0的内部框图:
基于System Generator的CORDIC算法实现_第3张图片

2.2.2 参考设计模块设计

  参考设计模块实际为一个浮点运算单元,直接计算开方的值作为输出,该部分模块没有使用Xilinx Block,主要作用就是作为参考模块可以方便地检验CORDIC模块的设计精度。内部结构图如下:

基于System Generator的CORDIC算法实现_第4张图片

2.2.3 数据输入模块设计

  输入数据模块包含两个随机数输入模块,经过Gateway in模块后进入参数设计模块和CORDIC设计模块这两个模块计算出来的数据进入比较模块,比较后的误差作为输出显示。内部结构如下:
基于System Generator的CORDIC算法实现_第5张图片

2.2.4 比较模块设计

  输入数据模块包含两个随机数输入模块,经过Gateway in模块后进入参数设计模块和CORDIC设计模块这两个模块计算出来的数据进入比较模块,比较后的误差作为输出显示。内部结构如下:

基于System Generator的CORDIC算法实现_第6张图片

2.2.5 CORDIC模块

  完成上诉各个模块设计后,按照下图进行连接和设置:
基于System Generator的CORDIC算法实现_第7张图片

2.3 仿真

  运行仿真,仿真时间设置为“130”

基于System Generator的CORDIC算法实现_第8张图片
基于System Generator的CORDIC算法实现_第9张图片
  双击System Generator 图标,得到相关的设置如下:
基于System Generator的CORDIC算法实现_第10张图片
  单机Generate生成工程文件及相关报告,下面是资源利用情况的报告:
基于System Generator的CORDIC算法实现_第11张图片


3、使用System Generator自带的参考CORDIC模块系统

  为了方便设计者使用SYSGEN进行数字系统设计,SYSGEN系统在Xilinx Block库中提供了一些常用的数字信号处理模块,只需要简单的设置就可以调用。

3.1 本部分设计使用到的block

Xilinx block

  • CORDIC ATAN(->Basic Elements):调用CORDIC算法模块
  • Gateway In(->Basic Elements):数据输入
  • Gateway Out(->Basic Elements):数据输出

其它block

  • Add(Simulink->Math Operations):加法器
  • Scope(Simulink->Commonly Used Blocks):示波器
  • 其他运算Block

3.2 System Generator设计流程

添加subsystem 命名 CORDIC Design
在 CORDIC Design 添加相关Block 如下:
基于System Generator的CORDIC算法实现_第12张图片
基于System Generator的CORDIC算法实现_第13张图片
Model 如下:
基于System Generator的CORDIC算法实现_第14张图片

3.3 仿真

  运行仿真,仿真时间设置为“130”

基于System Generator的CORDIC算法实现_第15张图片
基于System Generator的CORDIC算法实现_第16张图片
  双击System Generator 图标,得到相关的设置如下:
基于System Generator的CORDIC算法实现_第17张图片
  单机Generate生成工程文件及相关报告,下面是资源利用情况的报告:

基于System Generator的CORDIC算法实现_第18张图片


4、两种方式对比

  从以上导出的报告可以看出,用SYSGEN系统自带的参考CORDIC模块消耗更多的触发器资源,而且从波形图中可以看出自带额参考CORDIC模块的系统产生的误差也明显比搭建的模块系统产生的误差要大一点。造成这些问题的主要原因是SYSGEN模块具有通用性,必须保留一定的资源空间供用户配置,这样必然要牺牲掉很多资源。所以在设计中考虑占用资源时尽量少用系统自带的模块,在使用SYSGEN系统再带参考模块时也一定要对参数进行合理的设置与优化。


5、相关工程文件

  System Generator实现CORDIC算法工程文件 里面有 System Generator 2016及System Generator 2018两个工程的文件,本人已经仿真验证通过,供大家学习之用。
https://download.csdn.net/download/pieces_thinking/10765631





你可能感兴趣的:(FPGA,FPGA)