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

подскажите, пожалуйста, существует ли у Альтеры мегафункция, или какая-нибудь красивая конструкция языка 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;

 

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


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

пишите на верилоге, получите одну строчку res = (1'b1 << addr); или res = addr[5] ? 0 : (1'b1 << addr[4:0]);

 

PS. задаете таблицу в 32 вхождения, и инициализируете ее 33 адреса %)

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


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

PS. задаете таблицу в 32 вхождения, и инициализируете ее 33 адреса %)

Задает 32-разрядную переменную, а использует всего 33 её состояния.

Кстати, мне нравится. Куда уж нагляднее.

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


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

Да, собственно, 0 => 32 в данном случае не важен, если к нему претензии, то его и отдельно обработать можно...

 

На самом деле, N[31..0] это выход некоей функции, на которой с большой вероятностью только один выход ненулевой. Вот его и нужно определить. Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный. Да и хочется это делать на максимальной тактовой частоте, так что, похоже, таблицу придется разбивать на две и обрабатывать за два такта...

В общем, какой-нибудь мегавизардовский плагин с параметром PIPELINE не помешал бы...

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


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

Да, собственно, 0 => 32 в данном случае не важен, если к нему претензии, то его и отдельно обработать можно...

 

На самом деле, N[31..0] это выход некоей функции, на которой с большой вероятностью только один выход ненулевой. Вот его и нужно определить. Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный. Да и хочется это делать на максимальной тактовой частоте, так что, похоже, таблицу придется разбивать на две и обрабатывать за два такта...

В общем, какой-нибудь мегавизардовский плагин с параметром PIPELINE не помешал бы...

 

Посмотрите поиском приоритетный шифратор. Особливо решения, выданные SM.

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


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

Дальше он (EE[]) может использоваться как адрес для мультиплексора, чтобы из первоначальных 32 входов выбрать один нужный.

Т.е., сначала сделать шифратор, а потом из него - мультиплексор. Можно сразу каждый сигнал N[31..0] объединить по И со своим входом данных, а дальше объединить полученные сигналы по ИЛИ. Только нужно избавиться от той оставшейся небольшой доли вероятности, когда не один сигнал N может быть ненулевой. Зато быстро!

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


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

Только нужно избавиться от той оставшейся небольшой доли вероятности, когда не один сигнал N может быть ненулевой. Зато быстро!

 

Только кажется мне, что эта задача ничуть не проще первоначально сформулированной :)

Подавить все N после первого ненулевого?

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


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

Только кажется мне, что эта задача ничуть не проще первоначально сформулированной

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

Подавить все N после первого ненулевого?

Вот именно! :) Как только обнаружили 1, остальные биты сбросить в 0.

P.S. С другой стороны, не исключено, что Quartus сам соптимизирует вашу разработку с шифратором-мультиплексором...

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


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

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

 

Вот именно! :) Как только обнаружили 1, остальные биты сбросить в 0.

P.S. С другой стороны, не исключено, что Quartus сам соптимизирует вашу разработку с шифратором-мультиплексором...

 

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

Коллизий мало, но они есть и при этом случайны.

 

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

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


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

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

 

Так что все таки предпочтительнее - табличный метод или приоритетное мультиплексирование?

 

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


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

Ну вот опять :) Вот тема про нахождение старшего значащего бита. IMHO, простой путь добиться разумного соотношения быстродействия/объема - факторизовать схему на модули, аналогичные приведенному топикстартером.

 

А мультиплексоры в базисе ПЛИС это все же не самая эффективная с точки зрения быстродействия функция (т.е. стремиться выделить мультиплексоры при описании схемы - не всегда лучший путь при ручной оптимизации). Грубо говоря - 2 в 1 - и вот уже один слой логики в ПЛИС с четырехвходовой таблицей перекодировки.

 

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


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

Расширить таблицу. К таблице, описанной в начале темы, добавить выбираемые сигналы, и передавать их на выход в зависимости от сигналов N.

 

 

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


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

Грубо говоря - 2 в 1 - и вот уже один слой логики в ПЛИС с четырехвходовой таблицей перекодировки.

а 4в1 это два, а не три слоя %) Хотя некоторые синтезаторы считают по другому %)

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


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

а 4в1 это два, а не три слоя %)

А 32 в 1 - это пять слоев! А по-проще - никак?

А если каждый N объединить с входным сигналом, а потом всех их объединить по И с применением цепей каскадирования (а в Циклоне их, кажется, уже нет :( ) - то будет 2 (два) слоя.

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


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

а 4в1 это два, а не три слоя %) Хотя некоторые синтезаторы считают по другому %)

Интересно, это у каких синтезаторов все так плохо?

 

А 32 в 1 - это пять слоев! А по-проще - никак?

А если каждый N объединить с входным сигналом, а потом всех их объединить по И с применением цепей каскадирования (а в Циклоне их, кажется, уже нет :( ) - то будет 2 (два) слоя.

Ну в какой-то степени настройка Restructure Multiplexers дает возможность поиграть с ними. Но не радикально. А в цепи каскадирования в FLEX/ACEX, помнится, задержка была порядка задержки на одном элементе, так что это ничего не даст. :) Поможет ALM в Stratix, там как раз 4 в 1 вроде бы в один ALM влезает. :)

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


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

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

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

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

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

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

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

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

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

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