считать ведущий ноль в одном цикле данных - PullRequest
3 голосов
/ 03 марта 2010

Как вы все, возможно, знаете, что набор инструкций MIPS поддерживает clz (отсчет, ведущий ноль) следующим образом:

clz $ t0, $ t1 отсчет ведущих нулей t0 = # начальных нулей в t1

Я пишу одностадийный путь данных в verilog, и мне было просто интересно, что ALU должен поддерживать, чтобы я мог это сделать ... какие-либо идеи ??

Ответы [ 3 ]

4 голосов
/ 04 марта 2010

Вот возможный подход (я игнорирую случай ввода 0, который, вероятно, лучше всего рассматривать как особый случай):

  • Число старших нулей в 32-битном числе:
    • количество старших нулей в старших 16 битах, если любой из старших 16 битов не равен нулю; или
    • 16 плюс число старших нулей в младших 16 битах, если все верхние 16 битов равны нулю
  • Это дает старший бит 5-битного результата (игнорируя особый случай ввода 0 ...).
  • Теперь вам нужно найти число старших нулей в 16-битном числе, поэтому примените тот же принцип еще раз.
  • и т.д.

В Verilog это может выглядеть примерно так:

result[4] = (value[31:16] == 16'b0);
val16     = result[4] ? value[15:0] : value[31:16];
result[3] = (val16[15:8] == 8'b0);
val8      = result[3] ? val16[7:0] : val16[15:8];
result[2] = (val8[7:4] == 4'b0);
val4      = result[2] ? val8[3:0] : val8[7:4];
result[1] = (val4[3:2] == 2'b0);
result[0] = result[1] ? ~val4[1] : ~val4[3];
0 голосов
/ 12 октября 2012

Создайте модуль clz16, который просматривает 16 бит, и имеет 4-битный результат (0..15) и вывод «allzero». Соедините два из них вместе, чтобы сделать clz32, вам нужен мультиплексор, чтобы выбрать, какие 4 младших бита и немного логики для верхних 2 битов вывода.

clz16 состоит из двух clz8 одинаковым образом. Clz8 состоит из двух clz4. Clz4 - это всего лишь три логические функции входов <= 4, поэтому неважно, как вы это делаете, синтезатор сводит его к нескольким элементам. </p>

Этот иерархический подход больше, чем решение Мэтью Слэттери с каскадными муксами, но, вероятно, не настолько (ему не нужны широкие ворота для переключения муксов), и я считаю, что он допускает более низкую опору. задержка. Оба подхода хорошо масштабируются до больших размеров (например, 64, 128 бит) с опорой задержки. войти2 (n).

0 голосов
/ 03 марта 2010

Самая простая реализация, которую я могу придумать (не очень оптимизированная), - это проверка слова по 32 (в случае 32-разрядных) масках, самая длинная сначала, решение о том, какая из них подходит первой, и возвращение его числа.

Что-то вроде (псевдокод):

if word == 0: return 32
elsif (word & 1) == 0: return 31
elsif (word & 3) == 0: return 30

и т.д.

...