雷竞技注册
技术文章

使用Xilinx CORDIC核心轻松生成正弦和余弦函数

2018年5月2日经过史蒂夫asrar

本文将审核将Xilinx IP内核集成到FPGA设计中。

本文将审核将Xilinx IP内核集成到FPGA设计中。

我们将添加CORDIC核心产生给定角度的正弦和余弦。将讨论使用Xilinx核心发生器工具的过程。本文还将审查Xilinx Cordic核心的一些基本属性。

使用由复杂工程师开发的代码段

在前一篇文章中,我们看到了这一点VHDL组件允许我们有一个整洁的层次结构设计并多次重用以前开发的代码段。我们还可以使用硬件描述语言的这种能力来添加由经验丰富的工程师开发的优化代码段到我们的设计中。这样一个现成的组件称为核心。

你可以找到各种各样的核心功能,如乘数,数字滤波器,dsp相关的转换,存储器和更多。由于核心通常是经过优化和验证的,所以您不必担心它们的性能。因此,您可以专注于其余的设计并更快地完成项目。

有两种类型的核心可以用于Xilinx产品:LogiCORE和AllianceCORE解决方案。LogiCORE解决方案由Xilinx的专家开发;然而,开发AllianceCOREs的专家并不受雇于Xilinx。许多LogiCORE组件都是随Xilinx软件包免费提供的。在本文中,我们将把Xilinx LogiCORE IP CORDIC v4.0添加到ISE设计中,并使用它来计算给定角度的正弦和余弦。

选择核心

要添加一个核心到你的ISE项目,点击“项目”选项卡下的“New Source”,并选择“IP (core Generator & Architecture Wizard)”,如图1所示。

图1

为您的文件提供名称和位置,然后单击“下一步”。然后,您将看到可用核心的列表。我们将选择“Cordic 4.0”,如图2所示。

图2.

然后,将打开一个GUI,允许您根据需要定制核心。

设置核心参数

对于Cordic核心,有三页设置。第一页如下所示:

图3.

GUI显示了一个核心的符号,在这里您可以看到核心的活动输入和输出。注意,根据所选择的核心特性,终端可能是活动的,也可能不是活动的。

通过单击“数据表”按钮,您可以访问涵盖核心选项的文档详细介绍。它还简要介绍了Cordic理论。在本文中,我们将根据需要解释核心的不同功能。有关更多详细信息,请阅读数据表。

“功能选择”允许我们选择要实现的功能。如前一篇文章所讨论的那样介绍CORDIC算法,有几种功能可以使用CORDIC算法实现。在本文中,我们希望实现正弦和余弦功能,所以我们选择“SIN和COS”。

“体系结构配置”指定用于实现CORDIC算法的结构。“Word Serial”架构顺序地使用一个移位-加/减阶段来执行算法的迭代。这就是为什么它是面积效率。然而,在应用输入之后,在核心生成新的输出之前,我们必须等待几个时钟周期。

相反,“并行”架构使用转移/减去级别阵列,并以增加硬件的成本提供更高的速度。对于此示例,我们将使用“Word Serial”架构。

“流水线模式”允许我们使用流水线实现。由于我们选择的功能和架构,“流水线模式”的某些选项可能变为非活动状态。例如,在图3中,“无管线”选项处于非活动状态。我们将保留“流水线模式”的默认选项,该选项为“最大”。

点击“Next”按钮,就会出现第二个设置页面,如图4所示。

图4.

当使用CORDIC算法实现正弦和余弦函数时,我们有一个相位输入,跳样,它是一个角度,两个输出,x_out和y_out,它们分别给余弦和pace_in的正弦。这些输入/输出显示在上面的核心符号中。有关使用CORDIC算法计算SINE和CUSINE函数的更多详细信息,请阅读我之前提到的关于CORDIC算法的文章

核心设置的第二页包括一些选项,用于指定输入/输出将如何表示数据。第2页的第一部分,“数据格式”,决定了X和Y输入/输出的表达方式。在我们的例子中,“Data Format”将指定X_OUT和Y_OUT的格式。

正如您可以从图4中看到的那样,到目前为止选择的设置,“数据格式”将是“签名分数”的默认值。参考数据表,我们看到X_OUT和Y_OUT将被表示为固定点2的补充号码宽度为两位的整数。注意,整数宽度是2位,但输出的总体宽度可以由图4中的“Output width”指定。在我们的示例中,“Output Width”被选择为10位。因此,如果输出数据是0010110101,我们知道二进制点在第8位和第9位之间,我们得到$$00.10110101_2 = 0.70703125_{10}$$。因为数字是有符号的,所以最左边的位是符号位。

页面的下一部分指定相位输入/输出的格式。对于“Sin and Cos”模式,我们有相位输入PHASE_IN。选择“Radians”选项,PHASE_IN将被认为是一个3位整数宽度的定点2的补数。请注意,输入的总体宽度将由图4中的“input width”决定。因此,如果PHASE_IN是" 0000101011 ",输入的角度将是$$000.0101011_2 = 0.3359375_{10}$$弧度。如图4所示,我们将使用带有注册输入和输出的核心。

对于舍入模式,我们将选择“Round Pos Neg Infinity”,这相当于MATLAB函数轮(x).您可以在core数据表中找到不同舍入模式的示例。设置的第三个页面如图5所示。

图5.

在这个页面上,我们可以选择CORDIC算法的迭代次数和加减操作的内部精度。根据数据表,将这两个选项的值设置为零,将迫使软件根据输出的准确性和其他参数自动计算出这两个参数。我们将保持这些参数的默认值。

最后一部分指定核心的可选引脚。我们将添加“SCLR”输入,该输入代表同步清除。当“SCLR”断言时,所有核心触发器都同步初始化。

推动“生成”按钮将产生一个.xco文件并将核心添加到设计中。通过点击这个文件,然后在ISE软件中选择“查看HDL实例化模板”,你可以找到模板声明组件核心。现在,您可以在使用普通VHDL组件时使用此组件。

伊势模拟

要使用核心,您需要学习数据表的“控制信号和时序”部分。图6显示了在为核心选择“Word Serial”结构时,必须如何使用CORDIC核心的控制信号。

图6.

“SCLR”输入被断言用来初始化所有的核心触发器。现在,我们可以应用输入数据,并将“新数据”输入,即“ND”设置为逻辑高,这样内核就可以在下一个上升的时钟边缘上采样输入数据。

完成计算时,核心将将“RDY”输出设置为逻辑高,以指示生成有效输出。核心还将设置“准备数据”输出,即“RFD”,逻辑高表示模块已准备好采样新的输入数据。

图7显示了我们的Cordic核心的ISE模拟。该仿真使用类似于图6的一组波形。


图7.

如您所见,输入,阶段_IN为$0001100100_2 = 000.1100100_2 = 0.78125_ {10} $$弧度。因此,我们预计X_OUT = COS(0.78125)= 0.70915311和Y_OUT = SIN(0.78125)= 0.70416751。模拟给出x_out = $$ 00.10110110_2 = 0.7109375_ {10} $$和y_out = $$ 00.10110100_2 = 0.70312500_ {10} $$。增加“输出宽度”将导致更好的准确性。

结论

您可以为各种各样的功能找到优化和验证的核心,如乘数,数字滤波器,dsp相关的转换,存储器和更多。这些现成的核心允许您更容易地处理大型设计,并更快地完成项目。本文展示了我们可以轻松地使用Xilinx CORDIC核心,并在FPGA设计中添加正弦和余弦函数。

要查看我的文章的完整列表,请访问这个页面