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

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

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

 

А Вы попробовали поставить регистр после компаратора, как я выше предлагал?

 

 

Мне просто интересно, какой результат будет у хилых, а под рукой ISE нет.  :)

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


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

А Вы попробовали поставить регистр после компаратора, как я выше предлагал?

 

 

Мне просто интересно, какой результат будет у хилых, а под рукой 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)

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


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

Rundll:

 

Да, правильно.

 

А для Циклона, наоборот, частота увеличивается. :)

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


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

Rundll:

 

Да, правильно.

 

А для Циклона, наоборот, частота увеличивается. :)

 

Ну что тут поделать, таковы особенности архитектур различных ПЛИС. Но я все равно остался доволен :) Спасибо всем за участие.

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


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

Ну что тут поделать, таковы особенности архитектур различных ПЛИС. Но я все равно остался доволен :) Спасибо всем за участие.

Замените схему сравнения на вычитатель, должно ускорить.

Можете попробовать запараллелить это дело.

Но, думаю, все это не имеет какого-то смысла. Когда будете вставлять этот модуль в проект, это будет далеко не самая длинная цепь, а "Place & Route" убъет все Ваши извращения.

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


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

Замените схему сравнения на вычитатель, должно ускорить.

если учесть что компараторы больше или равно/меньше делаются на вычитателе, то объясните за счет чего будет ускорение? :)

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


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

если учесть что компараторы больше или равно/меньше делаются на вычитателе, то объясните за счет чего будет ускорение? :)

Вычитание идет с младших разрядов. И задержка будет равна задержке на линии переноса (это аппаратная линия).

Поэтому сигнал управления на мультиплексор будет выработан практически одновременно с окончанием суммирования.

 

При схеме сравнение все наоборот, сравнение идет со старших разрядов. Поэтому в цепи управления будет задержка суммирования плюс довольно длинная задержка на схеме сравнения.

 

Впрочем, не тяжело проверить.

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


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

При схеме сравнение все наоборот, сравнение идет со старших разрядов. Поэтому в цепи управления будет задержка суммирования плюс довольно длинная задержка на схеме сравнения.

вот уже последние 6 лет я не видел ни одного плис синтезатора, который на выражение a < b генерил что то, отличное от вычитателя %)

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


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

вот уже последние 6 лет я не видел ни одного плис синтезатора, который на выражение a < b генерил что то, отличное от вычитателя %)

Да? Ну не знаю, такого не смотрел.

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


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

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

Здесь получается как-то странновато: на одном конце компаратора - выход сумматора без обратной связи, на другом - тот же сигнал с добавкой от входа... Т.е. если этот входной сигнал не 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

post-10362-1269095430_thumb.jpg

Изменено пользователем ViKo

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


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

Здесь получается как-то странновато

ничего странного, стандартная дспешная фенечка, что то вроде подсчет среднего в сигнале с поправками на определенные условия %)

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


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

ничего странного, стандартная дспешная фенечка, что то вроде подсчет среднего в сигнале с поправками на определенные условия %)

Автор точнее бы ответил...

Часто заказчик сам не знает, что ему надо.

На мой взгляд, больше похоже на учебное задание.

К примеру, переполнения счетчиков уже не важны? Разрядность сумматора без обратной связи должна быть на 1 больше входных сигналов, а сумматора с обратной связью даже и не знаю, какая... То же касается и следующих за ними цепей.

Изменено пользователем ViKo

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


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

Вот, в качестве примера - схема из Tutorial по Quartus (файл tutorial_quartusii_intro_verilog.pdf, запрятан внутри каталога с установленным Quartus, так, что хрен найдешь...)

post-10362-1269170247_thumb.jpg

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


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

Автор точнее бы ответил...

Часто заказчик сам не знает, что ему надо.

На мой взгляд, больше похоже на учебное задание.

это ACS (Add-Compare-Select) - базовый элемент декодера Витерби. в зависимости от реализации этих блоков там может быть до фига и больше

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


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

это ACS (Add-Compare-Select) - базовый элемент декодера Витерби. в зависимости от реализации этих блоков там может быть до фига и больше

 

Да, это он и есть.

 

Так ли уж нужно подавать на сумматор с обратной связью выход сумматора без обратной связи, когда компаратор переключит мультиплексор на сумматор без обратной связи (трудно высказать smile.gif ? Все равно выход сумматора с обратной связью наружу не пойдет (по крайней мере, пока компаратор не переключит мультиплексор на него).

Здесь получается как-то странновато: на одном конце компаратора - выход сумматора без обратной связи, на другом - тот же сигнал с добавкой от входа... Т.е. если этот входной сигнал не 0, компаратор обязательно переключится на сумматор с обратной связью.

Если всего этого не нужно, то можно исключить мультиплексор из обратной связи. Ввести конвейер в схему сравнения. И достичь предельного быстродействия. Например, так:

 

На самом деле, как правильно заметил vadimuzzz, в зависимости от конфигурационных параметров таких блоков может быть очень много, они выстраиваются параллельно, а верхний и нижний входы ACS-блока являются обратными связями, которые подаются с выходов других ACS-блоков, соответственно. Но я решил не вдаваться в подробности, и просто привел упрощенный вид блока, введя в него обратную связь на самого себя. des00 тоже прав, это чисто дспшная фенечка :)

 

По поводу вычитателя вместо компаратора хочу высказать свое мнение. Дело в том, что компаратор действительно представляет собой вычитатель и по идее можно было описать схему вычитания, а старший знаковый разряд подавать на вход мультиплексора. Но при описании такой схемы на языке HDL и последующей компиляции проекта будут выдаваться предупреждения о том, что объявленный сигнал, который используется как результат вычитания, используется не полностью (такие предупреждения выдает Xilinx по крайней мере).

 

P.S. У меня вот ещё такой вопрос созрел, чтобы темы не плодить, отпишусь в этом посте. Допустим есть несколько шин данных с разрядностью N, таким образом есть некий массив данных общей разрядностью L x N, который передается по шинам и далее записывается в ОЗУ параллельно. А вопрос вот какой, при описании на языках HDL такого объемного ОЗУ (чтобы задействовать внутренние блоки ОЗУ ПЛИС), как порекомендуете действовать, отводить под каждый элемент массива отдельное ОЗУ с разрядностью N, или описывать ОЗУ с разрядностью N x L и пусть синтезатор сам распределяет доступные объемы ОЗУ и это будет лучшим вариантом?

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


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

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

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

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

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

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

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

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

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

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