des00 25 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Супер! Удалось повысить производительность на 35 МГц. Спасибо! А то на целых 35 Мгц у меня самого поднять частоту не получилось (получилось лишь на 18) :) хмм, как-то маловато для 10 то бит. у меня под рукой ничего хилого нет, но создается ощущение что люты(в виде мультиплексора 2в1) на входе сумматора легли отдельно или у вас виртекс 4 самый медленный. У вас там точно сумматор или сумматор-вычитатель? Technology mapper бы посмотреть %) UPD и еще отчет о критическом пути тоже не помешает %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба хмм, как-то маловато для 10 то бит. у меня под рукой ничего хилого нет, но создается ощущение что люты(в виде мультиплексора 2в1) на входе сумматора легли отдельно или у вас виртекс 4 самый медленный. У вас там точно сумматор или сумматор-вычитатель? Technology mapper бы посмотреть %) UPD и еще отчет о критическом пути тоже не помешает %) У меня там сумматор-вычитатель. Вот код "после": library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity acs_test is generic( DATA_WIDTH: integer:=10 ); port( clk: in std_logic; rst: in std_logic; din0: in signed(DATA_WIDTH-1 downto 0); din1: in signed(DATA_WIDTH-1 downto 0); din2: in signed(DATA_WIDTH-1 downto 0); dout: out signed(DATA_WIDTH-1 downto 0) ); end acs_test; architecture register_transfer_level of acs_test is signal din0_reg, din0_next: signed(DATA_WIDTH-1 downto 0); signal din1_reg, din1_next: signed(DATA_WIDTH-1 downto 0); signal din2_reg, din2_next: signed(DATA_WIDTH-1 downto 0); signal add0_result_reg, add0_result_next: signed(DATA_WIDTH-1 downto 0); signal add1_result_reg, add1_result_next: signed(DATA_WIDTH-1 downto 0); signal mux_out: signed(DATA_WIDTH-1 downto 0); signal dout_reg, dout_next: signed(DATA_WIDTH-1 downto 0); begin 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'); 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; end if; end process; din0_next<=din0; din1_next<=din1; din2_next<=din2; mux_out<=add0_result_reg when (add0_result_reg > add1_result_reg) else add1_result_reg; add0_result_next<=din0_reg + mux_out; add1_result_next<=din1_reg + din2_reg; dout_next<=mux_out; dout<=dout_reg; end register_transfer_level; Вот тайминг критического пути: Timing constraint: Default period analysis for Clock 'clk' Clock period: 3.689ns (frequency: 271.076MHz) Total number of paths / destination ports: 2985 / 30 ------------------------------------------------------------------------- Delay: 3.689ns (Levels of Logic = 17) Source: add0_result_reg_0 (FF) Destination: add0_result_reg_9 (FF) Source Clock: clk rising Destination Clock: clk rising Data Path: add0_result_reg_0 to add0_result_reg_9 Gate Net Cell:in->out fanout Delay Delay Logical Name (Net Name) ---------------------------------------- ------------ FDC:C->Q 4 0.471 0.805 add0_result_reg_0 (add0_result_reg_0) LUT4:I0->O 1 0.094 0.000 Mcompar_mux_out_cmp_gt0000_lut<0> (Mcompar_mux_out_cmp_gt0000_lut<0>) MUXCY:S->O 1 0.372 0.000 Mcompar_mux_out_cmp_gt0000_cy<0> (Mcompar_mux_out_cmp_gt0000_cy<0>) MUXCY:CI->O 1 0.026 0.000 Mcompar_mux_out_cmp_gt0000_cy<1> (Mcompar_mux_out_cmp_gt0000_cy<1>) MUXCY:CI->O 1 0.026 0.000 Mcompar_mux_out_cmp_gt0000_cy<2> (Mcompar_mux_out_cmp_gt0000_cy<2>) MUXCY:CI->O 1 0.026 0.000 Mcompar_mux_out_cmp_gt0000_cy<3> (Mcompar_mux_out_cmp_gt0000_cy<3>) MUXCY:CI->O 20 0.254 0.584 Mcompar_mux_out_cmp_gt0000_cy<4> (Mcompar_mux_out_cmp_gt0000_cy<4>) LUT4:I3->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 1 0.357 0.000 Madd_add0_result_next_xor<9> (add0_result_next<9>) FDC:D -0.018 add0_result_reg_9 ---------------------------------------- Total 3.689ns (2.300ns logic, 1.389ns route) (62.3% logic, 37.7% route) ПЛИС xc5vlx50-1-ff324 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба У меня там сумматор-вычитатель. Вот код "после": А где петля обратной связи с выходного регистра на add0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба А где петля обратной связи с выходного регистра на add0. Так обратная связь берется не с выходного регистра уже, а через мультиплексор заводится обратно на сумматор. После ретайминга можно было вообще выходной регистр убрать, а на выход dout сразу подать значение обратной связи с выхода мультиплексора mux_out. Иначе нарушается ход вычислений. PS. В итоге после ретайминга по сравнению с исходной схемой, новая содержит на 1 регистр больше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Берем упрощенную до предела схему. Сумматор, на один вход приходит входной сигнал In, на другой результат с этого же сумматора. Если бы после сумматора не было регистра, то при подаче на вход чего-нибудь сумматор тут же "насчитался" до насыщения, перевалил через переполнение, в-общем, загенерил на своей максимальной частоте. К счастью, после сумматора стоит регистр Rg1, и сигнал на втором входе сумматора появляется через такт. Подаем на вход последовательность 0, 1, 2, 3, 0, 0, 0... Смотрим, что имеем на выходе (регистра Rg1, хотя можно было бы и на выходе сумматора): In 0 1 2 3 0 ... Sum 0 1 3 6 6 ... Rg1(Out) 0 0 1 3 6 6 ... А теперь вводим еще один регистр после Rg1, и подаем на вход сумматора (и на выход) уже с Rg2. Что имеем для той же входной последовательности: In 0 1 2 3 0 ... Sum 0 1 2 4 2 4 2 Rg1 0 0 1 2 4 2 4 Rg2(Out) 0 0 0 1 2 4 2 4 2 4 2 ... Что это? Загенерил наш сумматор!: 2, 4, 2, 4... Я несколько раз проверил на бумаге. Попробуйте сами на досуге. Может быть, я ошибся... Если все верно, то... сами знаете... Конвейер, братцы, не так прост. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба PS. В итоге после ретайминга по сравнению с исходной схемой, новая содержит на 1 регистр больше для меня ретайминг, это когда по выходу подряд регистров налепил и галочку в пакете выставил. А все остальное - это ручной труд. Это как кому нравиться. Можно дробить аккумулятор (в соседней ветке это обсуждали), можно обойтись коромыслом с четными и нечетными отсчетами (все в ресурсы упирается) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Вот код "после": Вот тайминг критического пути: да, не подумал сразу. Для данной реализации это максимум. Если все верно, то... сами знаете... Конвейер, братцы, не так прост. да нет тут конвейера, поведение схем полностью эквивалентно, в цепи аккумулятора только один регистр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Вот код "после": Поставьте регистр после компаратора, а на компаратор подавайте add*_result_next, а уже с этого регистра на мультиплексор - увеличите частоту еще немного. У меня, кстати, Ваш код не дает даже 18 Мгц преимущества на Cyclone III - видать, архитектура хилых дает свое. :) да, не подумал сразу. Для данной реализации это максимум. Ан, нет, не максимум - то, что описал выше даст еще 18 Мгц. :) По крайне мере, для Циклона. :) UPD: опечатался в числе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба да нет тут конвейера, поведение схем полностью эквивалентно, в цепи аккумулятора только один регистр. В начале разговора речь шла именно о конвейере. И Вы предлагали ввести регистр после сумматора. Получили бы именно то, что я описал. Взгляните внимательнее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба В начале разговора речь шла именно о конвейере. И Вы предлагали ввести регистр после сумматора. Получили бы именно то, что я описал. Взгляните внимательнее... Нет, предлагали перенести регистры, а не добавить еще. :) А если и добавлять, как, например, описал я выше, то так, чтобы задержка у схемы осталась такой же. Ваш вариант можно попытаться доработать, добавив кучу сигналов типа enable, но, мне кажется, что ничего хорошего не выйдет. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Что мешает поставить регистры после сумматоров? немного добавлю и поставить мультиплексор на выходе этих регистров? Никто при этом не говорил, что оставлять выходной регистр нельзя. Сумматор работает медленно, мультиплексор свои задержки добавляет. Куда ни ставь регистр, будет задержка: сумматор+мультиплексор(регистр), или мультиплексор+сумматор(регистр), или сумматор+мультиплексор+регистр. В-общем - один регистр куда-то сунуть можно. Но не более. В какой-то схеме быстродействие будет чуть больше, чем в других. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Никто при этом не говорил, что оставлять выходной регистр нельзя. Подразумивалось :) Нет, его, конечно, можно оставить, если это это позволяет логика дальшейших модулей, главное, чтобы ОС осталась такой же, как в первоначальном варианте, то есть то, что пойдет на вход, не должно проходить через 2 регистра. В-общем - один регистр куда-то сунуть можно. Но не более. В какой-то схеме быстродействие будет чуть больше, чем в других. Ну, попереставляли, попереставляли, а хотя бы 18 Мгц (35 Мгц) да выудили. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба У меня, кстати, Ваш код не дает даже 18 Мгц преимущества на Cyclone III - видать, архитектура хилых дает свое. :) на сыклоны он плохо ляжет, потому как лют в ЛЕ работает либо в нормальном либо в арифметическом режиме. У хилых не так %) Ан, нет, не максимум - то, что описал выше даст еще 18 Мгц. :) да об этом как-то не подумал, но тут смотреть надо %) Никто при этом не говорил, что оставлять выходной регистр нельзя. des333 уже ответил %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Согласен. Вроде, пришли к консенсусу. А если принять во внимание еще и схему сравнения... то экспериментировать еще есть над чем. на сыклоны он плохо ляжет, потому как лют в ЛЕ работает либо в нормальном либо в арифметическом режиме. У хилых не так %) Заглянул в даташит на Cyclone-III, действительно, только 2 режима. А у ACEX было 4. То-то, я смотрю, в мой проект счетчика на Verilog Quartus так и норовит сунуть сумматор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 19 марта, 2010 Опубликовано 19 марта, 2010 · Жалоба Ну, попереставляли, попереставляли, а хотя бы 18 Мгц (35 Мгц) да выудили. :) И это действительно радует. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться