Introduzca retrasos de valor alternativo para síntesis en hardware

0

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.

    
pregunta Saania

2 respuestas

1

De la otra pregunta, ya tiene una forma de retrasar la señal entre 1 y 4 ciclos de reloj:

reg[3:0] bits;

always @ (posedge clk_27)
begin
    vsync_o <= bits[3]; //this was in the original code but actually makes it 5 cycles! But whatever.
    bits <= {bits[2:0], vsync};
end

Por lo tanto, puede modificarlo fácilmente para que salgan dos señales, una con 4 ciclos de retraso y la otra con 2 ciclos de retraso (sugerencia: si el bit 3 tiene 4 ciclos de retraso, que es 2 ciclos).

Ahora tiene dos señales: una con 4 ciclos de retraso y otra con dos ciclos de retraso. Todo lo que se necesita es una forma de seleccionar cuál es cuál. La palabra "seleccionar" implica que necesita un multiplicador - 2: 1 de hecho (dos señales de entrada, una de salida).

Eso significa que también necesitas algo para conducir la línea de selección. Dado que es 2: 1, esta es solo una señal de control de 1 bit que debe alternar cada vez que haya un pulso. ¿Qué sabes que puede cambiar? Un flip-flop. Para usted necesita un flip-flop que alterne cada vez que haya un pulso en Vsync.

La siguiente pregunta es, ¿cómo detectas un pulso en Vsync? Bueno, ves si hay un borde ascendente (o un borde descendente, o ambos). Para eso necesitas un detector de flanco ascendente. La estructura es esencialmente:

reg delay;
always @ (posedge clock) begin
    delay <= in;
end
wire risingedge = delay && !in;
wire fallingedge = !delay && in;
wire bothedges = delay != in;

Entonces necesita la señal, más la señal retrasada por un ciclo de reloj. Tiene vsync , y su registro bits tiene la señal retrasada por un ciclo de reloj, por lo que ya tiene todas las señales que necesita para construir un detector de borde.

reg whichDelay;
always @ (posedge clock or posedge reset) beign
    if (reset) begin
        whichDelay <= 1'b1; //Start with a delay of 2 because on the first rising edge we will toggle.
    end else if (vsync && !bits[0]) begin
        whichDelay <= !whichDelay; //Toggle on each vsync input
    end
end

assign vsync_o = whichDelay ? bits[1] : bits[3];

Y ahí lo tienes.

    
respondido por el Tom Carpenter
0

Sí, hay un método mejor. Debe escribir su VHDL en el nivel de puerta. Use un mux 2: 1 para enrutar su señal a través de dos elementos de retardo diferentes.

Use simultáneamente un contador para hacer un seguimiento de la primera y segunda subida de vsync. Debe enviar su señal al pin del selector del mux.

    
respondido por el Ehsan

Lea otras preguntas en las etiquetas