|
|
  |
"Схемотехнические трюки для ПЛИСоводов", создание аналога "Алгоритмические трюки для программистов" |
|
|
|
Feb 28 2012, 13:54
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(aosp @ Feb 28 2012, 17:20)  Кто поделится мыслями или практикой реализации? Самый быстрый – асинхронный; только при считывании из него кода, его надо остановить. Еще быстрее - кольцевой на кодах Грея, но там потом надо пересчитывать в двоичную форму, и останавливать не надо. Последовательная цепочка на D-триггерах с кольцом обратной связи через инвертор.
|
|
|
|
|
Oct 2 2012, 06:39
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [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. . Что как то не радует. Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке?
|
|
|
|
|
Oct 2 2012, 07:12
|
Местный
  
Группа: Свой
Сообщений: 317
Регистрация: 25-09-06
Пользователь №: 20 651

|
Цитата(Kuzmi4 @ Oct 2 2012, 09:39)  Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [15:0] для минимального значения (среди этих входных данных). То есть имеем, например, такие входных данных: [порт№0] -> 7, [порт№1] -> 4, [порт№2] -> 1, [порт№3] -> 9, И значит минимальный индекс будет 2 ([порт№2] -> 1). Значения произвольные (в смысле они не сортированы) и меняются каждый такт, выдавать индекс нужно тоже каждый такт. Решение в лоб, говорит что максимум МГц так 35 можно для 16 входных 8битных портов на S6 (44 слоя комбинаторики). Ковыряние в умных книгах и поиск в инете выдал только такое заключение: . Что как то не радует. Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке? Вроде вот такая регулярная структура родилась на вскидку (кружки это компараторы на больше - небыло сил бороться с виио  ) должно быть не более 16 уровней логики ... при 16 значениях поправте если не прав
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 2 2012, 07:29
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(Kuzmi4 @ Oct 2 2012, 09:39)  Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке? 1. пузырьковая сортировка на конвейере... Использовал при медианной фильтрации. 2. ассоциативный спецвычислитель... Не понятно, что такое линейная проверка. Какое требуется быстродействие?
|
|
|
|
|
Oct 2 2012, 08:09
|
Участник

Группа: Свой
Сообщений: 59
Регистрация: 9-06-05
Из: Киев
Пользователь №: 5 857

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

Группа: Свой
Сообщений: 59
Регистрация: 9-06-05
Из: Киев
Пользователь №: 5 857

|
Цитата(Kuzmi4 @ Oct 2 2012, 11:25)  2 ISK Если есть уверенность что за N тактов не будет повторяющегся значения то можно и конвеер, но уверенности нет - изначально задано что данные идут произвольные и нет гарантии что они не будут одинаковые. Всё равно не могу понять, какое отношение имеет повторение/неповторение данных для конвейера. В упрощённом виде для этого достаточно поставить регистр после мультиплексора на каждом уровне вычислителя.
|
|
|
|
|
Oct 2 2012, 08:50
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
2 ISK глобальная идеология там мутноватая, я сам не сразу въехал, но в 2х словах вот так оно выглядит: приходят данные, делается их кодирование, параметр кодирования изменяется от 0 до 15, для каждого параметра - свой счётчик он считает общую длинну закодированных данных для своего К-параметра, высчитывается индекс счётчика с минимальной длинной, это индекс и будет К-параметр, который будет использоваться для кодирования следующих данных в следующем такте. Ну и так по кругу - адаптивный механизм. Потому находить минимальный индекс, когда значения могу повторяться нужно каждый такт.
|
|
|
|
|
Oct 2 2012, 09:32
|
Участник

Группа: Свой
Сообщений: 59
Регистрация: 9-06-05
Из: Киев
Пользователь №: 5 857

|
Была у меня похожая задача, на 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;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|