module  FRONT_old (             
 input   iCLK,                  
 input   iIMPULS,              
 output  reg oFRONT 
);

reg flag;

always @(posedge iCLK)
  if (!flag && iIMPULS) 
    begin
      flag <= 1'b1; 
      oFRONT <= 1'b1;
    end   
  else 
      if (iIMPULS) 
         begin 
           flag <= 1'b1; 
           oFRONT <= 1'b0; 
         end
       else 
         begin  
           flag <= 1'b0; 
           oFRONT <= 1'b0; 
         end

endmodule 

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

//НТЦ МЕТРОТЕК
module  FRONT_metrotek(
input logic  iCLK,
 input logic iIMPULS,
 output logic oFRONT
);

logic d_delay;
always_ff @(posedge  iCLK)
 d_delay <= iIMPULS;

assign oFRONT = iIMPULS && !d_delay;

endmodule

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

module  FRONT_new (             
 input   iCLK,                  
 input   iIMPULS,             
 output  reg oFRONT
);

reg flag;

always @(posedge iCLK)
  if (iIMPULS & !flag) oFRONT<=1;
  else oFRONT<=0;
  
always @(negedge iCLK)   
  begin
    if (iIMPULS & oFRONT) flag<=1;
    if (!iIMPULS)flag<=0;
  end    

endmodule 

Цитата
Есть три модуля выделителя фронта:
Цитата
Долгое время все проекты собирались на первом модуле FRONT_old. Сигнал iIMPULS всегда  формировался (стробировался) из сигнала iCLK проблем не было. После заведения iIMPULS  снаружи ПЛИС (сигнал SL c МК для SPI)  oFRONT потерял стабильность.
Цитата
Второй модуль FRONT_metrotek(взят из интернета) выдает стабильно oFRONT но произвольной длительности, что  не подходит для дальнейшего его использования.
Цитата
Был написан третий модуль FRONT_new,  который выдает oFRONT стабильно с одной длительностью - какие могут быть в нём "подводные камни"?
ТЕСТ