Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IP ядро целочисленного деления от Альтеры
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
novartis
Сколько я его не пытался использовать, все какие то заморочки.
Утыкаюсь в ограничение по частоте. Нужно например поделить два числа (64 бит на 32 бит) на частоте 300МГц.
Компилю проект, таймквест репортует - отрицательные слаки. Считаю, вроде тактов 10 не хватает.
В мегавизарде можно выставить latency, ставлю 14 тактов ( запасом).
Компилю проект, таймквест репортует - отрицательные слаки.
Ставлю 24 такта.
Компилю проект, таймквест репортует - отрицательные слаки.
Сколько ему тактов то надо?

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

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

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

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

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

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

какая FPGA?

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

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

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

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

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


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

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

попробуйте латентность сделать 64 или 32 такта, тогда возможно получиться...
goodsoul
С мегафункцией целочисленного деления lpm_divide у меня тоже нормальной частоты не вышло. И варьирование latency не дает желаемого эффекта.
Что интересно, altera_fp_functions может делить плавающую точку и там можно указать желаемую частоту или latency. Вот там как нефиг делать 350MHz получилось.
Maverick
попробуйте такое описание

Код
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;


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


Нажмите для просмотра прикрепленного файла

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

Что-то не верно он считает. Пока не когда с ним дальше разбираться.
Kuzmi4
2 novartis
Как вариация на тему деления - попробуйте код из Google Answers про {Patterson and Hennessy's algorithm}:
Нажмите для просмотра прикрепленного файла
(если есть время конечно)
sqrt(2)
У меня на Cyclone IV делит нормально (Квартус 16), но и частота относительно вашей маленькая...
x736C
У меня тоже есть вопрос по делению, задам тут.
Существует ли какой-нибудь оптимальный способ целочисленного деления на 2^n-1 ?
Или только предложенными выше универсальными делителями?
Tausinov
Цитата(x736C @ Apr 21 2017, 16:57) *
У меня тоже есть вопрос по делению, задам тут.
Существует ли какой-нибудь оптимальный способ целочисленного деления на 2^n-1 ?
Или только предложенными выше универсальными делителями?


Если цель - уменьшить разрядность, а результаты потом используются для пост-обработки, то можно делить на 2^n, а уже после полученный результаты домножать на 2^n / 2^n - 1. В общем случае это, конечно, не годится, но вдруг.
blackfin
Цитата(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).
Alexxxxey
Цитата(novartis @ Nov 29 2016, 09:05) *
В мегавизарде можно выставить latency, ставлю 14 тактов ( запасом).
Компилю проект, таймквест репортует - отрицательные слаки.
Ставлю 24 такта.
Компилю проект, таймквест репортует - отрицательные слаки.
Сколько ему тактов то надо?


А в настройких фиттера опция Perform Register Retiming у вас используется?
x736C
Tausinov, blackfin, спасибо большое! В общем, это то, что мне было нужно sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.