¿Es posible crear un flip-flop JK funcional usando la descripción del nivel de puerta en Verilog?

0

Estoy intentando crear un flip flop JK funcional usando la descripción del nivel de puerta en verilog. Aunque el diseño se compila y simula con éxito, las salidas a la FF son siempre desconocidas.

Tenga en cuenta que el diseño es un diseño modificado de 'SR-Latch with enable' (que se sabe que funciona correctamente) con las salidas vinculadas a las entradas.

module JK_FlipFlop(input clk, J, K, output Q, Q_not);
    wire    wl0, wl1;

    nand    g0 (wl0, clk, J, Q_not),
            g1 (wl1, clk, K, Q),
            g2 (Q, wl0, Q_not),
            g3 (Q_not, wl1, Q);
endmodule

También he intentado otra implementación de los Flip-flops JK usando la descripción de nivel de puerta y el resultado es siempre el mismo; con las salidas desconocidas.

El banco de pruebas utilizado se muestra a continuación:

module test_JKFF;
   reg   clk;
   reg   J;
   reg   K;   
   wire  Q;
   wire  Q_not;   
   // Instantiate the Unit Under Test (UUT)
   initial begin
   // Initialize Inputs
       J = 0;
       K = 0;
       fork
       #5 K = 1;
       #15 J = 1;
       #15 K = 0;
       #25 J = 1;
       #25 K = 1;
       #50 J = 0;
       #50 K = 0;
       #60 K = 1;
       #70 J = 1;
       #70 K = 0;
       #80 K = 1;
       clk = 0;
       join
      // Wait 100 ns for global reset to finish
       #100;
    end

    JK_FlipFlop UUT(clk, J, K, Q, Q_not);

    always #5 clk=!clk;

endmodule

Por lo tanto, cualquier información que alguien pueda proporcionar en relación con esta pregunta sería muy apreciada.

Gracias

    
pregunta aLoHa

3 respuestas

1

Bueno, eso ciertamente no es lo que yo llamaría un JKFF. Normalmente reservo ese término para un verdadero dispositivo maestro-esclavo activado por flanco. Con su circuito, cuando J , K y clk son altos, las salidas simplemente oscilarán tan rápido como lo permita el simulador. (En realidad, es probable que solo te diga que no se puede encontrar un estado estable).

No hay una combinación de entradas que forzará su circuito a un estado conocido. La solución habitual para esto es convertir g2 y g3 en puertas de 3 entradas. Etiquete la entrada adicional en g2 como set_l (entrada de configuración directa activa baja) y la entrada adicional en g3 como reset_l . Estos podrán forzar el estado de Q y Q_not cuando se afirmen en un nivel bajo, independientemente del estado de las otras entradas.

    
respondido por el Dave Tweed
0

Con respecto a la pregunta planteada, es decir, "¿Es posible crear un JK-flip flop funcional usando la descripción del nivel de puerta en Verilog?" , la respuesta es "Sí" !!

Se puede lograr usando una descripción a nivel de puerta de un flip flop disparado por borde tipo D con reinicio como lo indica @DaveTweed. Esto garantiza que Q y Q_not se establezcan en un valor, en lugar de tener estados desconocidos, antes de recibir un estímulo.

Vea a continuación el ejemplo completo del módulo:

module DTFF_reset(output Q, Q_not, input D, clk, reset);
    wire    wl0, wl1, wl2, wl3;

    nand    g0 (wl0, wl1, wl3),
            g1 (wl1, clk, wl0, reset),
            g2 (wl2, clk, wl1, wl3),
            g3 (wl3, D, wl2, reset),
            g4 (Q, wl1, Q_not),
            g5 (Q_not, wl2, Q, reset);
endmodule


module JK_FF_reset(output Q, input J, K, clk, reset);
    wire    K_not, qnot, wl0, wl1, wl2;

    // instantiate gates
    not     g0 (K_not, K);

    and     g1 (wl0, J, qnot),
            g2 (wl1, K_not, Q);

    or      g3 (wl2, wl0, wl1);
    // instantiate D-Flip-flop module
    DTFF_reset D0 (q, qnot, wl2, clk, reset);
endmodule
    
respondido por el aLoHa
-1

Cuando alguien explica cómo funciona un Flip-Flop (por ejemplo, construido a partir de dos puertas NAND o dos NOR) comienza con: "Para que no supongamos que esta salida es BAJA".

Inevitable está la pregunta: "¿Cómo se inicia?", momento en el que el ruido de la fuente y otros factores se mencionan para explicar que entrará en uno de dos estados.

Pero en la simulación no hay ruido de suministro de 'otros factores', por lo que de alguna manera hay que poner el sistema en un estado estable.

Esto hace lo mismo:

initial
begin
  J=1'b0; 
  K=1'b0;
  // System is undefined
  // Force a state 
  force Q = 1'b1;
  #1 release Q;

end
    
respondido por el Oldfart

Lea otras preguntas en las etiquetas