在System Verilog中计算浮点值的e ^ x?

问题描述 投票:5回答:3

我正在构建一个在FPGA上运行的神经网络,最后一个难题是在硬件中运行sigmoid函数。这是:

1/(1 + e^-x)

要么

(atan(x) + 1) / 2

不幸的是,这里的x是一个浮点值(SystemVerilog中的real值)。

有没有关于如何在SystemVerilog中实现这些功能的提示?

这对我来说真的很混乱,因为这两个函数都很复杂,我甚至不知道从哪里开始实现它们,因为浮点值的复杂性增加了。

neural-network verilog fpga system-verilog sigmoid
3个回答
0
投票

一种更简单的方法是为此函数创建一个内存/数组。但是,该选项可能非常低效。

x应该是内存的输入地址,该位置的值可以是函数的输出。

假设您的函数值如下。 (这只是一个例子)

x = 0 => f(0) = 1
x = 1 => f(0) = 2
x = 2 => f(0) = 3
x = 3 => f(0) = 4

因此,您可以为此创建一个存储输出值的数组。

int a[4] = `{1, 2, 3, 4};

0
投票

我刚刚用Vivado HLS完成了这个,它允许你用C编写电路。这是我的C代码。

#include math.h

void exp(float a[10],b[10])

{
    int i;
    for(i=0;i<10;i++)
    {
        b[i] = exp(a[i]);
    }
}

但是有一个问题是不可能创建一个未实现的矩阵。也许还有另一种我不知道的方式。


0
投票

正如您似乎意识到的那样,键入real是不可综合的。你需要对类型整数尾数进行操作并单独输入整数指数,并在完成后将它们组合起来,跟踪符号。一旦你照顾(e ^ -x),剩下的应该是直截了当的。

试试这个页面快速解释:https://www.geeksforgeeks.org/floating-point-representation-digital-logic/

并搜索“浮点数字设计”以获得更多解释/示例。

© www.soinside.com 2019 - 2024. All rights reserved.