Use una máquina de estados y un contador grande. En un estado, espere a que la entrada cambie. Cuando cambie la entrada, configure el contador en un número grande, actualice la salida y cambie al estado de retardo. En el estado de retraso, decrementar el contador. Cuando llegue a cero, vuelva a la espera del estado de entrada.
Editar: no voy a escribir tu código por ti, pero aquí hay una plantilla para una máquina de estado con la que puedes jugar:
localparam [1:0]
STATE_IDLE = 2'd0,
STATE_1 = 2'd1,
STATE_2 = 2'd2;
reg [1:0] state_reg = STATE_IDLE, state_next;
reg [16:0] count_reg = 0, count_next;
always @* begin
state_next = STATE_IDLE;
count_next = count_reg;
case (state_reg)
STATE_IDLE: begin
// idle state
if (condition) begin
count_next = some_value;
state_next = STATE_1;
end else begin
state_next = STATE_IDLE;
end
end
STATE_1: begin
// some state
count_next = count_reg - 1;
if (count_reg == 0) begin
state_next = STATE_2;
end else begin
state_next = STATE_1;
end
end
STATE_2: begin
// another state
if (some_condition) begin
state_next = STATE_IDLE;
end else begin
state_next = STATE_2;
end
end
endcase
end
always @(posedge clk) begin
if (rst) begin
state_reg <= STATE_IDLE;
count_reg <= 0;
end else begin
state_reg <= state_next;
count_reg <= count_next;
end
end
Aquí hay una manera de hacer esto sin una máquina de estados explícita:
reg [32:0] counter = 0;
always @(posedge clk) begin
if (rst) begin
counter <= 0;
out <= 0;
end else if (counter > 0) begin
counter <= counter - 1;
end else begin
out <= in;
if (out != in) begin
counter <= some_delay_value;
end
end
end