|
|
  |
Логистическая функция в HDL, таблицы не предлагать. |
|
|
|
Jul 13 2015, 15:02
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Цитата Нашел довольно точную кусково-линейную аппроксимацию. Используются только сдвиг и сложение для функций типа y=kx+b; http://www.baylor.edu/content/services/document.php?id=22484 - pages 15-16; В дисере, на который вы даёте ссылку, на стр 25 вам табличка предлагается, где основные методы сравниваются между собой. Первый вы вычеркнули, гиперболический кордик имеет большую задержку, остаются метод кусочно-линейной аппроксимации и Тейлор, между ними значит и выбирать. Ну тут уже вам нужно огласить пожелания по точности/ресурсам/задержкам. Что из этого вам наиболее критично? Плюс какую пропускную способность вы хотите получить (относительно тактовой частоты имеется в виду).
Сообщение отредактировал serjj - Jul 13 2015, 15:05
|
|
|
|
|
Jul 13 2015, 18:47
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
Да вот именно этот кусковый меня всем устраивает. Точность на последнем месте, на первом минимум ресурсов (особенно памяти), на втором скорость. На вход лог. ф-ции будет подаваться выход 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;
|
|
|
|
|
Jul 14 2015, 11:33
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(count_enable @ Jul 14 2015, 18:23)  FF это флипфлоп, но то что синтезатор "оптимизирует" схему, оставляя только 3 FF, означает что где-то в коде я накосячил  с чего вы так решили? Из вашего же поста Цитата Flip-Flops : 18 А дальше он пишет что значения трех битов всегда равны четвертому. Поэтому смысла их оставлять нет. Т.е. по идее триггеров должно быть 15 после разводки. Так работает resource sharing. Вот вам задачка для мозгов: Есть устройство : квадратор : y = x^2. Числа знаковые. Знаковый бит на выходе уже отрезали. Разрядности согласованы. В выходном результате есть бит, триггер которого можно выкинуть. Вопрос : что это за бит(его индекс) и почему его триггер можно выкинуть?
--------------------
|
|
|
|
|
Jul 14 2015, 11:47
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
Понял... Я протупил и подумал что 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.
|
|
|
|
|
Jul 14 2015, 11:53
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(count_enable @ Jul 14 2015, 18:47)  хотя схема и полностью синхронна, но: Вспомните анализ времянки синхронной схемы. Там должно быть что-то слева и справа, у вас есть только половина. Цитата А что касается задачки, то это должен быть младший бит, не? Он всегда будет 0. Кхм, лучше не угадывать  (....00001)^2 = 1^2 = 1 (....00001) (....11111)^2 = -1^2 = 1 (....00001)
--------------------
|
|
|
|
|
Jul 14 2015, 12:16
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
Цитата(des00 @ Jul 14 2015, 14:53)  Вспомните анализ времянки синхронной схемы. Там должно быть что-то слева и справа, у вас есть только половина. К сожалению, вспоминать мне нечего - я самоучка в ПЛИС и анализу не обучен. Если подскажете книгу или статью буду весьма признателен. Что касается квадратора, то возводя в степень М-битное число, мы получим 2М значащих битов, ведь так? Но младший бит результата всегда равен аргументу. Моя ошибка, "0" он будет равен только при удвоении аргумента, т.к. результат Х*2 всегда парное число. Я в институте предмет "компьютерная арифметика" заваливал 2 раза, но за третьим я играючи считал в остатках и single-precision IEEE-754. Видно пора поднять старые тетради...
|
|
|
|
|
Jul 14 2015, 12:22
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(count_enable @ Jul 14 2015, 20:16)  К сожалению, вспоминать мне нечего - я самоучка в ПЛИС и анализу не обучен. Если подскажете книгу или статью буду весьма признателен. Для временного анализа нужен источник и приемник сигнала на тактовых частотах. У вас есть только приемник. Почитать можно тут Цитата Что касается квадратора, то возводя в степень М-битное число, мы получим 2М значащих битов, ведь так? Но младший бит результата всегда равен аргументу. Моя ошибка, "0" он будет равен только при удвоении аргумента, т.к. результат Х*2 всегда парное число. бинго. современные синтезаторы даже это учитывают и не используют этот бит в схемах. Т.е. выбрасывается триггер, линия и не учитывается в лютах приемниках. UPD. Это я к тому, что современные синтезаторы анализируют даже результаты таких математических операций, поэтому не стоит удивляться когда ресурсы зашариваются/пропадают казалось бы на пустом месте.
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|