¿Cómo restringir correctamente el reloj y el sincronizador generados en Altera Quartus?

2

En mi diseño Verilog tengo un reloj de tablero de 25Mhz del cual obtengo un reloj de 100Mhz. Procedente de un Pin externo, tengo un reloj asíncrono de 4.77 Mhz que debería controlar la lógica y sincronizarse antes (utilizando el reloj principal):

always @(posedge clk_100Mhz_i)
begin
    // Synchronizer chain... hopefully    
    clk4_del0 <= clk4_77_i; // SysClk from ext pin
    clk4_del1 <= clk4_del0;
    clk4_del2 <= clk4_del1;
end

// Used to clock internal regs
assign clock_4_77Mhz = clk4_del2;

// Sample
always @(posedge clock_4_77Mhz)
begin
    timerIdx <= timerIdx +1;
end

Lamentablemente recibo la siguiente advertencia:

Advertencia (332060): Se determinó que Nodo: X8255_top: x8255 | clk4_del2 es un reloj pero se encontró sin una asignación de reloj asociada ...

También recibo una advertencia sobre un reloj sin restricciones. Intenté usar lo que sugirió el analizador de tiempo y agregué la cuarta línea a mi .SDC:

# Constrain clock port clk_25MHz_i
create_clock -period "25.0 MHz" -name clk_25MHz [get_ports clk_25MHz_i]
create_clock -period "4.77 MHz" -name clk_4_77MHz [get_ports clk_4_77_i]
create_clock -name {X8255_top:x8255|clk4_del2} -period 210

sin éxito.

¿Qué estoy haciendo mal?

    
pregunta fhw72

1 respuesta

0

Probablemente, se debe a que clk4_del2 no se usa como un reloj (por ejemplo, conectado a una entrada de reloj de un DFF), pero como una señal intermedia ... incluso puede encontrar que se optimiza (en sus informes) ?) ya que es una tarea continua. A menos que use una primitiva (reloj de búfer tal vez) y le diga a la herramienta que no elimine el búfer, y por lo tanto el búfer contribuye al retraso de la ruta (y esto fuerza un "cambio de nombre"), no creo que se resuelva como pretende .

Alternativas, probablemente ya te hayas dado cuenta y solo estás preguntando porque quieres mantener el RTL como está, pero jic:

Si tuviera que reemplazar su proceso clk_4_77MHz cronometrado con clk4_del2 , debería encontrar que la restricción se resuelve correctamente ... pero, entonces, tiene la red colgante de clk_4_77_MHz (asumiendo que no se usa en ninguna parte otra cosa) y eso es algo feo.

Si te gusta tu clk_4_77MHz (es decir, es más descriptivo), elimina el clk4_del2 y reemplaza la asignación: clk4_del2 <= clk4_del1 con clk_4_77MHz <= clk4_del1 .

O eso, o simplemente deje todo como está y elimine la restricción para clk4_del2 , y su intención, y la interpretación de la intención de la herramienta, debe seguir siendo la misma.

    
respondido por el CapnJJ

Lea otras preguntas en las etiquetas