Des333 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба И это действительно радует. :) А Вы попробовали поставить регистр после компаратора, как я выше предлагал? Мне просто интересно, какой результат будет у хилых, а под рукой ISE нет. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба А Вы попробовали поставить регистр после компаратора, как я выше предлагал? Мне просто интересно, какой результат будет у хилых, а под рукой ISE нет. :) Если я Вас правильно понял и сделал соответственно вот так: process(clk, rst) begin if rst='1' then din0_reg<=(others=>'0'); din1_reg<=(others=>'0'); din2_reg<=(others=>'0'); add0_result_reg<=(others=>'0'); add1_result_reg<=(others=>'0'); dout_reg<=(others=>'0'); cmp_result_reg<='0'; elsif rising_edge(clk) then din0_reg<=din0_next; din1_reg<=din1_next; din2_reg<=din2_next; add0_result_reg<=add0_result_next; add1_result_reg<=add1_result_next; dout_reg<=dout_next; cmp_result_reg<=cmp_result_next; end if; end process; din0_next<=din0; din1_next<=din1; din2_next<=din2; add0_result_next<=din0_reg + mux_out; add1_result_next<=din1_reg + din2_reg; cmp_result_next<='1' when (add0_result_next > add1_result_next) else '0'; mux_out<=add0_result_reg when (cmp_result_reg='1') else add1_result_reg; dout_next<=mux_out; dout<=dout_reg; где триггер cmp_result_reg - результат сравнения, который подается на мультиплексор, в этом случае максимальная частота упала до 213 МГц. А вот отчет по критическому пути: ========================================================================= Timing constraint: Default period analysis for Clock 'clk' Clock period: 4.685ns (frequency: 213.447MHz) Total number of paths / destination ports: 1290 / 31 ------------------------------------------------------------------------- Delay: 4.685ns (Levels of Logic = 14) Source: din0_reg_0 (FF) Destination: cmp_result_reg (FF) Source Clock: clk rising Destination Clock: clk rising Data Path: din0_reg_0 to cmp_result_reg Gate Net Cell:in->out fanout Delay Delay Logical Name (Net Name) ---------------------------------------- ------------ FDC:C->Q 1 0.471 0.789 din0_reg_0 (din0_reg_0) LUT4:I0->O 1 0.094 0.000 Madd_add0_result_next_lut<0> (Madd_add0_result_next_lut<0>) MUXCY:S->O 1 0.372 0.000 Madd_add0_result_next_cy<0> (Madd_add0_result_next_cy<0>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<1> (Madd_add0_result_next_cy<1>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<2> (Madd_add0_result_next_cy<2>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<3> (Madd_add0_result_next_cy<3>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<4> (Madd_add0_result_next_cy<4>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<5> (Madd_add0_result_next_cy<5>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<6> (Madd_add0_result_next_cy<6>) MUXCY:CI->O 1 0.026 0.000 Madd_add0_result_next_cy<7> (Madd_add0_result_next_cy<7>) MUXCY:CI->O 0 0.026 0.000 Madd_add0_result_next_cy<8> (Madd_add0_result_next_cy<8>) XORCY:CI->O 3 0.357 0.800 Madd_add0_result_next_xor<9> (add0_result_next<9>) LUT4:I0->O 0 0.094 0.000 Mcompar_cmp_result_next_cmp_gt0000_lutdi4 (Mcompar_cmp_result_next_cmp_gt0000_lutdi4) MUXCY:DI->O 1 0.590 0.336 Mcompar_cmp_result_next_cmp_gt0000_cy<4> (Mcompar_cmp_result_next_cmp_gt0000_cy<4>) INV:I->O 1 0.238 0.336 Mcompar_cmp_result_next_cmp_gt0000_cy<4>_inv1_INV_0 (cmp_result_next) FDC:D -0.018 cmp_result_reg ---------------------------------------- Total 4.685ns (2.424ns logic, 2.261ns route) (51.7% logic, 48.3% route) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Rundll: Да, правильно. А для Циклона, наоборот, частота увеличивается. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Rundll: Да, правильно. А для Циклона, наоборот, частота увеличивается. :) Ну что тут поделать, таковы особенности архитектур различных ПЛИС. Но я все равно остался доволен :) Спасибо всем за участие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aser 0 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба Ну что тут поделать, таковы особенности архитектур различных ПЛИС. Но я все равно остался доволен :) Спасибо всем за участие. Замените схему сравнения на вычитатель, должно ускорить. Можете попробовать запараллелить это дело. Но, думаю, все это не имеет какого-то смысла. Когда будете вставлять этот модуль в проект, это будет далеко не самая длинная цепь, а "Place & Route" убъет все Ваши извращения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба Замените схему сравнения на вычитатель, должно ускорить. если учесть что компараторы больше или равно/меньше делаются на вычитателе, то объясните за счет чего будет ускорение? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aser 0 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба если учесть что компараторы больше или равно/меньше делаются на вычитателе, то объясните за счет чего будет ускорение? :) Вычитание идет с младших разрядов. И задержка будет равна задержке на линии переноса (это аппаратная линия). Поэтому сигнал управления на мультиплексор будет выработан практически одновременно с окончанием суммирования. При схеме сравнение все наоборот, сравнение идет со старших разрядов. Поэтому в цепи управления будет задержка суммирования плюс довольно длинная задержка на схеме сравнения. Впрочем, не тяжело проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба При схеме сравнение все наоборот, сравнение идет со старших разрядов. Поэтому в цепи управления будет задержка суммирования плюс довольно длинная задержка на схеме сравнения. вот уже последние 6 лет я не видел ни одного плис синтезатора, который на выражение a < b генерил что то, отличное от вычитателя %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aser 0 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба вот уже последние 6 лет я не видел ни одного плис синтезатора, который на выражение a < b генерил что то, отличное от вычитателя %) Да? Ну не знаю, такого не смотрел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 марта, 2010 Опубликовано 20 марта, 2010 (изменено) · Жалоба Так ли уж нужно подавать на сумматор с обратной связью выход сумматора без обратной связи, когда компаратор переключит мультиплексор на сумматор без обратной связи (трудно высказать :) ? Все равно выход сумматора с обратной связью наружу не пойдет (по крайней мере, пока компаратор не переключит мультиплексор на него). Здесь получается как-то странновато: на одном конце компаратора - выход сумматора без обратной связи, на другом - тот же сигнал с добавкой от входа... Т.е. если этот входной сигнал не 0, компаратор обязательно переключится на сумматор с обратной связью. Если всего этого не нужно, то можно исключить мультиплексор из обратной связи. Ввести конвейер в схему сравнения. И достичь предельного быстродействия. Например, так: module QuartusAccumulator #(parameter WIDTH = 10) ( input RES_n, input CLK, input [WIDTH-1:0] A, input [WIDTH-1:0] B, input [WIDTH-1:0] C, output reg [WIDTH-1:0] MUX ); reg [WIDTH-1:0] AReg; reg [WIDTH-1:0] BReg; reg [WIDTH-1:0] CReg; reg [WIDTH-1:0] SumSAReg, SumSARegReg; reg [WIDTH-1:0] SumBCReg, SumBCRegReg; reg CmpReg; always @(negedge RES_n, posedge CLK) if (!RES_n) begin AReg = 0; BReg = 0; CReg = 0; SumSAReg = 0; SumSARegReg = 0; SumBCReg = 0; SumBCRegReg = 0; CmpReg = 0; MUX = 0; end else begin AReg <= A; BReg <= B; CReg <= C; SumSAReg <= SumSAReg + AReg; SumSARegReg <= SumSAReg; SumBCReg <= BReg + CReg; SumBCRegReg <= SumBCReg; CmpReg <= SumSAReg > SumBCReg; MUX <= CmpReg? SumSARegReg : SumBCRegReg; end endmodule Изменено 20 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 марта, 2010 Опубликовано 20 марта, 2010 · Жалоба Здесь получается как-то странновато ничего странного, стандартная дспешная фенечка, что то вроде подсчет среднего в сигнале с поправками на определенные условия %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 марта, 2010 Опубликовано 20 марта, 2010 (изменено) · Жалоба ничего странного, стандартная дспешная фенечка, что то вроде подсчет среднего в сигнале с поправками на определенные условия %) Автор точнее бы ответил... Часто заказчик сам не знает, что ему надо. На мой взгляд, больше похоже на учебное задание. К примеру, переполнения счетчиков уже не важны? Разрядность сумматора без обратной связи должна быть на 1 больше входных сигналов, а сумматора с обратной связью даже и не знаю, какая... То же касается и следующих за ними цепей. Изменено 20 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 марта, 2010 Опубликовано 21 марта, 2010 · Жалоба Вот, в качестве примера - схема из Tutorial по Quartus (файл tutorial_quartusii_intro_verilog.pdf, запрятан внутри каталога с установленным Quartus, так, что хрен найдешь...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 21 марта, 2010 Опубликовано 21 марта, 2010 · Жалоба Автор точнее бы ответил... Часто заказчик сам не знает, что ему надо. На мой взгляд, больше похоже на учебное задание. это ACS (Add-Compare-Select) - базовый элемент декодера Витерби. в зависимости от реализации этих блоков там может быть до фига и больше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 22 марта, 2010 Опубликовано 22 марта, 2010 · Жалоба это ACS (Add-Compare-Select) - базовый элемент декодера Витерби. в зависимости от реализации этих блоков там может быть до фига и больше Да, это он и есть. Так ли уж нужно подавать на сумматор с обратной связью выход сумматора без обратной связи, когда компаратор переключит мультиплексор на сумматор без обратной связи (трудно высказать smile.gif ? Все равно выход сумматора с обратной связью наружу не пойдет (по крайней мере, пока компаратор не переключит мультиплексор на него). Здесь получается как-то странновато: на одном конце компаратора - выход сумматора без обратной связи, на другом - тот же сигнал с добавкой от входа... Т.е. если этот входной сигнал не 0, компаратор обязательно переключится на сумматор с обратной связью. Если всего этого не нужно, то можно исключить мультиплексор из обратной связи. Ввести конвейер в схему сравнения. И достичь предельного быстродействия. Например, так: На самом деле, как правильно заметил vadimuzzz, в зависимости от конфигурационных параметров таких блоков может быть очень много, они выстраиваются параллельно, а верхний и нижний входы ACS-блока являются обратными связями, которые подаются с выходов других ACS-блоков, соответственно. Но я решил не вдаваться в подробности, и просто привел упрощенный вид блока, введя в него обратную связь на самого себя. des00 тоже прав, это чисто дспшная фенечка :) По поводу вычитателя вместо компаратора хочу высказать свое мнение. Дело в том, что компаратор действительно представляет собой вычитатель и по идее можно было описать схему вычитания, а старший знаковый разряд подавать на вход мультиплексора. Но при описании такой схемы на языке HDL и последующей компиляции проекта будут выдаваться предупреждения о том, что объявленный сигнал, который используется как результат вычитания, используется не полностью (такие предупреждения выдает Xilinx по крайней мере). P.S. У меня вот ещё такой вопрос созрел, чтобы темы не плодить, отпишусь в этом посте. Допустим есть несколько шин данных с разрядностью N, таким образом есть некий массив данных общей разрядностью L x N, который передается по шинам и далее записывается в ОЗУ параллельно. А вопрос вот какой, при описании на языках HDL такого объемного ОЗУ (чтобы задействовать внутренние блоки ОЗУ ПЛИС), как порекомендуете действовать, отводить под каждый элемент массива отдельное ОЗУ с разрядностью N, или описывать ОЗУ с разрядностью N x L и пусть синтезатор сам распределяет доступные объемы ОЗУ и это будет лучшим вариантом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться