Flip flop sintetizable para FPGA

0

Habiendo jugado con Verilog por algún tiempo, decidí pasar a implementar diseños en Alltera CycloneIV FPGA usando la suite Quartus.

Comenzando con un simple flip flop en D, me enfrento al primer bloqueo de ruta.

Declaración de problema : se requiere la salida (Q) de un D-FF, siga la señal de entrada (como debería ser) y aquí va el código:

//----------------------------------------
//module D flip flip
//-----------------------------------------

module d(q_w,q0_w,d,c); 
output q_w,q0_w;
input c,d;

//wire c;
reg q,q0;
wire q_w,q0_w;
assign q_w=q;
assign q0_w=q0;

initial 
   begin
       q=1'b0; q0=1'b1;
   end
always @ (posedge c)
   begin 
     q<=d;
     q0<= ~d;
   end
endmodule

La señal de entrada 'd' también realiza una transición en el mismo borde positivo de una señal de reloj común ('c' para el módulo D-FF). Esto hace que el circuito no se comporte correctamente cuando la transición y las pruebas se realizan en el mismo borde del reloj. Además, he leído que es mejor atenerse a un borde del reloj en los diseños (como una buena práctica) y, por lo tanto, me abstengo de usar el borde negativo del reloj.

Después de haber encontrado el mismo problema al simular, utilicé un retraso para solucionar el problema

always @ (posedge c)
       begin 
         #2 q=d;
         q0= ~d;
       end

A pesar de buscar mucho, no puedo encontrar una manera de implementar la funcionalidad requerida en el hardware. Intenté agregar elementos de búfer antes de que la señal del reloj entre en el módulo D-FF pero en vano.

PS: Todavía no he quemado nada de esto en el FPGA. Mis temores están marcados por los resultados de Quartus Simulation.

He ajustado manualmente la entrada D en el punto para verificar el seguimiento del circuito

    
pregunta Prateek Sharma

2 respuestas

1

Su implementación de flip-flop es correcta.

Lo que apunta @duskwuff es que cuando implementó su forma de onda de prueba (c y d) tiene una transición al mismo tiempo que c. No es así como funcione lo que conduzca su flip-flop. La entrada se debe configurar antes del borde del reloj. Si la entrada está haciendo la transición en el borde del reloj, recuerde que mientras los bordes se ven cuadrados en el analizador lógico, en realidad el voltaje toma una cierta cantidad de tiempo para pasar de un estado a otro: su flip-flop puede leer alto baja, o un voltaje intermedio que realmente puede confundir su lógica .

Puedes ver de qué estoy hablando en tu captura de pantalla.

En el primer borde positivo del reloj, d transiciones de bajo a alto. Pero debido a que el nuevo valor de d (alto) no se configuró antes del borde del reloj, su flip-flop ve el valor original (bajo) y da como resultado q. Lo mismo sucede en el segundo borde positivo del reloj.

Sin embargo, entre el segundo y el tercer borde positivo del reloj, a 140 n, cambia d de bajo a alto. Entonces, cuando el reloj se vuelve positivo por tercera vez a 150 ns, ve el valor alto, y luego q sube a nivel alto aproximadamente 8 ns después.

La secuencia de prueba debe tener un aspecto similar al siguiente:

  1. establecer el reloj alto
  2. esperar 1/4 ciclo de reloj
  3. establece d en algún valor
  4. esperar 1/4 ciclo de reloj
  5. configurar reloj bajo
  6. esperar 1/2 ciclo de reloj
  7. establezca el reloj alto (ahora ha pasado un ciclo completo desde el último borde positivo)
  8. esperar 1/4 ciclo de reloj
  9. comprueba q
respondido por el Willis Blackburn
2

Primero: no use retrasos en las implementaciones. Los retrasos no se pueden sintetizar en hardware; deben estar confinados al código de testbench.

Segundo: la situación que estás probando, donde d cambia en el límite del reloj, es una infracción de tiempo. Fallar bajo estas circunstancias es perfectamente normal; virtualmente todos los flip-flops fallarán o exhibirán un comportamiento inconsistente cuando estén sujetos a esta entrada. Ajuste su banco de pruebas para mover las transiciones de d de modo que no coincidan con los bordes del reloj.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas