реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IP ядро целочисленного деления от Альтеры, lpm_div
novartis
сообщение Nov 29 2016, 06:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 344
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Сколько я его не пытался использовать, все какие то заморочки.
Утыкаюсь в ограничение по частоте. Нужно например поделить два числа (64 бит на 32 бит) на частоте 300МГц.
Компилю проект, таймквест репортует - отрицательные слаки. Считаю, вроде тактов 10 не хватает.
В мегавизарде можно выставить latency, ставлю 14 тактов ( запасом).
Компилю проект, таймквест репортует - отрицательные слаки.
Ставлю 24 такта.
Компилю проект, таймквест репортует - отрицательные слаки.
Сколько ему тактов то надо?

Зашел с другой стороны. Завел пониженную частоту 30МГц.
Данные с 300мгц перекидываю на частоту 30мгц. Результат с 30мгц перевожу на 300мгц, все это делаю через всякие там защелки-синхронизаторы .
Таймквест весь изнылся, что куча переходов с 30 мгц на 300мгц и обратно. Все надо описывать в sdc. Час на это потратил, устал, уже под ночь было, и так не доделал все.

Есть нормальный способ целочисленно поделить в ПЛИС?

Сморю сейчас на корки с opencores, может кто что использовал от туда?
Go to the top of the page
 
+Quote Post
Maverick
сообщение Nov 29 2016, 06:15
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 291
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(novartis @ Nov 29 2016, 08:05) *
Сколько я его не пытался использовать, все какие то заморочки.
Утыкаюсь в ограничение по частоте. Нужно например поделить два числа (64 бит на 32 бит) на частоте 300МГц.
Компилю проект, таймквест репортует - отрицательные слаки. Считаю, вроде тактов 10 не хватает.
В мегавизарде можно выставить latency, ставлю 14 тактов ( запасом).
Компилю проект, таймквест репортует - отрицательные слаки.
Ставлю 24 такта.
Компилю проект, таймквест репортует - отрицательные слаки.
Сколько ему тактов то надо?

Зашел с другой стороны. Завел пониженную частоту 30МГц.
Данные с 300мгц перекидываю на частоту 30мгц. Результат с 30мгц перевожу на 300мгц, все это делаю через всякие там защелки-синхронизаторы .
Таймквест весь изнылся, что куча переходов с 30 мгц на 300мгц и обратно. Все надо описывать в sdc. Час на это потратил, устал, уже под ночь было, и так не доделал все.

Есть нормальный способ целочисленно поделить в ПЛИС?

Сморю сейчас на корки с opencores, может кто что использовал от туда?

какая FPGA?

Альтера предлагает следующее описание... попробуйте добавить "врукопашную" регистры
Прикрепленные файлы
Прикрепленный файл  divider_tb.v ( 3.68 килобайт ) Кол-во скачиваний: 16
Прикрепленный файл  divider.v ( 5 килобайт ) Кол-во скачиваний: 67
 


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
novartis
сообщение Nov 29 2016, 06:17
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 344
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845




Сейчас Arria 10 (speed grade 1)
Go to the top of the page
 
+Quote Post
goodsoul
сообщение Nov 29 2016, 07:06
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 3-09-09
Пользователь №: 52 178



Цитата(novartis @ Nov 29 2016, 09:17) *
Сейчас Arria 10 (speed grade 1)

В какой версии квартуса работаете? Попробую у себя собрать ради спортивного интереса.
Go to the top of the page
 
+Quote Post
novartis
сообщение Nov 29 2016, 07:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 344
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Цитата(goodsoul @ Nov 29 2016, 12:06) *
В какой версии квартуса работаете? Попробую у себя собрать ради спортивного интереса.

кристалл 10AX115N2F45E1SG.
квартус 16.0.2 Build 222 07/20/2016 SJ Standard Edition

Но то же самое было с циклоном 4, квартус не помню, наверно 13.1


Цитата(Maverick)
Альтера предлагает следующее описание... попробуйте добавить "врукопашную" регистры

Спасибо, посмотрю
Go to the top of the page
 
+Quote Post
Maverick
сообщение Nov 29 2016, 07:58
Сообщение #6


я только учусь...
******

Группа: Модераторы
Сообщений: 3 291
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(novartis @ Nov 29 2016, 08:05) *
Утыкаюсь в ограничение по частоте. Нужно например поделить два числа (64 бит на 32 бит) на частоте 300МГц.

попробуйте латентность сделать 64 или 32 такта, тогда возможно получиться...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
goodsoul
сообщение Nov 29 2016, 08:28
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 3-09-09
Пользователь №: 52 178



С мегафункцией целочисленного деления lpm_divide у меня тоже нормальной частоты не вышло. И варьирование latency не дает желаемого эффекта.
Что интересно, altera_fp_functions может делить плавающую точку и там можно указать желаемую частоту или latency. Вот там как нефиг делать 350MHz получилось.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Nov 29 2016, 20:29
Сообщение #8


я только учусь...
******

Группа: Модераторы
Сообщений: 3 291
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



попробуйте такое описание

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--pipelined Radix2 division
entity DivRadix2 is
   GENERIC(width : Natural := 16);
    Port ( clk      : in  STD_LOGIC;
           Dividend : in  STD_LOGIC_VECTOR ((Width-1) downto 0);
           Divisor  : in  STD_LOGIC_VECTOR ((Width-1) downto 0);
           Quotient : out STD_LOGIC_VECTOR ((Width-1) downto 0);
           Remainder: out STD_LOGIC_VECTOR ((Width-1) downto 0));
end DivRadix2;

