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

Помогите оптимизировать схему

Супер! Удалось повысить производительность на 35 МГц. Спасибо!

 

А то на целых 35 Мгц у меня самого поднять частоту не получилось (получилось лишь на 18) :)

 

хмм, как-то маловато для 10 то бит. у меня под рукой ничего хилого нет, но создается ощущение что люты(в виде мультиплексора 2в1) на входе сумматора легли отдельно или у вас виртекс 4 самый медленный.

У вас там точно сумматор или сумматор-вычитатель? Technology mapper бы посмотреть %)

 

UPD и еще отчет о критическом пути тоже не помешает %)

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


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

хмм, как-то маловато для 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

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


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

У меня там сумматор-вычитатель.

 

Вот код "после":

 

А где петля обратной связи с выходного регистра на add0.

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


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

А где петля обратной связи с выходного регистра на add0.

 

Так обратная связь берется не с выходного регистра уже, а через мультиплексор заводится обратно на сумматор. После ретайминга можно было вообще выходной регистр убрать, а на выход dout сразу подать значение обратной связи с выхода мультиплексора mux_out. Иначе нарушается ход вычислений.

 

PS. В итоге после ретайминга по сравнению с исходной схемой, новая содержит на 1 регистр больше

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


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

Берем упрощенную до предела схему. Сумматор, на один вход приходит входной сигнал 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...

Я несколько раз проверил на бумаге. Попробуйте сами на досуге. Может быть, я ошибся...

Если все верно, то... сами знаете... Конвейер, братцы, не так прост.

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


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

PS. В итоге после ретайминга по сравнению с исходной схемой, новая содержит на 1 регистр больше

 

для меня ретайминг, это когда по выходу подряд регистров налепил и галочку в пакете выставил.

А все остальное - это ручной труд. Это как кому нравиться. Можно дробить аккумулятор (в соседней ветке это обсуждали), можно обойтись коромыслом с четными и нечетными отсчетами (все в ресурсы упирается)

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


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

Вот код "после":

 

Вот тайминг критического пути:

да, не подумал сразу. Для данной реализации это максимум.

 

Если все верно, то... сами знаете... Конвейер, братцы, не так прост.

да нет тут конвейера, поведение схем полностью эквивалентно, в цепи аккумулятора только один регистр.

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


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

Вот код "после":

Поставьте регистр после компаратора, а на компаратор подавайте add*_result_next, а уже с этого регистра на мультиплексор - увеличите частоту еще немного.

 

 

 

У меня, кстати, Ваш код не дает даже 18 Мгц преимущества на Cyclone III - видать, архитектура хилых дает свое. :)

 

 

 

да, не подумал сразу. Для данной реализации это максимум.

Ан, нет, не максимум - то, что описал выше даст еще 18 Мгц.  :)

По крайне мере, для Циклона. :)    

 

 

UPD: опечатался в числе.

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


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

да нет тут конвейера, поведение схем полностью эквивалентно, в цепи аккумулятора только один регистр.

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

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


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

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

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

 

Ваш вариант можно попытаться доработать, добавив кучу сигналов типа enable, но, мне кажется, что ничего хорошего не выйдет.  :)

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


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

Что мешает поставить регистры после сумматоров?

немного добавлю и поставить мультиплексор на выходе этих регистров?

Никто при этом не говорил, что оставлять выходной регистр нельзя.

Сумматор работает медленно, мультиплексор свои задержки добавляет. Куда ни ставь регистр, будет задержка: сумматор+мультиплексор(регистр), или мультиплексор+сумматор(регистр), или сумматор+мультиплексор+регистр.

В-общем - один регистр куда-то сунуть можно. Но не более. В какой-то схеме быстродействие будет чуть больше, чем в других.

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


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

Никто при этом не говорил, что оставлять выходной регистр нельзя.

 

Подразумивалось  :)

 

Нет, его, конечно, можно оставить, если это это позволяет логика дальшейших модулей, главное, чтобы ОС осталась такой же, как в первоначальном варианте, то есть то, что пойдет на вход, не должно проходить через 2 регистра.  

 

В-общем - один регистр куда-то сунуть можно. Но не более. В какой-то схеме быстродействие будет чуть больше, чем в других.

 

Ну, попереставляли, попереставляли, а хотя бы 18 Мгц (35 Мгц) да выудили.  :)

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


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

У меня, кстати, Ваш код не дает даже 18 Мгц преимущества на Cyclone III - видать, архитектура хилых дает свое. :)

на сыклоны он плохо ляжет, потому как лют в ЛЕ работает либо в нормальном либо в арифметическом режиме. У хилых не так %)

 

Ан, нет, не максимум - то, что описал выше даст еще 18 Мгц.  :)

да об этом как-то не подумал, но тут смотреть надо %)

 

Никто при этом не говорил, что оставлять выходной регистр нельзя.

des333 уже ответил %)

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


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

Согласен. Вроде, пришли к консенсусу.

А если принять во внимание еще и схему сравнения... то экспериментировать еще есть над чем.

 

на сыклоны он плохо ляжет, потому как лют в ЛЕ работает либо в нормальном либо в арифметическом режиме. У хилых не так %)

Заглянул в даташит на Cyclone-III, действительно, только 2 режима. А у ACEX было 4. То-то, я смотрю, в мой проект счетчика на Verilog Quartus так и норовит сунуть сумматор.

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


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

Ну, попереставляли, попереставляли, а хотя бы 18 Мгц (35 Мгц) да выудили.  :)

 

И это действительно радует. :)

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


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

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

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

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

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

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

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

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

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

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