Mi pregunta aquí es con referencia a esta pregunta formulada previamente . Actualmente, puedo generar retrasos para cada señal según lo desee.
A continuación, quiero generar diferentes retrasos para los bordes ascendentes alternativos de vsync
.
Ejemplo:
- Si es el primer flanco ascendente de
vsync
, genere un retardo igual a 4 ciclos de reloj en la salida (es decir,vsync_o
). - Si es el segundo flanco ascendente de
vsync
, genere un retardo igual a 2 ciclos clk en la salida (es decir,vsync_o
).
Por lo tanto, los retrasos que quiero en la salida deberían alternar entre 4 ciclos de reloj y 2 ciclos de reloj.
No puedo averiguar cómo hacer esto. Actualmente estoy inicializando un contador que no se reinicia (por lo que puedo calcular el número de pulsos vsync) ... pero esto finalmente se saturará. ¿Hay algún método mejor o me estoy perdiendo algo?
He escrito el siguiente código. ¿Causará esto algún problema que pueda evitarse de otra manera?
'timescale 1ns / 1ps
module Sync_Delay( clk_27, vsync, hsync,
vsync_o, hsync_o );
input clk_27;
input wire vsync;
input wire hsync;
output reg vsync_o;
output reg hsync_o;
reg[20:0] v_bits;
reg[2:0] h_bits;
reg cnt = 0;
always @ (posedge vsync)
begin
cnt = !cnt;
end
always @ (posedge clk_27)
begin
if (cnt == 0)
begin
vsync_o <= vsync;
hsync_o <= hsync;
end
else
begin
vsync_o <= v_bits[20];
v_bits <= {v_bits[19:0], vsync};
hsync_o <= h_bits[2];
h_bits <= {h_bits[1:0], hsync};
end
end
endmodule
Noté una diferencia en el ancho de pulso entre la señal de entrada y salida, lo cual no es deseable.