Periodo de reloj usando el código Verilog

0

Quiero calcular el período de tiempo utilizando el código Verilog. ¿Es esta la forma correcta de obtener un período de tiempo de reloj de una frecuencia particular? Por favor, sugiéreme un código Verilog mejor. El código no funciona.

He escrito este código de ejemplo:

module clk(reg gsclk, output reg time1,output time2,output gs_clk_period)

    always@(posedge gsclk)time1=$current_time;

    always@(negedge gsclk)time2=$current_time;

    always@(posedge gsclk)gs_clk_period = (time2 - time1)*2;

    $display("%clock %b",gs_clk_period);

endmodule

Tengo que usar el período de tiempo para sintetizar y quiero ejecutarme en un dispositivo real.

    
pregunta Manzer

3 respuestas

2

Verilog ofrece tres tareas del sistema relacionadas con el paso de tiempo de la simulación:

$time devuelve la hora actual como un entero de 64 bits, en unidades del paso de tiempo definido por la 'directiva de escala de tiempo'.

$stime devuelve el mismo valor que un entero de 32 bits.

$realtime devuelve el mismo valor que un número real.

Sin embargo, es probable que ninguna de estas directivas del sistema sea útil para la síntesis. Normalmente se implementarán mediante un código especial en el simulador que accede a las variables en el programa del simulador.

Para realizar un seguimiento del tiempo en un circuito real, debe comenzar con un reloj de entrada con una frecuencia conocida. Para una buena precisión, generaría esto con un circuito de oscilador de cristal, que estaría completamente fuera de su dispositivo si está trabajando en un FPGA.

Luego simplemente construye un contador para hacer un seguimiento de las marcas de tu reloj (nota código no probado):

module time_counter(input clk, input rst, output reg [31:0] ticks) 

    always @(posedge clk or posedge rst) begin
        if (rst) begin
            ticks <= 32'h00000000;
        end 
        else begin
            ticks <= ticks + 1;
        end
    end
endmodule

Hay un límite a la velocidad con la que puede funcionar un contador como este, y varios trucos para crear contadores más rápidos si es necesario.

Si necesita encontrar el período de una entrada con un período desconocido, necesita compararlo con un reloj con un período conocido. Conceptualmente, es más simple hacer que el reloj conocido sea mucho más rápido que el reloj desconocido y contar los tics del reloj conocido para cada período del reloj desconocido. Si eso no es posible, puede dividir el reloj desconocido por algún factor (por ejemplo, 16 o 128 o 1024) y contar los tics del reloj conocido para cada ciclo del divisor para resolver el período desconocido.

    
respondido por el The Photon
0

Para sintetizarlo, necesita un reloj de referencia que ya conoce el período real (por ejemplo, ref_clk ), luego puede estimar el período de cualquier otro reloj.

Necesitará un contador (por ejemplo, gs_cnt ) que se incremente en gsclk . Deje que el contador se ejecute para ref_cnt número de ref_clk ciclos. El período de gsclk se puede estimar como ref_period*ref_cnt/gs_cnt .

Es una buena idea evitar que el contador retroceda a 0 mientras aumenta. Esto también le permite saber que el gsclk debe medirse rápidamente en la ventana ref_cnt .

    
respondido por el Greg
0

Su código asume que el reloj tiene un ciclo de trabajo del 50%. En su lugar, debe muestrear dos veces en un bloque always :

module clk(reg gsclk, output reg time1,output time2,output gs_clk_period)
time rising_edge;

    always @(posedge gsclk)
    begin
        rising_edge = $time;
        @(posedge gsclk)
            gs_clk_period = $time - rising_edge;
    end

endmodule
    
respondido por el Harpreet

Lea otras preguntas en las etiquetas