主要内容

CORDIC Sigmoid HDL Optimized

计算基于 CORDIC 的 sigmoid 激活并生成优化的 HDL 代码

自 R2024a 起

  • CORDIC Sigmoid HDL Optimized block

库:
Fixed-Point Designer HDL Support / Math Operations

描述

CORDIC Sigmoid HDL Optimized 模块返回 u 的 sigmoid 激活,使用针对 HDL 代码生成进行了优化的 CORDIC 实现进行计算。

示例

全部展开

此示例说明如何使用 CORDIC Sigmoid HDL Optimized 模块计算给定实数值数据集的 sigmoid 激活。

算法

sigmoid 函数定义如下:

y=11+exp(-x)

这等效于

y=1-tanh(-x/2)2.

此模块的核心算法使用双曲旋转模式下的 CORDIC 算法来计算Hyperbolic Tangent HDL Optimized (tanh)。

支持的数据类型

CORDIC Sigmoid HDL Optimized 模块支持单精度、双精度、二进制小数点定标定点和二进制小数点定标双精度数据类型进行仿真。然而,HDL 代码生成仅支持二进制小数点定标定点数据类型。

I/O 接口

ready 输出为高电平时,CORDIC Sigmoid HDL Optimized 模块接受数据,表示该模块已准备就绪,可以开始新计算。使用 validIn 表示有效的输入。如果模块成功注册输入值,它就会解除 ready 信号;然后您必须等待就绪信号被再次使能,才能发送新输入。以下波形图概要显示了此协议。请注意,由于模块尚未准备好开始接受输入数据,模块的第一个有效输入被丢弃。

validIn.png

当模块完成计算并准备发送输出时,它将在一个时钟周期内使能 validOut。然后 ready 被使能,指示模块准备就绪,可以开始接受新输入值。

validOut.png

对模型进行仿真

打开 CORDICSigmoidModel 模型。

mdl = 'CORDICSigmoidModel';
open_system(mdl)

该模型包含连接到数据源的 CORDIC Sigmoid HDL Optimized 模块,该模块接收一个输入数组,并在准备好接受新输入时将输入值从该数组传递给 CORDIC Sigmoid HDL Optimized 模块。为每个值计算的输出存储在工作区变量中。处理完所有输入后,仿真终止。

定义一个输入数组。

x = fi(linspace(-10,10,100));

对模型进行仿真。

sim(mdl);

仿真完成后,将创建一个新工作区变量 sigmoidOutput,用于保留为每个输入计算的值。

绘制输出

通过比较 CORDIC Sigmoid HDL Optimized 模块的输出与 MATLAB® cordicsigmoid 函数的输出,绘制计算的误差。

yMATLAB = cordicsigmoid(x);
yMATLAB.numerictype
ans =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14
sigmoidOutput.numerictype
ans =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14
figure(1);
plot(x, sigmoidOutput);
hold on
plot(x, yMATLAB);
legend('CORDIC Sigmoid HDL Optimized block','cordicsigmoid Function');

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent CORDIC Sigmoid HDL Optimized block, cordicsigmoid Function.

验证模块输出是否与 cordicsigmoid 函数的输出在位上完全一致。

max(yMATLAB' - sigmoidOutput)
ans = 
     0

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 17
        FractionLength: 14

端口

输入

全部展开

输入数据,指定为实数值标量。

如果 u 是定点或定标的双精度数据类型,则 u 必须使用二进制小数点定标。定点数据类型不支持斜率偏置表示。代码生成仅支持二进制小数点定标定点数据类型。

数据类型: single | double | fixed point

输入是否有效,指定为布尔标量。此控制信号指示来自 u 输入端口的数据是否有效。当此值为 1 (true) 时,此模块捕获 u 输入端口上的值。当此值为 0 (false) 时,模块忽略输入样本。

数据类型: Boolean

输出

全部展开

u 处的值的 sigmoid 激活,以标量形式返回。在 y 处的值是基于 CORDIC 的对 u 的 sigmoid 激活的逼近。

当输入 u 是浮点类型时,输出 y 具有与输入相同的数据类型。当输入为定点数据类型时,输出的字长与输入字长相同,小数长度比字长小 2。

数据类型: single | double | fixed point

指示输出数据是否有效,以布尔标量形式返回。当此控制信号的值为 1 (true) 时,此模块已成功计算出输出 y。当此值为 0 (false) 时,输出数据无效。

数据类型: Boolean

指示模块是否准备就绪,以布尔标量形式返回。此控制信号指示模块是否已准备好接受新的输入数据。当此值为 1 (true) 并且 validIn 值为 1 (true) 时,此模块在下一个时钟周期中接受输入数据。当此值为 0 (false) 时,模块忽略下一个时钟周期中的输入数据。

数据类型: Boolean

算法

全部展开

参考

[1] Volder, Jack E. “The CORDIC Trigonometric Computing Technique.” IRE Transactions on Electronic Computers. EC-8, no. 3 (Sept. 1959): 330–334.

[2] Andraka, Ray. “A Survey of CORDIC Algorithm for FPGA Based Computers.” In Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays, 191–200. https://dl.acm.org/doi/10.1145/275107.275139.

[3] Walther, J.S. “A Unified Algorithm for Elementary Functions.” In Proceedings of the May 18-20, 1971 Spring Joint Computer Conference, 379–386. https://dl.acm.org/doi/10.1145/1478786.1478840.

[4] Schelin, Charles W. “Calculator Function Approximation.” The American Mathematical Monthly, no. 5 (May 1983): 317–325. https://doi.org/10.2307/2975781.

扩展功能

全部展开

版本历史记录

在 R2024a 中推出