Dominando Latches D: Diseño, Operación y Diferencias Clave
Un flip-flop captura datos en su entrada en el flanco positivo o negativo de un reloj. Lo importante es que lo que ocurra con los datos después del flanco de reloj hasta el siguiente no se reflejará en la salida. Un latch, por otro lado, no captura en el flanco de reloj; en su lugar, la salida sigue a la entrada mientras el pin de habilitación está activo.
Diseño
En este ejemplo, construiremos un latch con tres entradas y una salida. La entrada d representa datos (0 o 1), rstn es reset activo-bajo y en es habilitación para hacer que el dato de entrada se enganche a la salida. Reset activo-bajo significa que el elemento se reinicia cuando esta entrada va a 0. El valor de la salida q está dictado por d, en y rstn.
module d_latch (
input d, // Pin de entrada de 1 bit para datos
input en, // Pin de entrada de 1 bit para habilitar el latch
input rstn, // Pin de entrada de 1 bit para reset activo-bajo
output reg q // Pin de salida de 1 bit para datos
);
// Este bloque always se dispara siempre que en/rstn/d cambien
// Si reset está activo, la salida será cero
// Mientras enable sea alto, la salida q sigue a la entrada d
always @ (en or rstn or d)
if (!rstn) q <= 0;
else if (en) q <= d;
endmodule
La lista de sensibilidad del bloque always contiene todas las señales necesarias para actualizar la salida. Este bloque se disparará cuando cualquiera de estas señales cambie. Además, q toma el valor de d solo cuando en es alto, por lo que es un latch positivo.
Esquema
Testbench
module tb_latch;
// Variables para conducir valores al diseño
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instanciar diseño y conectar puertos con señales TB
d_latch dl0 (
.d (d),
.en (en),
.rstn (rstn),
.q (q)
);
// Este bloque initial forma el estímulo para probar el diseño
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Inicializar variables del testbench
d <= 0;
en <= 0;
rstn <= 0;
// 2. Liberar reset
#10 rstn <= 1;
// 3. Cambiar d y enable aleatoriamente
for (i = 0; i < 5; i=i+1) begin
delay = $random;
delay2 = $random;
#(delay2) en <= ~en;
#(delay) d <= i;
end
end
endmodule
Para que el testbench active y desactive señales de forma más aleatoria, declaramos una variable reg llamada delay de 3 bits (valores 0-7). Esta variable retrasa la asignación de d y en para obtener diferentes patrones en cada iteración.
Salida
Registro de simulación
ncsim> run [0] en=0 d=0 q=0 [11] en=1 d=0 q=0 [18] en=0 d=0 q=0 [19] en=0 d=1 q=0 [20] en=1 d=1 q=1 [25] en=1 d=0 q=0 [27] en=0 d=0 q=0 [32] en=0 d=1 q=0 [33] en=1 d=1 q=1 [34] en=1 d=0 q=0 ncsim: *W,RNQUIE: La simulación ha finalizado.
Haga clic en la imagen para ampliarla.
Verilog
- Amplificador Emisor Común: Diseño, Medición y Técnicas de Realimentación
- Construye un Amplificador Diferencial de Alta Ganancia que Funciona como Op-Amp
- Seguidor de Voltaje de Precisión: Dominando la Realimentación del Op-Amp para Seguimiento Preciso de Señal
- Amplificador No Inversor: Construcción, Prueba y Control de Ganancia con Op-Amp
- Fundamentos de C#: Entrada y salida esenciales
- Dominando la Entrada y Salida en C++: Guía Práctica
- Dominando la entrada/salida en C: scanf() y printf() explicados
- Dominando flujos en C++: cout, cin, cerr, clog – Guía práctica
- Dominando Entrada y Salida en programación C
- Dominando E/S e importación de módulos en Python: Guía práctica
- Dominar Entrada y Salida en Java: Imprimir, Leer y Formatear Datos