2016-11-21 19 views
5

Tôi đang xây dựng một mạng nơron chạy trên một FPGA, và mảnh cuối cùng của câu đố đang chạy một hàm sigmoid trong phần cứng. Đây là một trong hai:Tính e^x cho các giá trị float trong Hệ thống Verilog?

1/(1 + e^-x) 

hoặc

(atan(x) + 1)/2 

Thật không may, x ở đây là một giá trị float (một giá trị real trong SystemVerilog).

Có mẹo nào về cách triển khai một trong các chức năng này trong SystemVerilog không? Điều này thực sự gây nhầm lẫn cho tôi vì cả hai chức năng này đều phức tạp và tôi thậm chí không biết bắt đầu triển khai chúng ở đâu do tính phức tạp của các giá trị float.

+0

Bạn đang thiết kế FPGA nào? Nó có tài nguyên DSP nào không? – Hida

+0

Sử dụng khối DSP trên FPGA của bạn để tính hàm sigmoid. – noobuntu

+0

Yêu cầu về độ trễ và thông lượng là gì? Điều đó sẽ ảnh hưởng lớn đến bất cứ điều gì tôi sẽ thiết kế cho việc này. Ngoài ra, tôi không quen thuộc với bất kỳ công cụ FPGA có thể tổng hợp một thực (float) vào phần cứng (nó có thể tồn tại, nhưng nó khá gần đây nếu nó không). – hops

Trả lời

0

Một cách đơn giản hơn cho việc này là tạo bộ nhớ/mảng cho chức năng này. Tuy nhiên, tùy chọn đó có thể rất không hiệu quả.

x phải là địa chỉ đầu vào cho bộ nhớ và giá trị tại vị trí đó có thể là đầu ra của hàm.

Giả sử giá trị của hàm của bạn như sau. (Đây chỉ là một ví dụ)

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

Vì vậy, bạn có thể tạo một mảng cho điều này, lưu trữ giá trị đầu ra.

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

Tôi vừa hoàn thành điều này bằng Vivado HLS, cho phép bạn viết mạch trong C. Đây là mã C của tôi.

#include math.h 

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

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

Nhưng có một câu hỏi là không thể tạo ma trận chưa được đánh dấu. Có thể có một cách khác mà tôi không biết.

Các vấn đề liên quan