Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

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

  1. Amplificador Emisor Común: Diseño, Medición y Técnicas de Realimentación
  2. Construye un Amplificador Diferencial de Alta Ganancia que Funciona como Op-Amp
  3. Seguidor de Voltaje de Precisión: Dominando la Realimentación del Op-Amp para Seguimiento Preciso de Señal
  4. Amplificador No Inversor: Construcción, Prueba y Control de Ganancia con Op-Amp
  5. Fundamentos de C#: Entrada y salida esenciales
  6. Dominando la Entrada y Salida en C++: Guía Práctica
  7. Dominando la entrada/salida en C: scanf() y printf() explicados
  8. Dominando flujos en C++: cout, cin, cerr, clog – Guía práctica
  9. Dominando Entrada y Salida en programación C
  10. Dominando E/S e importación de módulos en Python: Guía práctica
  11. Dominar Entrada y Salida en Java: Imprimir, Leer y Formatear Datos