SergeyF 0 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба Например, можно проверить первую половину данных на все единицы и после этого работать только с половиной данных. Можно дальше выполнять проверку половины от этой половины и т.д. Если продолжить этот процесс, то глубина пирамиды получится логарифмической, а сложность по элементам минимальной. Все остальные варианты лежат между этими двумя крайними точками (case и пирамидой). А все, что не лежит там - то от лукавого ;) Так я так и разложил, на верхнем уровне получил что-то вроде if (s0!=16) sum=s0; else if (s1!=16) sum=s1+16; else if (s2!=16) sum=s2+32; else if (s3!=16) sum=s3+48; else sum=64; Естественно, так как синтезатор Quartus маразмом не страдает, сумматоров не появилось. сравните свои результаты с результатами полученными здесь %) http://electronix.ru/forum/index.php?showt...mp;#entry549588 ЗЫ. уже обсуждали оптимальную структуру выполняющую подобную функцию %) Так тут чуточку другое - надо посчитать количество единичных бит начиная с младшего разряда до первого нуля. В данном случае задача реализована как "позиция первого нуля начиная с младших разрядов". В случае вычисления количества единиц, конечно, появятся сумматоры. А здесь они не нужны, так как все равно потребуется логика, детектирующая позицию нуля. И она на себя берет функцию определения позиции (шифратора). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egel 0 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба Припоздал с ответом. Я про 32 и 64 разряда и намекал. Для малой разрядности можно что-нибудь высокоуровневое изобразить. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба Что-то под вечер не пойму, устал, наверное... Почему на данный код: module test_s( input [7:0] data, output reg [3:0] sum ); always @(*) begin sum = 0; for(int i=0; (i<8 && data[i]==1'b1); i=i+1) sum = sum + 1; end endmodule Quartus выдает: Error (10232): Verilog HDL error at test_s.v(9): index 8 cannot fall outside the declared range [7:0] for vector "data" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба module test_s( input [7:0] data, output reg [3:0] sum ); integer i; always@* begin sum=8; for(i=7; i>=0; i=i-1) if (data[i]==0) sum=i; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба Что-то под вечер не пойму, устал, наверное... Order of evaluation жестко не задан по стандарту. Поэтому когда i=8 перед выходом из цикла возможно обращение к несуществующему биту. В своем коде выше я для решения этой проблемы расширил разрядность еще одним битом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 2 ноября, 2009 Опубликовано 2 ноября, 2009 · Жалоба Order of evaluation жестко не задан по стандарту. Поэтому когда i=8 перед выходом из цикла возможно обращение к несуществующему биту. В своем коде выше я для решения этой проблемы расширил разрядность еще одним битом. Хм... Да, что-то у меня под вечер Verilog с Си смешались. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться