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

Например, можно проверить первую половину данных на все единицы и после этого работать только с половиной данных. Можно дальше выполнять проверку половины от этой половины и т.д. Если продолжить этот процесс, то глубина пирамиды получится логарифмической, а сложность по элементам минимальной. Все остальные варианты лежат между этими двумя крайними точками (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

 

ЗЫ. уже обсуждали оптимальную структуру выполняющую подобную функцию %)

Так тут чуточку другое - надо посчитать количество единичных бит начиная с младшего разряда до первого нуля. В данном случае задача реализована как "позиция первого нуля начиная с младших разрядов". В случае вычисления количества единиц, конечно, появятся сумматоры. А здесь они не нужны, так как все равно потребуется логика, детектирующая позицию нуля. И она на себя берет функцию определения позиции (шифратора).

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


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

Припоздал с ответом. Я про 32 и 64 разряда и намекал. Для малой разрядности можно что-нибудь высокоуровневое изобразить. :rolleyes:

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


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

Что-то под вечер не пойму, устал, наверное...

Почему на данный код:

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"

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


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

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

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


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

Что-то под вечер не пойму, устал, наверное...

Order of evaluation жестко не задан по стандарту. Поэтому когда i=8 перед выходом из цикла возможно обращение к несуществующему биту. В своем коде выше я для решения этой проблемы расширил разрядность еще одним битом.

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


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

Order of evaluation жестко не задан по стандарту. Поэтому когда i=8 перед выходом из цикла возможно обращение к несуществующему биту. В своем коде выше я для решения этой проблемы расширил разрядность еще одним битом.

 

Хм...  

 

Да, что-то у меня под вечер Verilog с Си смешались.  :)  

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


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

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

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

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

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

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

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

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

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

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