Mozg 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Есть шина 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; Какие есть идеи? Может я что-то не так нарулил? И как тогда надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Есть шина 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; Какие есть идеи? Может я что-то не так нарулил? И как тогда надо? <{POST_SNAPBACK}> ХММ имхо с такой шиной за 1 такт ?? тогда сделайте на РОМ на BRAM памяти будет за такт и быстро Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба а стоп, не вчитался в вопрос :) не получиться на памяти у вас шина на 2048 бит ?? вы представляете себе на сколько логику подсчета 1 паралельно, по чипу разметает ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mozg 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба а стоп, не вчитался в вопрос :) не получиться на памяти у вас шина на 2048 бит ?? вы представляете себе на сколько логику подсчета 1 паралельно, по чипу разметает ? <{POST_SNAPBACK}> Конечно представляю :) весь модуль подсчета с оценкой должен занять не более 2500 ячеек. На такую жертву могу пойти. А с памятью действительно не получается из-за толстой выходной шины, а быстродействия перебрать по кусочкам тоже не хватает и при этом все так сильно усложняется... в общем источников глюков и так хватает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyadvychuk 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Есть шина 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; Какие есть идеи? Может я что-то не так нарулил? И как тогда надо? <{POST_SNAPBACK}> есть предположение что связвн тупизм с дельтациклами.. попробуйте вставить after 1ns, чтоли, после каждого присваивания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mozg 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба есть предположение что связвн тупизм с дельтациклами.. попробуйте вставить after 1ns, чтоли, после каждого присваивания <{POST_SNAPBACK}> Хм... квартус все эти "after" не узнает... В сущности вме нужен один сумматор с бааааальшим колличеством однобитных входов. Вроде бы одна комбинаторика, хоть и много. Но данные появляются с частотой 2 МГц, так что некоторая задержка на xor-ах не смертельна. Просто не знаю как написать так, чтобы компилятор сотворил такой сумматор :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба один иакт это сколько? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба один иакт это сколько? <{POST_SNAPBACK}> это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :) а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Мудро если не сказать мудрено... Меня вообще интересовало время, а не вышеприведенный словесный понос... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба и еще один глупый вопрос - в данной конструкции: 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба В сущности вме нужен один сумматор с бааааальшим колличеством однобитных входов. Вроде бы одна комбинаторика, хоть и много. Но данные появляются с частотой 2 МГц, так что некоторая задержка на xor-ах не смертельна. Просто не знаю как написать так, чтобы компилятор сотворил такой сумматор :( <{POST_SNAPBACK}> Всего ??? дык чт же проще то, хлопнуть все это в регистр,а потом побитно и разобрать на суматоре аккумуляторе, на более выскокой тактухе? а в вашем коде ИМХО 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; Это гон, особенно с выходом надо по другому описать, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Мудро если не сказать мудрено... Меня вообще интересовало время, а не вышеприведенный словесный понос... <{POST_SNAPBACK}> а! -- тогда - четверть восьмого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mozg 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :) (и будет оч смешно если порядок этого периода он оценивает как десятки МГц) а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)? <{POST_SNAPBACK}> Поясню: Данные обновляются на каждом фронте 2.048 МГц клока. А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом. А задача такая: нужно протестировать канал связи nx64 кбит/с. По теории, для этого заряжают ПСП (2^11)-1, пропускают через канал и считают корреляционную функцию. И еще обычно этим занимаются специализированные микросхемы (у них эта функция как бонус), но та микрушка ,которую поставили мы....в общем работает не так, как хотелось бы. Битовые ошибки легко отлавливать (хоть и получается небольшая погрешность) , а вот со слипами совсем плохо. Пробовал делать "не по теории", а "по инженерному", но что-то получается громоздко и слишком запутано....а времени сидеть и педантично симулить несколько дней эту фигню нету. Вот и решил посчитать корреляционную функцию :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mozg 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Всего ??? дык чт же проще то, хлопнуть все это в регистр,а потом побитно и разобрать на суматоре аккумуляторе, на более выскокой тактухе? ну вот я так и хотел, только не на большей скорости суммировать (это ж какую мне тактовую на сумматор надо подать, чтобы проссумировать 2000 входов, считал?) Это гон, особенно с выходом надо по другому описать, Я и сам это понимаю, потому сюда и написал :) А вопрос заключался в том, как это "по другому" сделать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Поясню: Данные обновляются на каждом фронте 2.048 МГц клока. А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом. <{POST_SNAPBACK}> ну тогда des дело говорит и микрушка наверное так же работает - увеличте внутреннюю частоту (a какой ФПГА кристалл? и еще какая частота на плате доступна?/т.е. возможно ли увеличить системную частоту или плата уже готова/ ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться