Egel 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Подскажите алгоритм подсчета нулей или единиц в 64 разрядном числе за один такт. И что можно почитать поглубже по поводу создания АЛУ Спасибо огромное заранее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Подскажите алгоритм подсчета нулей или единиц в 64 разрядном числе за один такт. И что можно почитать поглубже по поводу создания АЛУ Спасибо огромное заранее Многое зависит от длительности такта и от способностей синтезатора по оптимизации. Напишите простой цикл в процессе с переменной-счетчиком для начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба 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); ну явно лишние разряды сумматоров убъет синтезатор, а если хотите, можете и сами. Это подсчет единиц. Как сделать подсчет нулей, думаю сами догадаетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egel 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба На одном сумматоре вообще абсурдно пытаться сделать?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба На одном сумматоре вообще абсурдно пытаться сделать?? Легко. Если он имеет достаточную разрядность (на вскидку - 183 бита). Заводя его выходы на его же входы по приведенной мной выше схеме. А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных. Таким образом первый уровень будет принимать 3*N бит данных и состоять из однобитных сумматоров, второй - состоять из двухбитных, и принимать N/2 бит (по кол-ву входов переносов сумматоров), и так далее. Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 13 мая, 2009 Опубликовано 13 мая, 2009 (изменено) · Жалоба 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. Пока проверял - не заметил сообщения выше :) Изменено 13 мая, 2009 пользователем des333 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PeterD 0 13 мая, 2009 Опубликовано 13 мая, 2009 (изменено) · Жалоба А так? 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 Изменено 13 мая, 2009 пользователем PeterD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egel 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Но какие частоты будут с 180 разрядным сумматором? Про дерево не совсем понял) Надо все АЛУ сделать на одном сумматоре) Это конечно лучший вариант с поразрядным сложением. мне тоже так больше нравится. Кстати это не есть та схема, о которой вы говорили, SM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Но какие частоты будут с 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 продумывать мне влом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egel 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Всем огромное спасибо. Очень сильно помогли :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Надо все АЛУ сделать на одном сумматоре) Это сильно завернуто... Из всех букв аббревиатуры АЛУ - останется пожалуй только АУ :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Проверено, синтезаторы (Quartus, DC и Synplify) не умеют оптимизировать такую структуру в такое дерево. вот тут проверяли %) http://electronix.ru/forum/index.php?showtopic=59528 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба 2 Admin ИМХО популярная тема у народа, может того её..пристегнуть? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_Petrik 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба А эффективнее всего это делать на дереве полных сумматоров с использованием их входов переносов, подавая везде на перенос один бит входных данных. Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере. Похоже, что есть ограничения на то, откуда можно подавать данные на вход переноса в альтеровской LE. Получается, что если туда подается сигнал не с выхода переноса соседней ячейки, то приходится задействовать еще одну LE. А в этом случае уже более оптимальным получается дерево, имеющее полусумматоры на первом сложении (лучше 2 полусумматора, чем один полный). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 мая, 2009 Опубликовано 13 мая, 2009 · Жалоба Как раз с полными сумматорами здесь не очень-то получается, по крайней мере на Альтере. Вполне возможно. Я не преследовал цели соптимизировать именно на альтеру. Изначально моей целью была среднестатистическая технология, основанная на стандартных ячейках. Если хорошо подумать, можно родить и оптимальный вариант для альтеры, и, возможно, он будет именно таков, как Вы предлагаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться