module trig_with_delay ( input [7:0] Trg_Lv_UP, input [7:0] Trg_Lv_DOWN, input [7:0] DATA_IN_A, input [7:0] DATA_IN_B, input [7:0] Delay, // вход устанавливающий длительность задержки input sync_sourse, // 0/1 - канал А или В соответсвенно input Sync_OUT_WIN, // синхронизация по воду/выоду из окна, окно задается Trg_Lv_UP и Trg_Lv_DOWN input Start_Write, // старт записи input CLK_EN, // разрешение такта input Enable_Trig, // разрешение триггера, приходит от счетчика предыстории/послеистории input CLK, output reg first_event_reg, // условие для разрешения срабатывания триггера output reg last_event_reg, // собственно сам триггер output sync_state_out, // выведено для отладки output reg [7:0] SlCounter = Delay, // задержка output trig_out // выход триггера ); // данные для синхронизации, в зависимости от sync_sourse, 0/1 - канал А или В соответсвенно wire [7:0] DATA_SYNC = (sync_sourse == 0)? DATA_IN_A : DATA_IN_B; // условие триггера wire sync_state = (Trg_Lv_UP > DATA_IN_A) & (Trg_Lv_DOWN < DATA_IN_A)? Sync_OUT_WIN ^ 1 : Sync_OUT_WIN ^ 0; assign sync_state_out = sync_state; // для отладки assign trig_out = last_event_reg; // выход триггера assign EN_Trig = Start_Write & Enable_Trig; // разрешение триггера always @(posedge CLK) begin if(EN_Trig == 0) begin // триггер запрещен first_event_reg <= 0; last_event_reg <= 0; SlCounter <= Delay; end else begin // триггер разрешен if(first_event_reg == 0) begin // выбор события. Если первое еще не сработало работаем с ним. Иначе - со вторым. // работаем с первым событием if(sync_state == 0) begin // условие активно if(SlCounter == 0) begin // задержка закончена first_event_reg <= 1'b1; end else begin // задержка не закончена SlCounter <= SlCounter - 1; end end else begin // условие неактивно SlCounter <= Delay; end end else begin // работаем со вторым событием if((first_event_reg == 1'b1) && (sync_state == 1'b1)) begin last_event_reg <= 1'b1; end end end // end // endmodule