Introduzca el retraso en una sola señal de bit w.r.t. reloj de entrada

3

He visto esta pregunta y eliminé el " # .. "parte de mi código para introducir demora, ya que mi código finalmente se ejecutará en hardware.

De todos modos, estoy intentando con contadores y no puedo introducir el retardo requerido de n ciclos de reloj. Aquí está mi código:

'timescale 1ns / 1ps

module SyncDelay( clk_27,vsync,vsync_o);
 input clk_27;
 input wire vsync;
 output reg vsync_o;

 reg[2:0] cnt=0;

 always @ (clk_27)
 begin

    if(cnt > 3'd4)
    begin
        vsync_o = vsync;

    end
    else
    begin
        cnt = cnt + 1;
    end

 end //always

endmodule

Esto es lo que estoy obteniendo:

vsyncyvsync_otienenlosmismosvaloresentodaslasinstancias.Ensulugar,quieroquevsync_oseretraseconunretrasodenciclosdereloj.

EDIT:

Conelcódigo:

'timescale1ns/1psmoduleSyncDelay(clk_27,vsync,vsync_o);inputclk_27;inputwirevsync;outputregvsync_o;reg[2:0]cnt=0;always@(clk_27)beginif(cnt>3'd4)beginvsync_o=vsync;cnt=0;endelsebegincnt=cnt+1;endend//alwaysendmodule

mesale:

    
pregunta Saania

2 respuestas

3

Esa no es una forma correcta de agregar un retraso. Esta técnica conducirá a pulsos perdidos, o longitud de pulso incorrecta. Básicamente, aquí, solo estás sincronizando tu salida cada 4 ciclos.

Para hacer un retardo adecuado, necesita n chanclas, n es el número de ciclos de retardo que desea introducir. Haz que sea una matriz: reg[3:0] bits; . Ahora, en cada ciclo de reloj (posicionar / negar, como desee), configure la salida al valor del último bit: vsync_o <= bits[3]; y desplace toda la matriz, insertando el valor de entrada actual: bits <= {bits[2:0], vsync}; .

No necesitas (y no quieres) un contador. Lo que debe recordar es el estado de cada ciclo de reloj que está retrasando. Básicamente, esto es simplemente un registro de desplazamiento.

Editar: Bueno, esperaba que no fuera necesario, pero aquí está el código completo para un retraso de 5 ciclos (aunque no intenté compilarlo):

module SyncDelay( clk_27,vsync,vsync_o);
input clk_27;
input wire vsync;
output reg vsync_o;

reg[3:0] bits;

always @ (posedge clk_27)
begin
    vsync_o <= bits[3];
    bits <= {bits[2:0], vsync};
end //always

endmodule
    
respondido por el dim
0

cnt nunca se restablece a 0.

Agregaría una declaración para restablecerla justo después de que se asigne vsync_o (dentro del grupo de inicio / finalización)

    
respondido por el MikeP

Lea otras preguntas en las etiquetas