Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Логистическая функция в HDL
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
count_enable
Задумался над простыми реализациями логистической функции у= 1./(1 + exp(-Х)) в железе. Есть кусковая апроксимация для сигмоида tansig: в диапазоне от -1..1 у=2х-|х|*x . Можно конечно х отмасштабировать на 0...1, но может кто-то решил задачу элегантнее? Точность аппроксимации не особо важна, но должна быть лучше линейной. Из доступных ресурсов есть DSP48E 6-7 семейства. Как сделать апроксимацию за минимальное количество клоков? Читал IEEE Xplore, ничего не понравилось.
count_enable
Нашел довольно точную кусково-линейную аппроксимацию. Используются только сдвиг и сложение для функций типа y=kx+b;
http://www.baylor.edu/content/services/document.php?id=22484 - pages 15-16;
serjj
Цитата
Нашел довольно точную кусково-линейную аппроксимацию. Используются только сдвиг и сложение для функций типа y=kx+b;
http://www.baylor.edu/content/services/document.php?id=22484 - pages 15-16;

В дисере, на который вы даёте ссылку, на стр 25 вам табличка предлагается, где основные методы сравниваются между собой. Первый вы вычеркнули, гиперболический кордик имеет большую задержку, остаются метод кусочно-линейной аппроксимации и Тейлор, между ними значит и выбирать. Ну тут уже вам нужно огласить пожелания по точности/ресурсам/задержкам. Что из этого вам наиболее критично? Плюс какую пропускную способность вы хотите получить (относительно тактовой частоты имеется в виду).
count_enable
Да вот именно этот кусковый меня всем устраивает. Точность на последнем месте, на первом минимум ресурсов (особенно памяти), на втором скорость. На вход лог. ф-ции будет подаваться выход DSP48, поэтому хотелось бы чтобы работала она со скоростью DSP, который сейчас синтезируется на 400 МГц.

Сейчас набросал на коленке код, в симуляторе работает нормально, но почему-то не синтезируется - остаются только 3 латча. Где я накосячил? Вроде как все переменные должны поглотиться во время синтеза. Ворнинги понятные: Y ограничено в (0,1), арифметика у меня 5.13, старшие биты будут задеяны. Совмещение ресурсов тоже понятно.

Ворнинги:
Код
Xst:1767 - HDL ADVISOR - Resource sharing has identified that some arithmetic operations in this design can share the same physical resources for reduced device utilization. For improved clock frequency you may try to disable resource sharing.
Xst:2261 - The FF/Latch <Y_14> in Unit <logistic> is equivalent to the following 3 FFs/Latches, which will be removed : <Y_15> <Y_16> <Y_17>

Рапорт:

CODE
=======================================================================
==
Advanced HDL Synthesis Report

Macro Statistics
# Adders/Subtractors : 3
18-bit adder : 2
18-bit subtractor : 1
# Registers : 18
Flip-Flops : 18
# Comparators : 9
18-bit comparator greater : 9
# Multiplexers : 16
18-bit 2-to-1 multiplexer : 16
# Xors : 17
1-bit xor2 : 17

=========================================================================

=========================================================================
* Low Level Synthesis *
=========================================================================

Optimizing unit <logistic> ...
INFO:Xst:2261 - The FF/Latch <Y_14> in Unit <logistic> is equivalent to the following 3 FFs/Latches,
which will be removed : <Y_15> <Y_16> <Y_17>

Mapping all equations...
Building and optimizing final netlist ...
Found area constraint ratio of 100 (+ 5) on block logistic, actual ratio is 0.
FlipFlop Y_14 has been replicated 3 time(s) to handle iob=true attribute.

Final Macro Processing ...

=========================================================================
Final Register Report

Macro Statistics
# Registers : 18
Flip-Flops : 18

=========================================================================


CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.math_real.all;



entity logistic is
generic ( FRAC_WIDTH: integer := 13;
DATA_WIDTH :integer :=18);
Port (
CLK: in STD_LOGIC;
X : in STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0);
Y : out STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0));
end logistic;

architecture Behavioral of logistic is -- Ax+b;

type i_bound_t is array (0 to 8) of std_logic_vector(DATA_WIDTH-1 downto 0);
constant boundary: i_bound_t:=(
std_logic_vector(to_signed(integer(real(7.236)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(5.846)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(5.147)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(4.442)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(3.724)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(2.977)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(2.164)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(1.065)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(0)*real(2**FRAC_WIDTH)),DATA_WIDTH))
);
constant B: i_bound_t:=(
std_logic_vector(to_signed(integer(real(7.236)*real(2**FRAC_WIDTH)),DATA_WIDTH))
,
std_logic_vector(to_signed(integer(real(0.984375)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.97265625)*real(2**FRAC_WIDTH)),DATA_WI
DTH)),
std_logic_vector(to_signed(integer(real(0.953125)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.91796875)*real(2**FRAC_WIDTH)),DATA_WI
DTH)),
std_logic_vector(to_signed(integer(real(0.859375)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.765625)*real(2**FRAC_WIDTH)),DATA_WIDT
H)),
std_logic_vector(to_signed(integer(real(0.6328125)*real(2**FRAC_WIDTH)),DATA_WID
TH)),
std_logic_vector(to_signed(integer(real(0.5)*real(2**FRAC_WIDTH)),DATA_WIDTH))
);

