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

Как определить номер старшего разряда std_logic_vector

Здравствуйте, уважаемые форумчане!

 

Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда.

 

Варианты, которые уже пришли в голову, но не нравятся:

 

1. Комбинаторно перебрать все 48 бит (т.е. if, elsif, elsif, ...) 48 раз. Плохой вариант с точки зрения тайминга.

2. Последовательно на 48 клоках перебрать все 48 бит () 48 раз. Хороший вариант с точки зрения тайминга, но слишком большой latency.

3. Разбить 48 битное слово пополам, определить, какая половина целиком равна нулю, и для другой половины рекурсивно применить этот же метод. Когда рекурсия дойдет до 3-битной шины, перебрать через elsif. Слишком замудрённо.

4. ...

 

Помогите плз с этой задачей.

 

Заранее благодарен.

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


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

Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда.

Может просто всегда выдавать на выход число 47? :wacko:

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


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

Приветствую.

...

Помогите плз с этой задачей.

...

С чем помочь то ? То как это делать Вы уже знаете (и даже несколько вариантов) а как оптимально сделать для Ваших КОНКРЕТНЫХ (тип FPGA, тактовая, max latecy) условий только телепаты догадываются.

Тем более у Вас такой строгий constarin - "не нравится" :)

 

Успехов! Rob.

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


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

Может просто всегда выдавать на выход число 47? :wacko:

 

Я имею ввиду номер старшего значащего разряда. Извините за неполную формулировку

 

Приветствую.

 

С чем помочь то ? То как это делать Вы уже знаете (и даже несколько вариантов) а как оптимально сделать для Ваших КОНКРЕТНЫХ (тип FPGA, тактовая, max latecy) условий только телепаты догадываются.

Тем более у Вас такой строгий constarin - "не нравится" :)

 

Успехов! Rob.

 

Пришла в голову мысль взять XilinxIPCore fixed to float.

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


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

Сдвигать влево и считать такты до появления единицы невозможно?

 

Да возможно, только это займет 48 клоков.

Я где-то раньше видел алгоритм, как это сделать быстрее и более оптимальным способом (Xilinx Fixed2Float это делает за 7 клоков).

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


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

Я имею ввиду номер старшего значащего разряда.

Не, сдвигать вправо не айс...

А вот взять по ИЛИ 4 (старших) разряда... Или байт... И если там 0, то брать следующие... И при появлении 1 уже искать в тетраде...

Наверное можно провести оптимизацию и вычислить сколько бит брать...

Теоретически проверять на наличие "1" можно одновременно все тетрады. Результаты можно объединить в вектор, который и укажет на нужную тетраду... получится указатель на тетраду... Далее мультиплексор. На входе все число, на выходе мультиплексор должен дать смещение относительно указателя... И если их просуммировать, то это и будет старший разряд...

Правда логики сожрет много...

 

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


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

Нужно сделать модуль, который имеет на входе беззнаковый std_logic_vector(47 downto 0), на выходе - номер старшего разряда.

Номер старшего разряда потом для какой цели используется?

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


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

Номер старшего разряда потом для какой цели используется?

 

Номер старшего разряда - это округленный вниз логарифм по основанию 2.

 

Не, сдвигать вправо не айс...

А вот взять по ИЛИ 4 (старших) разряда... Или байт... И если там 0, то брать следующие... И при появлении 1 уже искать в тетраде...

Наверное можно провести оптимизацию и вычислить сколько бит брать...

Теоретически проверять на наличие "1" можно одновременно все тетрады. Результаты можно объединить в вектор, который и укажет на нужную тетраду... получится указатель на тетраду... Далее мультиплексор. На входе все число, на выходе мультиплексор должен дать смещение относительно указателя... И если их просуммировать, то это и будет старший разряд...

Правда логики сожрет много...

 

Iosifk, Спасибо. В принципе если делать вручную, то это так наверное и надо (коллеги то же самое предложили). Все же пока думаю над более простым решением.

 

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


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

Номер старшего разряда потом для какой цели используется?

Он что, меняется в процессе работы?

 

 

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


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

Я имею ввиду номер старшего значащего разряда. Извините за неполную формулировку

.....

Номер старшего разряда - это округленный вниз логарифм по основанию 2.

Так вам логарифм нужен? Посмотрите по ссылке,лишнее выбросьте.

быстрый логарифм

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


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

Приветствую!

 

Для 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!

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


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

2ТС - то, что вы пытаетесь сделать называется 'приоритетный энкодер' (Priority encoder). Google выдает 340000 ссылок (и кучу картинок - если хочется наглядности)

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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