Flip flop con carga/establecimiento, reinicio, clk y entrada

No estoy buscando una descripción de lenguaje de hardware del flip flop, sino el nivel de puerta lógica para implementar.

En verilog, el equivalente que estoy buscando es

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

Miré en: http://reviseomatic.org/help/e-flip-flop/4013%20D-Type%20Flip%20Flop.php y http://www.csee.umbc.edu/~squire/images /dff.jpg

el problema con la implementación anterior es que después de configurar un valor en Q (D = 0, Q = 0, carga = 0) con carga (establecido en la imagen) = 0, luego cuando configuro carga carga alta = 1 en el siguiente clk ciclo, obtengo (D = x, Q = 1, carga = 1). En otras palabras, cambiar la carga de verdadero a falso cambiará el valor de Q, pero quiero que Q mantenga su valor anterior.

¿Qué es un flip flop que mantendría su valor en Q después de que se haya configurado y la habilitación esté configurada en alto?

Respuestas (1)

Ha estado buscando componentes incorrectos: el flip-flop de tipo D se usa para muestrear la entrada D en cada ciclo de reloj, pero desea usar la loadseñal para habilitar el muestreo. Tenga en cuenta que la señal setque desea utilizar loadtiene una funcionalidad diferente: hace que la salida sea alta (independientemente del valor de D).

Lo que está buscando es D Flip-Flop con Enable. Hay dos enfoques simples para agregar esta funcionalidad a un D-FF normal.

Comentario:

Agregar un MUX que es controlado por Enableseñal. En cada flanco del reloj, el flop muestreará el valor nuevo o el valor anterior (lo que equivale a mantener un valor anterior).

ingrese la descripción de la imagen aquí

Activación del reloj:

En lugar de multiplexar la entrada al flip-flop, simplemente puede desactivar el reloj cuando no desee probar un nuevo valor. Este enfoque se emplea ampliamente para reducir el consumo de energía (sin reloj -> sin actividad -> sin consumo de energía activa).

Como señaló @Supercat en los comentarios, la sincronización del reloj es la técnica más sofisticada que requiere un poco más de experiencia porque presenta retrasos adicionales en la ruta del reloj.

ingrese la descripción de la imagen aquí

Un flop con una habilitación es diferente en algunos aspectos muy importantes de un flop cuyo reloj está controlado externamente. Entre otras cosas, los tiempos de configuración/retención/propagación mínima/propagación máxima en un flop con una habilitación se especifican claramente desde el flanco ascendente del reloj; si el reloj está bloqueado fuera del flop, una incertidumbre de 5 ns en el tiempo de propagación de la puerta podría convertir un flop cuyos valores serían, por ejemplo, 4/1/2/6 (que si se ejecuta, por ejemplo, a 40 Mhz (período de 25 ns) podría adaptarse a los tiempos de propagación lógica de el latch anterior de 0-15ns) en uno cuyos valores serían 4/6/2/11 (requiriendo tiempos de propagación lógica...
...estar en el rango de 4ns-10ns. De importancia crítica es que cuando se usa el flop con habilitar, no hay un requisito de tiempo mínimo para la lógica entre los flop, pero cuando se activa externamente el reloj, sí lo hay. Otro tema a considerar es que una señal de habilitación generalmente solo tendrá que cumplir con los tiempos de configuración/retención en relación con un borde de reloj activo, mientras que un reloj controlado por separado deberá evitar tener un borde descendente de la señal de habilitación cerca (antes o después). !) un borde de reloj activo. La sincronización del reloj es más segura en dispositivos con reloj de 2 fases, pero últimamente no he visto que se usen mucho los relojes de 2 fases.
@supercat, de hecho, la sincronización del reloj presenta factores adicionales que deben tenerse en cuenta, pero estos factores se conocen y existen técnicas sólidas para manejarlos. Por ejemplo, una de las optimizaciones disponibles en Synopsys Design Compiler es convertir automáticamente las habilitaciones de FF en sincronización de reloj.
Mi impresión fue que en muchos dispositivos FPGA, la mayoría de la lógica no tiene un tiempo de propagación mínimo especificado, excepto que si dos flop están controlados por el mismo bus de reloj designado , el tiempo de propagación de una salida de un flop, más cualquier lógica a través de la cual fluya, cumplirá con el requisito de tiempo de espera de otro flop. Si los fracasos no pasan por un bus de reloj designado, los tiempos de propagación pueden variar arbitrariamente. Peor aún, a menos que uno fuerce la implementación física de un nodo de circuito (usar un flop flop forzará esto), es posible que la lógica alimentada por el nodo tenga un retraso de propagación negativo en relación con él.
Ciertamente, algunos dispositivos incluyen circuitos dentro de sus buses de reloj para permitir que se activen de forma segura, pero no conozco ninguno que permita que la salida de un flop cuyo reloj se genere usando "lógica aleatoria" sea bloqueado de forma segura por cualquier otro flop controlado por el mismo borde del reloj maestro. ¿Algunos dispositivos lo permiten?
@supercat, no tengo mucha experiencia con FPGA, pero si no recuerdo mal, hay opciones muy limitadas para la activación del reloj disponibles allí. Ciertamente, el diseño debe cumplir con el tiempo, pero las técnicas para garantizar que lo haga están fuera del alcance de esta pregunta. Ni siquiera estoy seguro de que OP sepa qué es STA.