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