Jools 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба Я бы переписал так MEASUREMENT : PROCESS (nRESET, compared_sig) variable temp :integer range 0 to 2047 begin IF nRESET = '0' THEN temp := 0; ELSE sum: for i in 1 to 2047 loop temp := temp + to_integer(compared_sig(i)); end loop sum; END IF; amplitude_sig <= temp; END PROCESS MEASUREMENT; Но что-то я невижу клока? Может будет правильней так: MEASUREMENT : PROCESS (clk) variable temp :integer range 0 to 2047 begin IF (clk = '1' and clk'event) THEN temp := 0; sum: for i in 1 to 2047 loop temp := temp + to_integer(compared_sig(i)); end loop sum; END IF; amplitude_sig <= temp; END PROCESS MEASUREMENT; Может где и ошибся, но суть помоему понятна. По идее должно считаться за один клок, только какой он должен быть по длительности? Уж не один ли герц? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба это когда считаешь - один,два,три,четыре,пять,шесть,семь,восемь,девять,десять - только в 10 раз меньше, наверное, еще умноженное на период тактирования, который автора по всей видимости волнует мало :) (и будет оч смешно если порядок этого периода он оценивает как десятки МГц) а вообще нескромный вопрос: вам такое чудовище для чего (в плане прикладной задачи)? <{POST_SNAPBACK}> Поясню: Данные обновляются на каждом фронте 2.048 МГц клока. А мне нужно оценить амплитуду ошибки (пересчитать эти самые единички) и сравнить с порогом. А задача такая: нужно протестировать канал связи nx64 кбит/с. По теории, для этого заряжают ПСП (2^11)-1, пропускают через канал и считают корреляционную функцию. И еще обычно этим занимаются специализированные микросхемы (у них эта функция как бонус), но та микрушка ,которую поставили мы....в общем работает не так, как хотелось бы. Битовые ошибки легко отлавливать (хоть и получается небольшая погрешность) , а вот со слипами совсем плохо. <{POST_SNAPBACK}> Если это канал связи, то данные должны приходить в последовательном коде, следовательно так их можно и считать. А если нет, то поднять частоту на DCM до сотни мегагерц и по-частям проталкивать через блок памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_mirgorodsky 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба Хочу добавить свои пять копеек в эту дискуссию. А что мешает законвеййеризировать процесс? Хлопните всю шину в регистр, поставьте n-разрядные сумматоры и сложите данные по их выходу. Результат суммирования снова в регистры, потом сложили регистры между собой и получили результат. Таких стадий можно сделать достаточно много. Будет несколько "жирнее" по ресурсам чем чисто ассинхронный сумматор, но будет эффективно и разводчик не запарится впихивать эту всю логику в кристалл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mozg 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба Хочу добавить свои пять копеек в эту дискуссию. А что мешает законвеййеризировать процесс? Хлопните всю шину в регистр, поставьте n-разрядные сумматоры и сложите данные по их выходу. Результат суммирования снова в регистры, потом сложили регистры между собой и получили результат. Таких стадий можно сделать достаточно много. Будет несколько "жирнее" по ресурсам чем чисто ассинхронный сумматор, но будет эффективно и разводчик не запарится впихивать эту всю логику в кристалл. <{POST_SNAPBACK}> Все сводится к тому, что так и нужно сделать спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxus 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба Конвеерно складывать это конечно выход, но что-то тут не то в самом алгоритме... Неужели весь вектор в 2048 бит полностью обновляется за один такт 2.048 МГц? Сам ведь сказал, что шина последовательная (как я понимаю, что-то вроде Е1), значит за один такт измениться значение только одного бита в твоем векторе (вернее 2-х: один "вдвинется", один "выдвинется"). Считать надо последовательно - по мере поступления битов. Кстате все микрухи, которые это делают, так и считают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба Если не рассматривать различные варианты оптимизации приведенного кода (и вообще осмысленность такого параллельного решения), то я не понимаю, какие могут быть проблемы с синтезом. Такой код: module test(d, o); // synthesis loop_limit 4000 input [2047:0] d; output [ 11:0] o; wire [2047:0] d; reg [ 11:0] o; integer i; always @(d) begin o=0; for (i=0; i<=2047; i=i+1) if (d==1'b1) o=o+1; end endmodule синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl и самому дописывать недостающие куски). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl и самому дописывать недостающие куски). <{POST_SNAPBACK}> а задержка от входа до выхода какая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 19 октября, 2005 Опубликовано 19 октября, 2005 · Жалоба синтезится синплифаем на ура, результат занимает 5567 ячеек в циклоне (код был переписан на верилог, т.к. на vhdl не были включены заголовки модуля, а у меня verilog "на кончиках пальцев" и было лень лезть в справочники по vhdl и самому дописывать недостающие куски). <{POST_SNAPBACK}> а задержка от входа до выхода какая? <{POST_SNAPBACK}> Для EP1C20F324C6 без оптимизаций (хотя какие здесь могут быть оптимизации? разве что балансировка дерева и оптимизация роутинга) и при запрошенной частоте 10 МГц: Path information for path number 1: Requested Period: 100.000 = Required time: 100.000 - Propagation time: 29.857 = Slack : 70.143 Number of logic level(s): 42 Starting point: d[2047:0] / d[1] Ending point: o[11:0] / o[11] The start point is clocked by System [rising] The end point is clocked by System [rising] Total path delay (propagation time + setup) of 29.857 is 20.930(70.1%) logic and 8.927(29.9%) route Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dinam 1 20 октября, 2005 Опубликовано 20 октября, 2005 · Жалоба SM на телесистемах как то в качестве примера на AHDL подсчитывал количество единичек в 64-разрядном векторе за один такт. Может это чем-то поможет. http://www.telesys.ru/wwwboards/vhdl/44/messages/11989.shtml Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oleg_1 0 25 октября, 2005 Опубликовано 25 октября, 2005 · Жалоба попробуй код для своей шины переделать . . счетчик числа единиц в 32-разрядном слове . . port(D : in std_logic_vector(31 downto 0); sum : out std_logic_vector(4 downto 0)); process(D) variable s:std_logic_vector(4 downto 0); begin s:="00000"; for i in 0 to 31 loop if D(i) = '1' then s:= s+ "00001"; end if; end loop; sum <= s; end process; Есть шина 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}> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться