aabmail 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Здравствуйте, уважаемые форумчане! Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда. Варианты, которые уже пришли в голову, но не нравятся: 1. Комбинаторно перебрать все 48 бит (т.е. if, elsif, elsif, ...) 48 раз. Плохой вариант с точки зрения тайминга. 2. Последовательно на 48 клоках перебрать все 48 бит () 48 раз. Хороший вариант с точки зрения тайминга, но слишком большой latency. 3. Разбить 48 битное слово пополам, определить, какая половина целиком равна нулю, и для другой половины рекурсивно применить этот же метод. Когда рекурсия дойдет до 3-битной шины, перебрать через elsif. Слишком замудрённо. 4. ... Помогите плз с этой задачей. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда. Может просто всегда выдавать на выход число 47? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Приветствую. ... Помогите плз с этой задачей. ... С чем помочь то ? То как это делать Вы уже знаете (и даже несколько вариантов) а как оптимально сделать для Ваших КОНКРЕТНЫХ (тип FPGA, тактовая, max latecy) условий только телепаты догадываются. Тем более у Вас такой строгий constarin - "не нравится" :) Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Может просто всегда выдавать на выход число 47? Я имею ввиду номер старшего значащего разряда. Извините за неполную формулировку Приветствую. С чем помочь то ? То как это делать Вы уже знаете (и даже несколько вариантов) а как оптимально сделать для Ваших КОНКРЕТНЫХ (тип FPGA, тактовая, max latecy) условий только телепаты догадываются. Тем более у Вас такой строгий constarin - "не нравится" :) Успехов! Rob. Пришла в голову мысль взять XilinxIPCore fixed to float. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Сдвигать влево и считать такты до появления единицы невозможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Сдвигать влево и считать такты до появления единицы невозможно? Да возможно, только это займет 48 клоков. Я где-то раньше видел алгоритм, как это сделать быстрее и более оптимальным способом (Xilinx Fixed2Float это делает за 7 клоков). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Таблицей перекодировок? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Таблицей перекодировок? Можете более подробно описать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Я имею ввиду номер старшего значащего разряда. Не, сдвигать вправо не айс... А вот взять по ИЛИ 4 (старших) разряда... Или байт... И если там 0, то брать следующие... И при появлении 1 уже искать в тетраде... Наверное можно провести оптимизацию и вычислить сколько бит брать... Теоретически проверять на наличие "1" можно одновременно все тетрады. Результаты можно объединить в вектор, который и укажет на нужную тетраду... получится указатель на тетраду... Далее мультиплексор. На входе все число, на выходе мультиплексор должен дать смещение относительно указателя... И если их просуммировать, то это и будет старший разряд... Правда логики сожрет много... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
backend 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда. Номер старшего разряда потом для какой цели используется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Номер старшего разряда потом для какой цели используется? Номер старшего разряда - это округленный вниз логарифм по основанию 2. Не, сдвигать вправо не айс... А вот взять по ИЛИ 4 (старших) разряда... Или байт... И если там 0, то брать следующие... И при появлении 1 уже искать в тетраде... Наверное можно провести оптимизацию и вычислить сколько бит брать... Теоретически проверять на наличие "1" можно одновременно все тетрады. Результаты можно объединить в вектор, который и укажет на нужную тетраду... получится указатель на тетраду... Далее мультиплексор. На входе все число, на выходе мультиплексор должен дать смещение относительно указателя... И если их просуммировать, то это и будет старший разряд... Правда логики сожрет много... Iosifk, Спасибо. В принципе если делать вручную, то это так наверное и надо (коллеги то же самое предложили). Все же пока думаю над более простым решением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 28 июля, 2016 Опубликовано 28 июля, 2016 · Жалоба Номер старшего разряда потом для какой цели используется? Он что, меняется в процессе работы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 29 июля, 2016 Опубликовано 29 июля, 2016 · Жалоба Я имею ввиду номер старшего значащего разряда. Извините за неполную формулировку ..... Номер старшего разряда - это округленный вниз логарифм по основанию 2. Так вам логарифм нужен? Посмотрите по ссылке,лишнее выбросьте. быстрый логарифм Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 29 июля, 2016 Опубликовано 29 июля, 2016 · Жалоба Приветствую! Для 48 разрядов классический поиск старшей единицы с latency 1 при синтезе (Synplify) дает: Virtex2 -6 ~250 MHz Spartan6 -2 ~200 MHz Kintex7 -2 ~500 MHz Kintex7 UltaScale -2 ~600 MHz Zynq020 -2 ~300 MHz Zynq030 -2 ~500 MHz Virtex7 -2 ~550 MHz При этом критический путь всего 4 уровня логики Хотите больше MHz? - сделайте конвейер на 2..4 такта - длинее смысла нет. Да и если разбить на группы по 16 бит то частота классики увеличивает раза в 2. Вот и вся помощь. Удачи! Rob! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 29 июля, 2016 Опубликовано 29 июля, 2016 · Жалоба 2ТС - то, что вы пытаетесь сделать называется 'приоритетный энкодер' (Priority encoder). Google выдает 340000 ссылок (и кучу картинок - если хочется наглядности) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться