Jump to content

    
Sign in to follow this  
shamrel

Управляемый делитель тактовой частоты(клоков)

Recommended Posts

По поводу DDR триггера. Я не знаю как это реализовать. С ПЛИС работаю недавно.

Реализовывать не надо, нужно использовать из схемотехнической библиотекив взять готовый DDR триггер

Share this post


Link to post
Share on other sites

Мне кажется, без минимальной схемы - тут никуда. Я имею ввиду функциональной.

Если у вас частота на АЦП неизменна(50 МГц) - какой клок вам нужен на CIC? По идее данные заходят на CIC с частотой работы (дискретизации) АЦП. А вот выходят из CIC - на меньшей частоте. Но обычно это реализуется не другой частотой, а значимостью сигнала. То есть на входе - каждый такт значимый, а на выходе есть некий отдельный признак значимых данных. Который возникает раз в 1/2/4/8 и т.д. тактов.

Share this post


Link to post
Share on other sites
Мне кажется, без минимальной схемы - тут никуда. Я имею ввиду функциональной.

Если у вас частота на АЦП неизменна(50 МГц) - какой клок вам нужен на CIC? По идее данные заходят на CIC с частотой работы (дискретизации) АЦП. А вот выходят из CIC - на меньшей частоте. Но обычно это реализуется не другой частотой, а значимостью сигнала. То есть на входе - каждый такт значимый, а на выходе есть некий отдельный признак значимых данных. Который возникает раз в 1/2/4/8 и т.д. тактов.

Все верно. Все в соответствии с вашей идеей. :) Только термин "значимость" слышу первый раз.

CIC состоит из двух частей, первая часть работает на частоте DAC (50 МГц) . Вторая часть должна работать на пониженной частоте. Разработчик, который вел проект до меня, сделал это через тактирование. Клоки для второй части CIC брались от делителя (на счетчике) от клоков DAC. Проект был реализован в редакторе Schematic и без всяких sdc. Проект успешно (!) прошел тестирования и пошел в серию. Пока не понадобилось внести изменение в функционал и перевести на другую элементную базу. Небольшие изменения вносимые в произвольную часть схемы нарушали работоспособность. Когда добавил .sdc и прогнал в TimeQuest получил сплошные слаки. Исходная прошивка перестала быть работоспособной. Было принято решение переписать на Verilog.

Что еще добавить? Пожалуй, то что я с ПЛИС до этого серьезно не работал.

Возвращаясь к теме. Dmitriyspb предложил идею, которую сейчас прорабатываю. Первая и вторая часть тактируется одной, системной частотой, а понижение частоты происходит посредствам "пропускания" тактов. Типа:

 

always @(posedge clk)

....

if(sample)...

 

где clk -- клоки высокочастотные (200МГц), а sample -- разрешение.

 

Share this post


Link to post
Share on other sites
CIC состоит из двух частей, первая часть работает на частоте DAC (50 МГц) . Вторая часть должна работать на пониженной частоте. Разработчик, который вел проект до меня, сделал это через тактирование. Клоки для

  always_ff @(posedge iclk) begin
    cnt <= cnt + 1'b1;
    //
    cic_comb__ival <= get_decim_factor(ibw, cnt);
    cic_comb__idat <= cic_acc__odat;
  end

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------

  generate
    genvar i;
    for (i = 0; i < 2; i++) begin : cic_array_inst
      cic_acc_array
      #(
        .pDAT_W ( cDAT_W      ) ,
        .pNUM   ( cRX_CIC_NUM )
      )
      cic_acc
      (
        .iclk    ( iclk    ) ,
        .ireset  ( ireset  ) ,
        .iclkena ( iclkena ) ,
        //
        .ival    ( 1'b1              ) ,
        .idat    ( cic_acc__idat [i] ) ,
        .oval    (                   ) ,
        .odat    ( cic_acc__odat [i] )
      );

      cic_comb_array
      #(
        .pDAT_W ( cDAT_W      ) ,
        .pNUM   ( cRX_CIC_NUM )
      )
      cic_comb
      (
        .iclk    ( iclk    ) ,
        .ireset  ( ireset  ) ,
        .iclkena ( iclkena ) ,
        //
        .ival    ( cic_comb__ival     ) ,
        .idat    ( cic_comb__idat [i] ) ,
        .oval    ( cic_comb__oval [i] ) ,
        .odat    ( cic_comb__odat [i] )
      );
    end
  endgenerate
..................
  //
  // decimate 1/2/4/8/16/32
  function logic get_decim_factor(input bit [3 : 0] bw, input bit[4 : 0] cnt);
    get_decim_factor = 1'b1;
    case (bw)
      0       : get_decim_factor = 1'b1;
      1       : get_decim_factor = &cnt[0 : 0];
      2       : get_decim_factor = &cnt[1 : 0];
      3       : get_decim_factor = &cnt[2 : 0];
      4       : get_decim_factor = &cnt[3 : 0];
      5       : get_decim_factor = &cnt[4 : 0];
      default : get_decim_factor = 1'b1;
    endcase
  endfunction

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this