S_Hawk 0 11 августа, 2010 Опубликовано 11 августа, 2010 · Жалоба подскажите, пожалуйста, существует ли у Альтеры мегафункция, или какая-нибудь красивая конструкция языка AHDL, которая позволила бы заменить этот код: TABLE N[31..0] => EE[]; B"1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" => 31; B"01XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" => 30; B"001XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" => 29; B"0001XXXXXXXXXXXXXXXXXXXXXXXXXXXX" => 28; B"00001XXXXXXXXXXXXXXXXXXXXXXXXXXX" => 27; B"000001XXXXXXXXXXXXXXXXXXXXXXXXXX" => 26; B"0000001XXXXXXXXXXXXXXXXXXXXXXXXX" => 25; B"00000001XXXXXXXXXXXXXXXXXXXXXXXX" => 24; B"000000001XXXXXXXXXXXXXXXXXXXXXXX" => 23; B"0000000001XXXXXXXXXXXXXXXXXXXXXX" => 22; B"00000000001XXXXXXXXXXXXXXXXXXXXX" => 21; B"000000000001XXXXXXXXXXXXXXXXXXXX" => 20; B"0000000000001XXXXXXXXXXXXXXXXXXX" => 19; B"00000000000001XXXXXXXXXXXXXXXXXX" => 18; B"000000000000001XXXXXXXXXXXXXXXXX" => 17; B"0000000000000001XXXXXXXXXXXXXXXX" => 16; B"00000000000000001XXXXXXXXXXXXXXX" => 15; B"000000000000000001XXXXXXXXXXXXXX" => 14; B"0000000000000000001XXXXXXXXXXXXX" => 13; B"00000000000000000001XXXXXXXXXXXX" => 12; B"000000000000000000001XXXXXXXXXXX" => 11; B"0000000000000000000001XXXXXXXXXX" => 10; B"00000000000000000000001XXXXXXXXX" => 9; B"000000000000000000000001XXXXXXXX" => 8; B"0000000000000000000000001XXXXXXX" => 7; B"00000000000000000000000001XXXXXX" => 6; B"000000000000000000000000001XXXXX" => 5; B"0000000000000000000000000001XXXX" => 4; B"00000000000000000000000000001XXX" => 3; B"000000000000000000000000000001XX" => 2; B"0000000000000000000000000000001X" => 1; B"00000000000000000000000000000001" => 0; B"00000000000000000000000000000000" => 32; END TABLE; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2010 Опубликовано 12 августа, 2010 · Жалоба пишите на верилоге, получите одну строчку res = (1'b1 << addr); или res = addr[5] ? 0 : (1'b1 << addr[4:0]); PS. задаете таблицу в 32 вхождения, и инициализируете ее 33 адреса %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 августа, 2010 Опубликовано 13 августа, 2010 · Жалоба PS. задаете таблицу в 32 вхождения, и инициализируете ее 33 адреса %) Задает 32-разрядную переменную, а использует всего 33 её состояния. Кстати, мне нравится. Куда уж нагляднее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S_Hawk 0 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Да, собственно, 0 => 32 в данном случае не важен, если к нему претензии, то его и отдельно обработать можно... На самом деле, N[31..0] это выход некоей функции, на которой с большой вероятностью только один выход ненулевой. Вот его и нужно определить. Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный. Да и хочется это делать на максимальной тактовой частоте, так что, похоже, таблицу придется разбивать на две и обрабатывать за два такта... В общем, какой-нибудь мегавизардовский плагин с параметром PIPELINE не помешал бы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Да, собственно, 0 => 32 в данном случае не важен, если к нему претензии, то его и отдельно обработать можно... На самом деле, N[31..0] это выход некоей функции, на которой с большой вероятностью только один выход ненулевой. Вот его и нужно определить. Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный. Да и хочется это делать на максимальной тактовой частоте, так что, похоже, таблицу придется разбивать на две и обрабатывать за два такта... В общем, какой-нибудь мегавизардовский плагин с параметром PIPELINE не помешал бы... Посмотрите поиском приоритетный шифратор. Особливо решения, выданные SM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный. Т.е., сначала сделать шифратор, а потом из него - мультиплексор. Можно сразу каждый сигнал N[31..0] объединить по И со своим входом данных, а дальше объединить полученные сигналы по ИЛИ. Только нужно избавиться от той оставшейся небольшой доли вероятности, когда не один сигнал N может быть ненулевой. Зато быстро! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S_Hawk 0 14 августа, 2010 Опубликовано 14 августа, 2010 · Жалоба Только нужно избавиться от той оставшейся небольшой доли вероятности, когда не один сигнал N может быть ненулевой. Зато быстро! Только кажется мне, что эта задача ничуть не проще первоначально сформулированной :) Подавить все N после первого ненулевого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 августа, 2010 Опубликовано 15 августа, 2010 · Жалоба Только кажется мне, что эта задача ничуть не проще первоначально сформулированной Вы пишете, что вероятность таких событий малая. Найдите закономерности, когда появляется несколько единиц. Пробуйте их устранить. Вдруг окажется, что этот путь проще. Подавить все N после первого ненулевого? Вот именно! :) Как только обнаружили 1, остальные биты сбросить в 0. P.S. С другой стороны, не исключено, что Quartus сам соптимизирует вашу разработку с шифратором-мультиплексором... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
S_Hawk 0 15 августа, 2010 Опубликовано 15 августа, 2010 · Жалоба Вы пишете, что вероятность таких событий малая. Найдите закономерности, когда появляется несколько единиц. Пробуйте их устранить. Вдруг окажется, что этот путь проще. Вот именно! :) Как только обнаружили 1, остальные биты сбросить в 0. P.S. С другой стороны, не исключено, что Quartus сам соптимизирует вашу разработку с шифратором-мультиплексором... процес полностью случаен. Именно исходя из этого предположения я решаю задачу. Если бы я мог угадывать когда будут коллизии, я бы обрабатывал все по-другому... Коллизий мало, но они есть и при этом случайны. А по поводу обнаружения первой единицы - я не вижу упрощения задачи, по-моему, она остается эквивалентной первоначально сформулированной... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 августа, 2010 Опубликовано 15 августа, 2010 · Жалоба А по поводу обнаружения первой единицы - я не вижу упрощения задачи, по-моему, она остается эквивалентной первоначально сформулированной... Так что все таки предпочтительнее - табличный метод или приоритетное мультиплексирование? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 15 августа, 2010 Опубликовано 15 августа, 2010 · Жалоба Ну вот опять :) Вот тема про нахождение старшего значащего бита. IMHO, простой путь добиться разумного соотношения быстродействия/объема - факторизовать схему на модули, аналогичные приведенному топикстартером. А мультиплексоры в базисе ПЛИС это все же не самая эффективная с точки зрения быстродействия функция (т.е. стремиться выделить мультиплексоры при описании схемы - не всегда лучший путь при ручной оптимизации). Грубо говоря - 2 в 1 - и вот уже один слой логики в ПЛИС с четырехвходовой таблицей перекодировки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 августа, 2010 Опубликовано 15 августа, 2010 · Жалоба Расширить таблицу. К таблице, описанной в начале темы, добавить выбираемые сигналы, и передавать их на выход в зависимости от сигналов N. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 августа, 2010 Опубликовано 16 августа, 2010 · Жалоба Грубо говоря - 2 в 1 - и вот уже один слой логики в ПЛИС с четырехвходовой таблицей перекодировки. а 4в1 это два, а не три слоя %) Хотя некоторые синтезаторы считают по другому %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 августа, 2010 Опубликовано 16 августа, 2010 · Жалоба а 4в1 это два, а не три слоя %) А 32 в 1 - это пять слоев! А по-проще - никак? А если каждый N объединить с входным сигналом, а потом всех их объединить по И с применением цепей каскадирования (а в Циклоне их, кажется, уже нет :( ) - то будет 2 (два) слоя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 16 августа, 2010 Опубликовано 16 августа, 2010 · Жалоба а 4в1 это два, а не три слоя %) Хотя некоторые синтезаторы считают по другому %) Интересно, это у каких синтезаторов все так плохо? А 32 в 1 - это пять слоев! А по-проще - никак? А если каждый N объединить с входным сигналом, а потом всех их объединить по И с применением цепей каскадирования (а в Циклоне их, кажется, уже нет :( ) - то будет 2 (два) слоя. Ну в какой-то степени настройка Restructure Multiplexers дает возможность поиграть с ними. Но не радикально. А в цепи каскадирования в FLEX/ACEX, помнится, задержка была порядка задержки на одном элементе, так что это ничего не даст. :) Поможет ALM в Stratix, там как раз 4 в 1 вроде бы в один ALM влезает. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться