des00 25 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Кто поделится мыслями или практикой реализации? много раз обсуждалось, идея здесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Кто поделится мыслями или практикой реализации? Самый быстрый – асинхронный; только при считывании из него кода, его надо остановить. Еще быстрее - кольцевой на кодах Грея, но там потом надо пересчитывать в двоичную форму, и останавливать не надо. Последовательная цепочка на D-триггерах с кольцом обратной связи через инвертор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Самый быстрый – асинхронный; только при считывании из него кода, его надо остановить. Еще быстрее - кольцевой на кодах Грея, но там потом надо пересчитывать в двоичную форму, и останавливать не надо. ПСП счетчик и счетчик на кодах джонсона забыли %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [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.. Что как то не радует. Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arexol 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Собственно есть такая задача, думаю как раз для этого раздела: каждый такт выбираем индекс входных данных [15:0] для минимального значения (среди этих входных данных). То есть имеем, например, такие входных данных: [порт№0] -> 7, [порт№1] -> 4, [порт№2] -> 1, [порт№3] -> 9, И значит минимальный индекс будет 2 ([порт№2] -> 1). Значения произвольные (в смысле они не сортированы) и меняются каждый такт, выдавать индекс нужно тоже каждый такт. Решение в лоб, говорит что максимум МГц так 35 можно для 16 входных 8битных портов на S6 (44 слоя комбинаторики). Ковыряние в умных книгах и поиск в инете выдал только такое заключение: . Что как то не радует. Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке? Вроде вот такая регулярная структура родилась на вскидку (кружки это компараторы на больше - небыло сил бороться с виио :) ) должно быть не более 16 уровней логики ... при 16 значениях поправте если не прав Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Возможно у кого то появятся идеи как это сделать не прибегая к линейной проверке? 1. пузырьковая сортировка на конвейере... Использовал при медианной фильтрации. 2. ассоциативный спецвычислитель... Не понятно, что такое линейная проверка. Какое требуется быстродействие? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Данные для сравнения и вычисления индекса для минимальног опорта меняются каждый такт, то есть индекс нужно вычислять тоже за 1 такт. Желательно бы получить частоту хоть в 100МГц. Как вы понимаете, конвеер здесь не получится сделать. Линейная проверка - это как в оригинале - берём и влоб перебираем/сравниваем все значения сразу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Так всё равно непонятно, почему нельзя сделать конвейер. Результат будет выдаваться тоже каждый такт, только с задержкой в N тактов. Или это критично? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Может, это очевидно, но нужно сравнить сначала соседние пары - 8 сравнений параллельно, проходят те, что меньше. Затем среди новых кандидатов попарно проводить 4 сравнения. Затем 2 сравнения. И, наконец, одно, завершающее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба 2 ISK это сравнение, только часть глобального вычисления - потому нужно считать каждый такт. Если есть уверенность что за N тактов не будет повторяющегся значения то можно и конвеер, но уверенности нет - изначально задано что данные идут произвольные и нет гарантии что они не будут одинаковые. 2 ViKo arexol уже ранее предложил такую идею :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба 2 ViKo arexol уже ранее предложил такую идею :laughing: Наверное. Только на картинке это трудно понять. :laughing: И... "16 уровней логики" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба 2 ISK Если есть уверенность что за N тактов не будет повторяющегся значения то можно и конвеер, но уверенности нет - изначально задано что данные идут произвольные и нет гарантии что они не будут одинаковые. Всё равно не могу понять, какое отношение имеет повторение/неповторение данных для конвейера. В упрощённом виде для этого достаточно поставить регистр после мультиплексора на каждом уровне вычислителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Хотя можно по arexol и ViKo... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба 2 ISK глобальная идеология там мутноватая, я сам не сразу въехал, но в 2х словах вот так оно выглядит: приходят данные, делается их кодирование, параметр кодирования изменяется от 0 до 15, для каждого параметра - свой счётчик он считает общую длинну закодированных данных для своего К-параметра, высчитывается индекс счётчика с минимальной длинной, это индекс и будет К-параметр, который будет использоваться для кодирования следующих данных в следующем такте. Ну и так по кругу - адаптивный механизм. Потому находить минимальный индекс, когда значения могу повторяться нужно каждый такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Была у меня похожая задача, на 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться