Самый быстрый способ реагировать на внешний сигнал запуска - PullRequest
1 голос
/ 01 мая 2019

Внешний сигнал запуска отправляется на ПЛИС. Сигнал запуска должен приниматься только в том случае, если значения and1 и and2 также высоки во время получения запуска. Если запуск принят, должен быть создан импульс запуска длительностью 10 микросекунд. Цель состоит в том, чтобы попытаться минимизировать время, необходимое FPGA для принятия / отклонения этого внешнего сигнала запуска.

module trigger(
input CLK, 
input trigger,
input and1,
input and2,

output triggerOut, 
);

Первая попытка решения была следующей;

assign triggerOut = trigger & and1 & and2;

Время реакции быстрое, но я не думаю, что это позволяет реализовать длительность триггера в 10 микросекунд.

Текущее решение следующее:

always @(posedge CLK) begin

  if(trigger & and1 & and2)
    triggerOut <= 1;

end

Это решение позволяет добавить счетчик, который позволяет реализовать 10-микросекундный импульс запуска. Предостережение заключается в том, что теперь время реакции на внешний триггер привязано к частоте CLK. Время реакции может быть улучшено путем увеличения частоты CLK, но есть предел того, насколько высоким может быть CLK.

Другим возможным решением может быть чувствительность к изменяющемуся триггерному входу;

always @(posedge trigger) begin

  if(trigger & and1 & and2)
    triggerOut <= 1;

end

Я читал, что это может быть плохой практикой. Мне было непонятно, почему использование @ (posedge CLK) предпочтительнее @ (триггер posedge). Что определяет время реакции ПЛИС на чувствительность, такую ​​как @ (триггер постановки)? Я полагаю, что это все равно должно быть как-то связано с CLK - возможно, этот подход еще быстрее?

Существуют ли более эффективные подходы для улучшения времени реакции на вход триггера?

1 Ответ

0 голосов
/ 01 мая 2019

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

OTOH, для сигнала triggerOutput шириной 10us требуются синхронные часы для отсчета времени, но этот таймер при первом подходе будет запускаться асинхронным входом. Это, безусловно, создаст проблему кросс-доменного тактирования, и тривиальное решение (синхронизация с двумя триггерами) приведет к некоторой задержке, поэтому импульс 10us может не начинаться одновременно с тем, что триггер внутренне принят, и / или иметь ширину ровно 10us. , Чтобы избежать проблемы метастабильности с параметром triggerOutput, его можно использовать как сигнал асинхронного сброса для счетчика от 1 до 10.

Несмотря на это, этот модуль является реализацией асинхронного подхода к вашему детектору триггера и акцептору:

module detect_trigger (
  input wire clk,  // let's say it's 1 MHz (period = 1us)
  input wire trigger,
  input wire and1,
  input wire and2,
  output reg triggerOut
  );

  reg [3:0] cnt = 4'd0;
  initial triggerOut = 1'b0;
  always @* begin
    if (cnt >= 4'd11)
      triggerOut = 1'b0;
    else if (trigger && and1 && and2)
      triggerOut = 1'b1;
  end

  always @(posedge clk or negedge triggerOut) begin
    if (triggerOut == 1'b0)
      cnt <= 4'd0;
    else if (cnt < 4'd11)
      cnt <= cnt + 4'd1;
  end
endmodule

Модуль испытательного стенда может быть таким:

module tb;
  reg clk;
  reg trigger;
  reg and1, and2;
  wire triggerOut;

  detect_trigger uut (
    .clk(clk),
    .trigger(trigger),
    .and1(and1),
    .and2(and2),
    .triggerOut(triggerOut)
  );

  initial begin
    $dumpfile ("dump.vcd");
    $dumpvars(1, tb);
    clk = 1'b0;
    and1 = 1'b0;
    and2 = 1'b0;
    trigger = 1'b0;

    repeat (5) begin
      #3023;
      and1 = 1'b1;
      #2419;
      and2 = 1'b1;
      #1865;
      and1 = 1'b0;
      and2 = 1'b0;
    end
    $finish;
  end

  always begin
    clk = #500 ~clk;
  end

  always begin
    trigger = 1'b0;
    #1753;
    trigger = 1'b1;
    #2;
  end
endmodule

Результат этого стенда следующий:

Wave output for this test bench

Вы можете изменить и запустить вышеуказанный дизайн с EDA Playground здесь: https://www.edaplayground.com/x/3SGs

...