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

Подсчет нулей или единиц

Подскажите алгоритм подсчета нулей или единиц в 64 разрядном числе за один такт. И что можно почитать поглубже по поводу создания АЛУ

 

 

Спасибо огромное заранее

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


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

Подскажите алгоритм подсчета нулей или единиц в 64 разрядном числе за один такт. И что можно почитать поглубже по поводу создания АЛУ

 

 

Спасибо огромное заранее

 

Многое зависит от длительности такта и от способностей синтезатора по оптимизации. Напишите простой цикл в процессе с переменной-счетчиком для начала.

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


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

assign temp_a = (in_data & 64'h5555555555555555) + ((in_data >> 1) & 64'h5555555555555555);

assign temp_b = (temp_a & 64'h3333333333333333) + ((temp_a >> 2) & 64'h3333333333333333);

assign temp_c = (temp_b & 64'h0707070707070707) + ((temp_b >> 4) & 64'h0707070707070707);

assign temp_d = (temp_c & 64'h000F000F000F000F) + ((temp_c >> 8) & 64'h000F000F000F000F);

assign temp_e = (temp_d & 64'h0000001F0000001F) + ((temp_d >> 16) & 64'h0000001F0000001F);

assign temp_f = (temp_e & 64'h000000000000003F) + ((temp_e >> 32) & 64'h000000000000003F);

 

ну явно лишние разряды сумматоров убъет синтезатор, а если хотите, можете и сами.

Это подсчет единиц. Как сделать подсчет нулей, думаю сами догадаетесь.

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


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

На одном сумматоре вообще абсурдно пытаться сделать??

Легко. Если он имеет достаточную разрядность (на вскидку - 183 бита). Заводя его выходы на его же входы по приведенной мной выше схеме.

 

А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных. Таким образом первый уровень будет принимать 3*N бит данных и состоять из однобитных сумматоров, второй - состоять из двухбитных, и принимать N/2 бит (по кол-ву входов переносов сумматоров), и так далее. Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево.

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


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

assign temp_a = (in_data & 64'h5555555555555555) + ((in_data >> 1) & 64'h5555555555555555);

assign temp_b = (temp_a & 64'h3333333333333333) + ((temp_a >> 2) & 64'h3333333333333333);

assign temp_c = (temp_b & 64'h0707070707070707) + ((temp_b >> 4) & 64'h0707070707070707);

assign temp_d = (temp_c & 64'h000F000F000F000F) + ((temp_c >> 8) & 64'h000F000F000F000F);

assign temp_e = (temp_d & 64'h0000001F0000001F) + ((temp_d >> 16) & 64'h0000001F0000001F);

assign temp_f = (temp_e & 64'h000000000000003F) + ((temp_e >> 32) & 64'h000000000000003F);

119 элементов против 193 следующей реализации:

 

always @(*)
  begin
    temp_f = 0;
    for(int i=0; i<64; i++)
      if(in_data[i])
        temp_f++;
  end

 

Синтезатор еще далек от идеала :)  

 

 

Но, зато, судя по времянке быстродействие второго способа не намного хуже, чем первого.

 

Надо бы для проверки в TQA загнать.

 

 

P.S. Пока проверял - не заметил сообщения выше :)

Изменено пользователем des333

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


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

А так?

always @(posedge clk) begin

one [7:0] = input_number[63] + input_number[62] + input_number[61] +...+input_number[0]

zero[7:0] = 8'd64 - (input_number[63] + input_number[62] + input_number[61] +...+input_number[0])

end

Изменено пользователем PeterD

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


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

Но какие частоты будут с 180 разрядным сумматором? Про дерево не совсем понял)

 

Надо все АЛУ сделать на одном сумматоре)

Это конечно лучший вариант с поразрядным сложением. мне тоже так больше нравится.

 

Кстати это не есть та схема, о которой вы говорили, SM?

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


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

Но какие частоты будут с 180 разрядным сумматором? Про дерево не совсем понял)

Точно те же, как и в остальных схемах. Так как как этот зад раком не крути, а для решения задачи нучно 180 одноразрядных сумматоров (примерное количество, плюс минус от реализации и задействования их переносов). А как их расставить - как один 180-битный, или как 180 однобитных - это вам решать и это сути дела не меняет.

Про дерево - для 8 бит так:

 

wire [1:0] stage_0_0, stage_0_1;

wire [2:0] stage_1_0;

wire [3:0] stage_2_0;

 

assign stage_0_0 = data[0]+data[1]+data[2];

assign stage_0_1 = data[3]+data[4]+data[5];

assign stage_1_0 = stage_0_0 + stage_0_1 + data[6];

assign stage_2_0 = stage_1_0 + data[7];

 

до 64 бит сами расширяйте, долго и муторно. А цикл generate продумывать мне влом.

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


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

Надо все АЛУ сделать на одном сумматоре)

Это сильно завернуто... Из всех букв аббревиатуры АЛУ - останется пожалуй только АУ :)

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


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

Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево.

 

вот тут проверяли %)

 

http://electronix.ru/forum/index.php?showtopic=59528

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


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

А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных.

 

Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере. Похоже, что есть ограничения на то, откуда можно подавать данные на вход переноса в альтеровской LE. Получается, что если туда подается сигнал не с выхода переноса соседней ячейки, то приходится задействовать еще одну LE. А в этом случае уже более оптимальным получается дерево, имеющее полусумматоры на первом сложении (лучше 2 полусумматора, чем один полный).

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


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

Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере.

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

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


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

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

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

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

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

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

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

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

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

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