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

считаем единички в векторе за один такт

Есть шина compared_sig : std_logic_vector(1 to 2047).

Нужно посчитать, сколько '1' в этом векторе (ну и присвоить это сигналу amplitude_sig: integer range 0 to 2047).

Вроде бы просто, но нужно это сделать за один такт.

Вот я написал, но что-то симуляция этого дела уходит "в себя" :(

MEASUREMENT : PROCESS (nRESET, compared_sig)
begin
IF nRESET = '0' THEN
 amplitude_sig <= 0;
ELSE
 sum: for i in 0 to 2048 loop
    if i = 0 then
       amplitude_sig <= 0;
    elsif (i < 2048) then
       amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));
    else
       exit sum;    
    end if;    
 end loop sum;
END IF;
END PROCESS MEASUREMENT;

 

Какие есть идеи?

Может я что-то не так нарулил? И как тогда надо?

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


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

Есть шина compared_sig : std_logic_vector(1 to 2047).

Нужно  посчитать, сколько '1' в этом векторе (ну и присвоить это сигналу  amplitude_sig: integer range 0 to 2047).

Вроде бы просто, но нужно это сделать за один такт.

Вот я написал, но что-то симуляция этого дела уходит "в себя"  :(

MEASUREMENT : PROCESS (nRESET, compared_sig)
begin
IF nRESET = '0' THEN
 amplitude_sig <= 0;
ELSE
 sum: for i in 0 to 2048 loop
    if i = 0 then
       amplitude_sig <= 0;
    elsif (i < 2048) then
       amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));
    else
       exit sum;    
    end if;    
 end loop sum;
END IF;
END PROCESS MEASUREMENT;

 

Какие есть идеи?

Может я что-то не так нарулил? И как тогда надо?

ХММ имхо с такой шиной за 1 такт ??

тогда сделайте на РОМ на BRAM памяти

будет за такт и быстро

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


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

а стоп, не вчитался в вопрос :) не получиться на памяти

у вас шина на 2048 бит ?? вы представляете себе на сколько логику подсчета 1 паралельно, по чипу разметает ?

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


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

а стоп, не вчитался в вопрос :) не получиться на памяти

у вас шина на 2048 бит ?? вы представляете себе на сколько логику подсчета 1 паралельно, по чипу разметает ?

 

 

Конечно представляю :) весь модуль подсчета с оценкой должен занять не более 2500 ячеек. На такую жертву могу пойти.

 

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

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


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

Есть шина compared_sig : std_logic_vector(1 to 2047).

Нужно  посчитать, сколько '1' в этом векторе (ну и присвоить это сигналу  amplitude_sig: integer range 0 to 2047).

Вроде бы просто, но нужно это сделать за один такт.

Вот я написал, но что-то симуляция этого дела уходит "в себя"  :(

MEASUREMENT : PROCESS (nRESET, compared_sig)
begin
IF nRESET = '0' THEN
 amplitude_sig <= 0;
ELSE
 sum: for i in 0 to 2048 loop
    if i = 0 then
       amplitude_sig <= 0;
    elsif (i < 2048) then
       amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));
    else
       exit sum;    
    end if;    
 end loop sum;
END IF;
END PROCESS MEASUREMENT;

 

Какие есть идеи?

Может я что-то не так нарулил? И как тогда надо?

 

есть предположение что связвн тупизм с дельтациклами..

попробуйте вставить after 1ns, чтоли, после каждого присваивания

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


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

есть предположение что связвн тупизм с дельтациклами..

попробуйте вставить after 1ns, чтоли, после каждого присваивания

 

 

Хм... квартус все эти "after" не узнает...

 

В сущности вме нужен один сумматор с бааааальшим колличеством однобитных входов. Вроде бы одна комбинаторика, хоть и много. Но данные появляются с частотой 2 МГц, так что некоторая задержка на xor-ах не смертельна.

Просто не знаю как написать так, чтобы компилятор сотворил такой сумматор :(

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


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

один иакт это сколько?

это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :)

 

а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)?

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


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

Мудро если не сказать мудрено...

Меня вообще интересовало время, а не вышеприведенный словесный понос...

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


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

и еще один глупый вопрос - в данной конструкции:

sum: for i in 0 to 2048 loop

if i = 0 then

amplitude_sig <= 0;

elsif (i < 2048) then

amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));

else

exit sum;

end if;

end loop sum;

 

вам зачем диапазон от 0 до 2048 с последующим exit sum?

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


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

В сущности вме нужен один сумматор с бааааальшим колличеством однобитных входов. Вроде бы одна комбинаторика, хоть и много. Но данные появляются с частотой 2 МГц, так что некоторая задержка на xor-ах не смертельна.

Просто не знаю как написать так, чтобы компилятор сотворил такой сумматор :(

 

Всего ??? дык чт же проще то, хлопнуть все это в регистр,а потом побитно и разобрать на суматоре аккумуляторе, на более выскокой тактухе?

а в вашем коде ИМХО

  if i = 0 then
      amplitude_sig <= 0;
   elsif (i < 2048) then
      amplitude_sig <= amplitude_sig + to_integer(compared_sig(i));
   else
      exit sum;
   end if;

Это гон, особенно с выходом

надо по другому описать,

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


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

Мудро если не сказать мудрено...

Меня вообще интересовало время, а не вышеприведенный словесный понос...

а! -- тогда - четверть восьмого

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


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

это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :) (и будет оч смешно если порядок этого периода он оценивает как десятки МГц)

 

а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)?

 

 

Поясню:

Данные обновляются на каждом фронте 2.048 МГц клока.

А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом.

 

А задача такая: нужно протестировать канал связи nx64 кбит/с. По теории, для этого заряжают ПСП (2^11)-1, пропускают через канал и считают корреляционную функцию. И еще обычно этим занимаются специализированные микросхемы (у них эта функция как бонус), но та микрушка ,которую поставили мы....в общем работает не так, как хотелось бы.

Битовые ошибки легко отлавливать (хоть и получается небольшая погрешность) , а вот со слипами совсем плохо.

Пробовал делать "не по теории", а "по инженерному", но что-то получается громоздко и слишком запутано....а времени сидеть и педантично симулить несколько дней эту фигню нету. Вот и решил посчитать корреляционную функцию :)

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


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

 

Всего ??? дык чт же проще то, хлопнуть все это в регистр,а потом побитно и разобрать на суматоре аккумуляторе, на более выскокой тактухе?

 

 

ну вот я так и хотел, только не на большей скорости суммировать (это ж какую мне тактовую на сумматор надо подать, чтобы проссумировать 2000 входов, считал?)

 

Это гон, особенно с выходом

надо по другому описать,

 

Я и сам это понимаю, потому сюда и написал :)

А вопрос заключался в том, как это "по другому" сделать :)

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


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

Поясню:

Данные обновляются на каждом фронте 2.048 МГц клока.

А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом.

 

ну тогда des дело говорит и микрушка наверное так же работает - увеличте внутреннюю частоту (a какой ФПГА кристалл? и еще какая частота на плате доступна?/т.е. возможно ли увеличить системную частоту или плата уже готова/ )

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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