begin
process(CLK)
variable X_abs:std_logic_vector(DATA_WIDTH-1 downto 0);
variable X_shifted:std_logic_vector(DATA_WIDTH-1 downto 0);
variable Y_abs:std_logic_vector(DATA_WIDTH-1 downto 0);
begin
if(rising_edge(CLK)) then
X_abs:=std_logic_vector(abs(signed(X)));
if(X_abs>boundary(0)) then
Y_abs:=std_logic_vector(to_signed(integer(real(1)*real(2**FRAC_WIDTH)),DATA_WIDT
H));
elsif X_abs>boundary(1) then
X_shifted:=std_logic_vector(signed(X_abs) srl 9);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(1)));
elsif X_abs>boundary(2) then
X_shifted:=std_logic_vector(signed(X_abs) srl 8);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(2)));
elsif X_abs>boundary(3) then
X_shifted:=std_logic_vector(signed(X_abs) srl 7);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(3)));
elsif X_abs>boundary(4) then
X_shifted:=std_logic_vector(signed(X_abs) srl 6);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(4)));
elsif X_abs>boundary(5) then
X_shifted:=std_logic_vector(signed(X_abs) srl 5);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(5)));
elsif X_abs>boundary(6) then
X_shifted:=std_logic_vector(signed(X_abs) srl 4);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(6)));
elsif X_abs>boundary(7) then
X_shifted:=std_logic_vector(signed(X_abs) srl 3);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(7)));
else
X_shifted:=std_logic_vector(signed(X_abs) srl 2);
Y_abs:=std_logic_vector(signed(X_shifted)+signed(B(8)));
end if;
if(signed(X)<0) then
Y<=std_logic_vector(1-signed(Y_abs));
else
Y<=Y_abs;
end if;
end if;
end process;
end Behavioral;
des00
а FF - это разве не FLIPFLOP ? И ЕМНИП у хилых латч всю жизнь на FF делался и в отчете писались FF/latch.
count_enable
FF это флипфлоп, но то что синтезатор "оптимизирует" схему, оставляя только 3 FF, означает что где-то в коде я накосячил sad.gif
des00
Цитата(count_enable @ Jul 14 2015, 18:23) *
FF это флипфлоп, но то что синтезатор "оптимизирует" схему, оставляя только 3 FF, означает что где-то в коде я накосячил sad.gif

с чего вы так решили? Из вашего же поста
Цитата
Flip-Flops : 18

А дальше он пишет что значения трех битов всегда равны четвертому. Поэтому смысла их оставлять нет. Т.е. по идее триггеров должно быть 15 после разводки. Так работает resource sharing.

Вот вам задачка для мозгов: Есть устройство : квадратор : y = x^2. Числа знаковые. Знаковый бит на выходе уже отрезали. Разрядности согласованы. В выходном результате есть бит, триггер которого можно выкинуть. Вопрос : что это за бит(его индекс) и почему его триггер можно выкинуть?
count_enable
Понял...
Я протупил и подумал что Final register report это полный список ресурсов. Еще смущает рапорт клоков: хотя схема и полностью синхронна, но:
Код
Minimum period: No path found
   Minimum input arrival time before clock: 7.376ns
   Maximum output required time after clock: 0.575ns
   Maximum combinational path delay: No path found


А что касается задачки, то это должен быть младший бит, не? Он всегда будет 0.
des00
Цитата(count_enable @ Jul 14 2015, 18:47) *
хотя схема и полностью синхронна, но:

Вспомните анализ времянки синхронной схемы. Там должно быть что-то слева и справа, у вас есть только половина.

Цитата
А что касается задачки, то это должен быть младший бит, не? Он всегда будет 0.

Кхм, лучше не угадывать sm.gif
(....00001)^2 = 1^2 = 1 (....00001)
(....11111)^2 = -1^2 = 1 (....00001)

count_enable
Цитата(des00 @ Jul 14 2015, 14:53) *
Вспомните анализ времянки синхронной схемы. Там должно быть что-то слева и справа, у вас есть только половина.
К сожалению, вспоминать мне нечего - я самоучка в ПЛИС и анализу не обучен. Если подскажете книгу или статью буду весьма признателен.

Что касается квадратора, то возводя в степень М-битное число, мы получим 2М значащих битов, ведь так? Но младший бит результата всегда равен аргументу. Моя ошибка, "0" он будет равен только при удвоении аргумента, т.к. результат Х*2 всегда парное число.
Я в институте предмет "компьютерная арифметика" заваливал 2 раза, но за третьим я играючи считал в остатках и single-precision IEEE-754. Видно пора поднять старые тетради...

des00
Цитата(count_enable @ Jul 14 2015, 20:16) *
К сожалению, вспоминать мне нечего - я самоучка в ПЛИС и анализу не обучен. Если подскажете книгу или статью буду весьма признателен.

Для временного анализа нужен источник и приемник сигнала на тактовых частотах. У вас есть только приемник. Почитать можно тут

Цитата
Что касается квадратора, то возводя в степень М-битное число, мы получим 2М значащих битов, ведь так? Но младший бит результата всегда равен аргументу. Моя ошибка, "0" он будет равен только при удвоении аргумента, т.к. результат Х*2 всегда парное число.

бинго. современные синтезаторы даже это учитывают и не используют этот бит в схемах. Т.е. выбрасывается триггер, линия и не учитывается в лютах приемниках.

UPD. Это я к тому, что современные синтезаторы анализируют даже результаты таких математических операций, поэтому не стоит удивляться когда ресурсы зашариваются/пропадают казалось бы на пустом месте.
count_enable
Спасибо за ссылку, буду курить доки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.