¿Cuál es el conjunto en D FF?

1

Estoy intentando implementar un contador de 3 bits utilizando compuertas básicas (AND, OR, XOR, NOT, etc.) alrededor de 3 flip-flops tipo D. La entrada es una señal de incremento que cuando se establece en 1 permitirá que el contador aumente en 1. Hay 3 salidas count (0), count (1) y count (2) donde count (0) es el lsb .

Pero no estoy seguro de cómo puedo manejar el conjunto en flip-flops tipo D. He ilustrado lo siguiente, pero puede encontrar que hay un puerto configurado en DFF. Entonces, ¿cómo puedo configurar set en verilog ? No estoy seguro de que este significado se restablece? Si es así, ¿qué pasa si el conjunto es 1, significa reinicio negativo? o reinicio positivo?

¿Cómo modifico la regla anterior (la entrada es una señal de incremento que cuando se establece en 1 permitirá que el contador se incremente en 1)? ¿Lo estoy interpretando bien o mal?

ACTUALIZACIÓN:

¿Es esto lo mismo?

always @ (posedge clk or negedge reset )  
if(set) 
    begin
      Q<=1'b1;  
    end

ACTUALIZACIÓN:

   wire q0;                                      
   wire q1;
   wire q1_i = (q0 ^ q1);                        
   wire q2;
   wire q2_i = (q2 ^ (q0 & q1));


   dar u_dar1 ( ~q0 , clk , reset_n, q0);        
   dar u_dar2 ( q1_i , clk , reset_n, q1);       
   dar u_dar3 ( q2_i , clk , reset_n, q2);       

   wire [2:0] rere = {q2,q1,q0}; 

   module dar  (
                   data  , // Data Input
                   clk    , // Clock Input
                   reset , // Reset input 
                   q         // Q output
                   );
   input data, clk, reset ;
   output q;
   reg q;
   always @ ( posedge clk or negedge reset)
           if (~reset) begin
             q <= 1'b0;
             end  else begin
               q <= data;
               end

   endmodule 
    
pregunta Carter

4 respuestas

3

El set-Reset-flip-flop no se usa a menudo, la sintaxis tiende a parecer "incorrecta" a aquellos que no están acostumbrados a verla. En realidad, puede tener 3 señales sensibles al borde en la lista de sensibilidad: el restablecimiento activo bajo tiene prioridad.

always @(posedge clk or negedge reset or posedge set ) begin
  if (~reset) begin
    Q<=1'b0;  
  end
  else if (set) begin
    Q<=1'b1;  
  end
  else begin
    Q <= D;
  end
end

Para un contador que se incrementará en 1 cuando esté habilitado, no hay d = need for set_reset_flip-flops.

Una versión limpia de RTL podría ser:

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
   Q <= 'b0;
  end
  else begin
    if (increment) begin
      Q <= Q + 1'b1;
    end
  end
end

Donde increment es una señal síncrona. Esto tiene 3 flip-flops Q que se alimentan de un medio sumador con un solo bit 1 como el otro operando. Solo necesitas un medio sumador para incrementar en 1.

    
respondido por el pre_randomize
4

SET fuerza la salida (Q) alta y la salida inversa baja. CLR "borra" el flip-flop, lo que significa que la salida es forzada baja y la salida inversa alta. Las entradas SET y CLR son asíncronas al reloj, lo que significa que funcionan en cualquier momento, no solo en el borde del reloj como lo hace la entrada D.

    
respondido por el Olin Lathrop
3

Establecer y borrar son asíncronos en un D-flipflop. Anulan las entradas de las puertas de salida de conexión cruzada, por lo que, dependiendo de si utiliza puertas NAND o puertas NOR, las opciones AND y OR Set y Clr con las entradas de estas puertas.

    
respondido por el Joris Groosman
1

Algunos flip flops solo pueden cambiar de estado cuando la entrada del reloj cambia de estado. Algunos cambian de estado en respuesta a una entrada de reloj, pero tienen una entrada adicional, llamada "reinicio asíncrono", que puede forzarlos a bajar, independientemente de lo que haga el reloj. Algunos tienen una entrada, llamada "conjunto asíncrono", que puede obligarlos a ir alto, independientemente de lo que haga el reloj.

En un flop con capacidades genuinas de configuración / reinicio asíncrono, la activación de la entrada de "conjunto asíncrono" cuando el pin de "reinicio asíncrono" incondicionalmente elevará la salida sin importar lo que esté haciendo el reloj o lo haya hecho anteriormente (incluso si se produce un error en el reloj había dejado la salida en un estado metaestable ["confundido"]). Del mismo modo, la activación del "reinicio asíncrono" hará que la salida sea incondicionalmente baja. Es importante destacar que en los casos en los que tener un interruptor de entrada limpio antes que el otro produciría el mismo resultado que si lo hubiera cambiado limpiamente después, hacer que cambien simultáneamente producirá el mismo resultado , y la salida nunca cambiará de estado < em> incluso momentáneamente excepto en los casos en que se especifique para hacerlo.

Es posible usar flip flops "simples", o flips flops async-reset junto con lógica combinatoria para "sintetizar" un flip flop async-set-reset cuya descripción de comportamiento VHDL o Verilog coincidirá con la de uno real, Las flip flops sintéticas asíncronas-restablecidas con asíncrono pero casi siempre difieren de las reales en formas que pueden ser importantes, pero que esos idiomas realmente no pueden expresar. Por ejemplo, en el siguiente circuito (la mitad derecha representa el conjunto asíncrono sintetizado / reinicio del flip flop, y la mitad izquierda puede generar señales de prueba en la simulación)

simular este circuito : esquema creado usando CircuitLab

la salida solo cambiará en respuesta a un estímulo de entrada adecuado (haciendo clic en el esquema y seleccionando "simular / análisis transitorio" debería generar un gráfico de tiempo), pero se observará que hay tres flip flops que cambiarán estado en respuesta a un estímulo de entrada que debería hacer que la salida cambie de estado, pero la llegada simultánea de dos señales que deberían hacer que la salida cambie de estado puede, de hecho, hacer que el estado de salida cambie de estado dos veces rápidamente (regresando erróneamente a su estado anterior). estado).

    
respondido por el supercat

Lea otras preguntas en las etiquetas