реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Подсчет нулей или единиц
Egel
сообщение May 13 2009, 09:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 28-07-08
Из: Химки
Пользователь №: 39 244



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


Спасибо огромное заранее
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2009, 10:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Egel @ May 13 2009, 13:52) *
Подскажите алгоритм подсчета нулей или единиц в 64 разрядном числе за один такт. И что можно почитать поглубже по поводу создания АЛУ


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


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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
SM
сообщение May 13 2009, 10:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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);

ну явно лишние разряды сумматоров убъет синтезатор, а если хотите, можете и сами.
Это подсчет единиц. Как сделать подсчет нулей, думаю сами догадаетесь.
Go to the top of the page
 
+Quote Post
Egel
сообщение May 13 2009, 10:34
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 28-07-08
Из: Химки
Пользователь №: 39 244



На одном сумматоре вообще абсурдно пытаться сделать??
Go to the top of the page
 
+Quote Post
SM
сообщение May 13 2009, 10:44
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Egel @ May 13 2009, 14:34) *
На одном сумматоре вообще абсурдно пытаться сделать??

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

А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных. Таким образом первый уровень будет принимать 3*N бит данных и состоять из однобитных сумматоров, второй - состоять из двухбитных, и принимать N/2 бит (по кол-ву входов переносов сумматоров), и так далее. Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево.
Go to the top of the page
 
+Quote Post
des333
сообщение May 13 2009, 10:51
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(SM @ May 13 2009, 14:08) *
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


Синтезатор еще далек от идеала smile.gif  


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

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


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

Сообщение отредактировал des333 - May 13 2009, 10:52


--------------------
Go to the top of the page
 
+Quote Post
PeterD
сообщение May 13 2009, 10:52
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 26-10-07
Пользователь №: 31 743



А так?
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 - May 13 2009, 10:54
Go to the top of the page
 
+Quote Post
Egel
сообщение May 13 2009, 10:56
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 28-07-08
Из: Химки
Пользователь №: 39 244



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

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

Кстати это не есть та схема, о которой вы говорили, SM?
Go to the top of the page
 
+Quote Post
SM
сообщение May 13 2009, 10:58
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Egel @ May 13 2009, 14:52) *
Но какие частоты будут с 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 продумывать мне влом.
Go to the top of the page
 
+Quote Post
Egel
сообщение May 13 2009, 11:01
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 28-07-08
Из: Химки
Пользователь №: 39 244



Всем огромное спасибо. Очень сильно помогли rolleyes.gif
Go to the top of the page
 
+Quote Post
SM
сообщение May 13 2009, 11:03
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Egel @ May 13 2009, 14:56) *
Надо все АЛУ сделать на одном сумматоре)

Это сильно завернуто... Из всех букв аббревиатуры АЛУ - останется пожалуй только АУ smile.gif
Go to the top of the page
 
+Quote Post
des00
сообщение May 13 2009, 11:09
Сообщение #12


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(SM @ May 13 2009, 04:44) *
Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево.


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

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


--------------------
Go to the top of the page
 
+Quote Post
Postoroniy_V
сообщение May 13 2009, 13:29
Сообщение #13


МедвеД Инженер I
****

Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951



2 Admin
ИМХО популярная тема у народа, может того её..пристегнуть? smile.gif


--------------------
Cogito ergo sum
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение May 13 2009, 18:01
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(SM @ May 13 2009, 13:44) *
А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных.


Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере. Похоже, что есть ограничения на то, откуда можно подавать данные на вход переноса в альтеровской LE. Получается, что если туда подается сигнал не с выхода переноса соседней ячейки, то приходится задействовать еще одну LE. А в этом случае уже более оптимальным получается дерево, имеющее полусумматоры на первом сложении (лучше 2 полусумматора, чем один полный).
Go to the top of the page
 
+Quote Post
SM
сообщение May 13 2009, 21:12
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Artem_Petrik @ May 13 2009, 22:01) *
Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере.

Вполне возможно. Я не преследовал цели соптимизировать именно на альтеру. Изначально моей целью была среднестатистическая технология, основанная на стандартных ячейках. Если хорошо подумать, можно родить и оптимальный вариант для альтеры, и, возможно, он будет именно таков, как Вы предлагаете.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 23:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016