architecture Behavioral of DivRadix2 is
  type test_arr    is array(0 to (Width-1)) of std_logic_vector((Width-1) downto 0);
  type partial_arr is array(0 to Width) of std_logic_vector((Width-1) downto 0);
  type divisor_arr is array(0 to Width) of std_logic_vector((Width-1) downto 0);
  type q_arr       is array(0 to Width) of std_logic_vector((Width-1) downto 0);
  
  signal test : test_arr;
  signal p    : partial_arr;
  signal d    : divisor_arr;
  signal q    : q_arr;

  constant zeros     : STD_LOGIC_VECTOR ((Width-2) downto 0) := (others => '0');

begin
  q(Width)       <= (others => '0');
  p(Width)       <= dividend;
  d(Width)       <= divisor;
  remainder   <= p(0);
  quotient    <= q(0);

  testgen: for I in 0 to (Width-1) generate
    test(I) <= zeros(I-1 downto 0) & p(I+1)((Width-1) downto I);
  end generate testgen;
  
  procgen: for I in 0 to (Width-1) generate
    process (clk, p(I+1),test(I), d(I+1), q(I+1))
    begin
      if rising_edge(clk) then
        q(I) <= q(I+1)((Width-2) downto 0) & "0";
        d(I) <= d(I+1);
        p(I) <= p(I+1);
        if test(I) >= d(I+1) then
          q(I) <= q(I+1)((Width-2) downto 0) & '1';
          p(I) <= (p(I+1)((Width-1) downto I)-test(I)((Width-1)-I downto 0)) & p(I+1)(I-1 downto 0);
        end if;
      end if;
    end process;
  end generate procgen;
end Behavioral;




--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
novartis
сообщение Apr 21 2017, 06:32
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 344
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Цитата(Maverick @ Nov 30 2016, 01:29) *
попробуйте такое описание


Прикрепленное изображение


Попытался поделить 37 на 10, этот модуль выдал 2 и 1.
Еще делил 57 на 10, там результат был 4 (остаток не помню).

Что-то не верно он считает. Пока не когда с ним дальше разбираться.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Apr 21 2017, 07:27
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 209
Регистрация: 13-02-07
Из: 49°25′58″ 11°53′5″
Пользователь №: 25 329



2 novartis
Как вариация на тему деления - попробуйте код из Google Answers про {Patterson and Hennessy's algorithm}:
Прикрепленный файл  divide.v ( 1.97 килобайт ) Кол-во скачиваний: 20

(если есть время конечно)
Go to the top of the page
 
+Quote Post
sqrt(2)
сообщение Apr 21 2017, 08:18
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 20-07-16
Пользователь №: 92 633



У меня на Cyclone IV делит нормально (Квартус 16), но и частота относительно вашей маленькая...
Go to the top of the page
 
+Quote Post
x736C
сообщение Apr 21 2017, 13:57
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 930
Регистрация: 3-03-06
Пользователь №: 14 942



У меня тоже есть вопрос по делению, задам тут.
Существует ли какой-нибудь оптимальный способ целочисленного деления на 2^n-1 ?
Или только предложенными выше универсальными делителями?
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Apr 21 2017, 14:58
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(x736C @ Apr 21 2017, 16:57) *
У меня тоже есть вопрос по делению, задам тут.
Существует ли какой-нибудь оптимальный способ целочисленного деления на 2^n-1 ?
Или только предложенными выше универсальными делителями?


Если цель - уменьшить разрядность, а результаты потом используются для пост-обработки, то можно делить на 2^n, а уже после полученный результаты домножать на 2^n / 2^n - 1. В общем случае это, конечно, не годится, но вдруг.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Apr 21 2017, 16:33
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 598
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(x736C @ Apr 21 2017, 16:57) *
Существует ли какой-нибудь оптимальный способ целочисленного деления на 2^n-1 ?
Или только предложенными выше универсальными делителями?

Да, такой "оптимальный" способ существует. biggrin.gif

Чтобы его "найти", нужно вспомнить школьную формулу для суммы геометрической прогрессии:

2-n + 2-2n + 2-3n + ... + 2-mn = (1 - 2-mn)/(2n - 1).

Из этого следует, что:

a*(1 - 2-mn)/(2n - 1) = a/(2n - 1) - a*2-mn/(2n - 1) = a*(2-n + 2-2n + 2-3n + ... + 2-mn),

или:

a/(2n - 1) = a*(2-n + 2-2n + 2-3n + ... + 2-mn) + a*2-mn/(2n - 1),

или:

a/(2n - 1) = (a >>> n) + (a >>> 2n) + (a >>> 3n) + ... + (a >>> mn) + a*2-mn/(2n - 1).

Из этой формулы видно, что с точностью до слагаемого:

Δ = b*2-mn,

частное от деления "a" на (2n - 1) равно:

b == a/(2n - 1) ≈ (a >>> n) + (a >>> 2n) + (a >>> 3n) + ... + (a >>> mn).
Go to the top of the page
 
+Quote Post
Alexxxxey
сообщение Apr 23 2017, 11:56
Сообщение #15





Группа: Участник
Сообщений: 12
Регистрация: 21-09-13
Из: Санкт-Петербург
Пользователь №: 78 418



Цитата(novartis @ Nov 29 2016, 09:05) *
В мегавизарде можно выставить latency, ставлю 14 тактов ( запасом).
Компилю проект, таймквест репортует - отрицательные слаки.
Ставлю 24 такта.
Компилю проект, таймквест репортует - отрицательные слаки.
Сколько ему тактов то надо?


А в настройких фиттера опция Perform Register Retiming у вас используется?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2017 - 14:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016