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 算法实现直接数字频率合成器。
本次设计针对CODIC算法详解系列教程的补充,目的有两个:一是巩固学习System Generator,二是深入理解CORDIC算法。关于System Generator的学习,请参考我的相关博文System Generator从入门到放弃系列,CORDIC算法的学习,请参考我的博文CORDIC算法详解系列。
本文也是CORDIC算法详解(六)-CORDIC 算法的硬件实现的补充。
请参考System Generator从入门到放弃系列、CORDIC算法详解系列,有非常详细的推导及图文公式,还有相关的MATLAB程序。
本次设计是利用CORDIC算法实现:
为了检验CORDIC的准确性,本实验的输入数据x,y为两组随机数,CORDIC的运算结果将与浮点数运算模块的结果进行比较,能直观地看到CORDIC的准确性。
接下来会采用两种方法设计CORDIC算法,一种是根据CORDIC算法原理在System Generator中搭建相关Model,另一种方法是直接调用System Generator中提供的模块进行设计。
迭代的次数越多计算的结果越精确,但同时消耗的资源也会增加而且系统的运行速度也会受到影响。所以需要根据具体设计的要求来选择迭代的次数,一般来说,迭代的次数不高于数据的位宽。
本次设计主要有四个部分组成:数据输入模块、参考设计模块、CORDIC设计模块和比较模块。
Xilinx block
其它block
添加subsystem 命名 Cell0、Cell1…Cell5
按照下图进行连接
从上图可以看出,CORDIC设计模块主要由6个迭代模块组成,每个迭代模块只是参数不同。其中常数0.72998046875是对坐标旋转后模长变化的补偿。
下面是Cell0的内部框图:
参考设计模块实际为一个浮点运算单元,直接计算开方的值作为输出,该部分模块没有使用Xilinx Block,主要作用就是作为参考模块可以方便地检验CORDIC模块的设计精度。内部结构图如下:
输入数据模块包含两个随机数输入模块,经过Gateway in模块后进入参数设计模块和CORDIC设计模块这两个模块计算出来的数据进入比较模块,比较后的误差作为输出显示。内部结构如下:
输入数据模块包含两个随机数输入模块,经过Gateway in模块后进入参数设计模块和CORDIC设计模块这两个模块计算出来的数据进入比较模块,比较后的误差作为输出显示。内部结构如下:
运行仿真,仿真时间设置为“130”
双击System Generator 图标,得到相关的设置如下:
单机Generate生成工程文件及相关报告,下面是资源利用情况的报告:
为了方便设计者使用SYSGEN进行数字系统设计,SYSGEN系统在Xilinx Block库中提供了一些常用的数字信号处理模块,只需要简单的设置就可以调用。
Xilinx block
其它block
添加subsystem 命名 CORDIC Design
在 CORDIC Design 添加相关Block 如下:
Model 如下:
运行仿真,仿真时间设置为“130”
双击System Generator 图标,得到相关的设置如下:
单机Generate生成工程文件及相关报告,下面是资源利用情况的报告:
从以上导出的报告可以看出,用SYSGEN系统自带的参考CORDIC模块消耗更多的触发器资源,而且从波形图中可以看出自带额参考CORDIC模块的系统产生的误差也明显比搭建的模块系统产生的误差要大一点。造成这些问题的主要原因是SYSGEN模块具有通用性,必须保留一定的资源空间供用户配置,这样必然要牺牲掉很多资源。所以在设计中考虑占用资源时尽量少用系统自带的模块,在使用SYSGEN系统再带参考模块时也一定要对参数进行合理的设置与优化。
System Generator实现CORDIC算法工程文件 里面有 System Generator 2016及System Generator 2018两个工程的文件,本人已经仿真验证通过,供大家学习之用。
https://download.csdn.net/download/pieces_thinking/10765631