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
ТЕСТ
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 стабильно с одной длительностью - какие могут быть в нём "подводные камни"?