Перейти к содержанию
    

Схемотехнические трюки для ПЛИСоводов

Кто поделится мыслями или практикой реализации?

много раз обсуждалось, идея здесь

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто поделится мыслями или практикой реализации?

Самый быстрый – асинхронный; только при считывании из него кода, его надо остановить.

Еще быстрее - кольцевой на кодах Грея, но там потом надо пересчитывать в двоичную форму, и останавливать не надо. Последовательная цепочка на D-триггерах с кольцом обратной связи через инвертор.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый быстрый – асинхронный; только при считывании из него кода, его надо остановить.

Еще быстрее - кольцевой на кодах Грея, но там потом надо пересчитывать в двоичную форму, и останавливать не надо.

ПСП счетчик и счетчик на кодах джонсона забыли %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [15:0] для минимального значения (среди этих входных данных).

То есть имеем, например, такие входных данных: [порт№0] -> 7, [порт№1] -> 4, [порт№2] -> 1, [порт№3] -> 9,

И значит минимальный индекс будет 2 ([порт№2] -> 1). Значения произвольные (в смысле они не сортированы) и меняются каждый такт, выдавать индекс нужно тоже каждый такт.

Решение в лоб, говорит что максимум МГц так 35 можно для 16 входных 8битных портов на S6 (44 слоя комбинаторики). Ковыряние в умных книгах и поиск в инете выдал только такое заключение:

If the arrays are unsorted then you must do a linear search to find the largest value in each.
. Что как то не радует.

Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [15:0] для минимального значения (среди этих входных данных).

То есть имеем, например, такие входных данных: [порт№0] -> 7, [порт№1] -> 4, [порт№2] -> 1, [порт№3] -> 9,

И значит минимальный индекс будет 2 ([порт№2] -> 1). Значения произвольные (в смысле они не сортированы) и меняются каждый такт, выдавать индекс нужно тоже каждый такт.

Решение в лоб, говорит что максимум МГц так 35 можно для 16 входных 8битных портов на S6 (44 слоя комбинаторики). Ковыряние в умных книгах и поиск в инете выдал только такое заключение: . Что как то не радует.

Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке?

 

 

Вроде вот такая регулярная структура родилась на вскидку (кружки это компараторы на больше - небыло сил бороться с виио :) )

 

должно быть не более 16 уровней логики ... при 16 значениях

поправте если не прав

 

 

 

post-20651-1349161708_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке?

1. пузырьковая сортировка на конвейере... Использовал при медианной фильтрации.

2. ассоциативный спецвычислитель...

 

Не понятно, что такое линейная проверка. Какое требуется быстродействие?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Данные для сравнения и вычисления индекса для минимальног опорта меняются каждый такт, то есть индекс нужно вычислять тоже за 1 такт. Желательно бы получить частоту хоть в 100МГц. Как вы понимаете, конвеер здесь не получится сделать.

Линейная проверка - это как в оригинале - берём и влоб перебираем/сравниваем все значения сразу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так всё равно непонятно, почему нельзя сделать конвейер. Результат будет выдаваться тоже каждый такт, только с задержкой в N тактов. Или это критично?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, это очевидно, но нужно сравнить сначала соседние пары - 8 сравнений параллельно, проходят те, что меньше. Затем среди новых кандидатов попарно проводить 4 сравнения. Затем 2 сравнения. И, наконец, одно, завершающее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ISK

это сравнение, только часть глобального вычисления - потому нужно считать каждый такт. Если есть уверенность что за N тактов не будет повторяющегся значения то можно и конвеер, но уверенности нет - изначально задано что данные идут произвольные и нет гарантии что они не будут одинаковые.

 

2 ViKo

arexol уже ранее предложил такую идею :laughing:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ViKo

arexol уже ранее предложил такую идею :laughing:

Наверное. Только на картинке это трудно понять. :laughing: И... "16 уровней логики" :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ISK

Если есть уверенность что за N тактов не будет повторяющегся значения то можно и конвеер, но уверенности нет - изначально задано что данные идут произвольные и нет гарантии что они не будут одинаковые.

 

 

Всё равно не могу понять, какое отношение имеет повторение/неповторение данных для конвейера. В упрощённом виде для этого достаточно поставить регистр после мультиплексора на каждом уровне вычислителя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ISK

глобальная идеология там мутноватая, я сам не сразу въехал, но в 2х словах вот так оно выглядит:

приходят данные, делается их кодирование, параметр кодирования изменяется от 0 до 15, для каждого параметра - свой счётчик он считает общую длинну закодированных данных для своего К-параметра, высчитывается индекс счётчика с минимальной длинной, это индекс и будет К-параметр, который будет использоваться для кодирования следующих данных в следующем такте. Ну и так по кругу - адаптивный механизм. Потому находить минимальный индекс, когда значения могу повторяться нужно каждый такт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Была у меня похожая задача, на 100 МГц на циклоне 3 схема работала.

 

        process (add_sub_res,point_cnt,cmp_res) begin        
            for j in 15 downto 0 loop
                for i in 15 downto 0 loop
                    if ((j = i) or (i > point_cnt)) then cmp_res(j)(i) <= '1';
                    elsif (j > point_cnt) then cmp_res(j)(i) <= '0';
                    else
                        if (j > i) then cmp_res(j)(i) <= not cmp_res(i)(j); 
                        else
                            if (add_sub_res(j) < add_sub_res(i)) then cmp_res(j)(i) <= '1'; else cmp_res(j)(i) <= '0'; end if;
                        end if;
                    end if;
                end loop;
            end loop;
        end process;

        cmp_res_reg <= cmp_res;    

    --    process (cmp_res_reg) begin                    -- определение: единица, если все биты cmp_res(i) == единицы
          
and_loop:        for i in 0 to 15 generate
                      cmp_res_and(i) <=    cmp_res_reg(i)(0) and cmp_res_reg(i)(1) and cmp_res_reg(i)(2) and cmp_res_reg(i)(3) and cmp_res_reg(i)(4) and cmp_res_reg(i)(5) and cmp_res_reg(i)(6) and cmp_res_reg(i)(7) and
                            cmp_res_reg(i)(8) and cmp_res_reg(i)(9) and cmp_res_reg(i)(10) and cmp_res_reg(i)(11) and cmp_res_reg(i)(12) and cmp_res_reg(i)(13) and cmp_res_reg(i)(14) and cmp_res_reg(i)(15);                    
            --end loop;
        end generate;
        

s1: with cmp_res_and select
    point_find_result <= 0 when "0000000000000001",
                1 when     "0000000000000010",
                2 when    "0000000000000100",
                3 when    "0000000000001000",
                4 when    "0000000000010000",
                5 when    "0000000000100000",
                6 when    "0000000001000000",
                7 when    "0000000010000000",
                8 when    "0000000100000000",
                9 when    "0000001000000000",
                10 when    "0000010000000000",
                11 when    "0000100000000000",
                12 when    "0001000000000000",
                13 when    "0010000000000000",
                14 when    "0100000000000000",
                15 when others;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...