lunes, 20 de octubre de 2014

Contador con HDL

REGISTROS

Buen día gente, hoy describiremos hardware empleando el HDL de SystemVerilog, y crearemos registros síncronos y asíncronos.

Que es un registro.

Un registro es un CIRCUITO SECUENCIAL que permite almacenar grupos de bits; es un tipo de memoria de alta velocidad y poca capacidad, permite almacenar y acceder transitoriamente a valores muy usados o emplearlos para la configuración de banderas y configuraciones de un equipo.
Los registros están en la cumbre de la jerarquía de memorias y son la manera mas rápida de un sistema para almacenar datos. 
Según su propósito se clasifican en:
  • Registros de datos:                         Guardan números enteros.
  • Registros de memoria:                   Guardan de forma exclusiva direcciones de memoria.
  • Registros de propósito general:      Pueden guardar datos o direcciones.
  • Registros de coma flotante:            Guardan datos en coma flotante.
  • Registros constantes:                      Tienen valores creados por hardware de solo lectura.
  • Registros de propósito especifico: Guardan información sobre el estado del sistema.

Registro Síncrono.

Bien una vez dicho que es un registro solo definimos lo que es un registro síncrono como un registro que tiene solo una señal de sincronismo dominante generalmente llamada señal de reloj.
Esta señal de reloj permite que en sus flancos positivos o negativos (según se elija) ocurran eventos que definan el estado (el valor actual) del registro; esta clase de eventos podrían ser:
  • Resetear registro. (CLR)
  • Dato de carga al registro. (D)
  • Habilitar/deshabilitar la carga de datos al registro (Ena)
La Figura 1 muestra el símbolo de un registro tipo D y sus señales de control; un registro como este muestra señales síncronas y asíncronas (por lo tanto se dice que un registro es de naturaleza asíncrona). ¿que define a un registro como síncrono? Simplemente el hecho de que ninguna señal asíncrona (CLR, Ena) estará habilitada y solo se regirá el comportamiento del circuito por dos señales: la señal de reloj (el triangulo de la figura) y la entrada de datos (D).


Fig. 1 Registro de un bit y sus señales de control.
Asi que en cada flanco (positivo o negativo) de la señal de reloj, el registro aceptara el valor que sea leido de la señal de datos D y mostrara el valor almacenado en la salida Q.
Los comportamientos de Reset y Enable se tendrán que hacer todos en los tiempos de la señal de reloj y según un orden claro de como funcionaran cada uno de ellos (o mas bien dicho la prioridad de su aparición)

Descripción de Registro síncrono mediante SystemVerilog

Como se dijo anteriormente este circuito no tendrá mas conexiones que la señal de reloj y los datos a almacenar, pero conservara las señales de reset y enable todas ellas síncronas.
El código para realizar esto se muestra a continuación:

module registro
#(parameter BITS = 8)
(
   input  clk,
   input  reset,
   input  enable,
   input  [BITS-1:0]data,
   output [BITS-1:0]out
);

   logic  [BITS-1:0]registro;
 
   always_ff@(posedge clkbegin
       if(reset)       
          registro <= 0;
       else 
          if(enable) 
             registro <= data;
   end
 
   assign out = registro;
 

endmodule

a modo de breve explicación se detallan los siguientes puntos:

  • La variable registro como su nombre lo indica es el registro que almacenara los datos.
  • El proceso always_ff solo tiene en la lista sensible la señal de reloj, así que ella sera la que permita que existan eventos en el registro en los flancos positivos de reloj (posedge).
  • Las señales reset y enable fueron usados dentro del proceso always_ff pero no en la lista sensible, esto convierte a esta señales en señales dependientes de la señal de reloj y por lo tanto son señales síncronas. 
  • Las prioridades de señales o el orden en como se ejecutan dan la máxima prioridad a la señal de reset, esto por si se tuvieran activas tanto la señal de reset como de enable en el flanco positivo de reloj, tenga mayor precedencia la señal de reset y por lo tanto se desprecie la señal de enable.
  • La sentencia assign indica que la salida Q del registro tendrá siempre el valor almacenado en el registro, recuérdese que los modelos HDL son descripciones concurrentes asi que existen procesos paralelos(es decir, se pueden ejecutar diversos always o assign en paralelo).
Toda esta descripción es traducida gráficamente como el circuito de la Figura 2, donde se puede observar como las señales de reset y enable se han colocado como señales de control de multiplexores que a su vez controlan el dato que se deberá presentar en la señal de datos D.
Fig. 2 Registro sincrono: código, modelo RTL y reporte de recursos empleados. 

Registro asíncrono

Si se ha entendido lo que es un registro sincrono, el registro asíncrono no deberá presentar mas dificultadas que el saber que existirán señales que no serán gobernadas por la señal de reloj y que podrán modificar el estado del registro en el momento que lo deseen, despreciando la señal de reloj.
Un ejemplo claro de esto es la señal de reset que puede resetear el registro (colocar su valor a 0) en el momento que lo desee.

Descripción de registro asincrono mediante SystemVerilog

Si por obvias razones el registro sincrono solo contenía en la lista sensible del proceso always_ff la señal de reloj, el registro asíncrono contendrá no solo la señal de reloj como señal predominante sino que también puede contener una señal extra que no dependa directamente de la señal de reloj; así es como describimos el código siguiente: 
 
module registro
(
    input  clk,
    input  reset,
    input  enable,
    input  [7:0]data,
    output [7:0]out
);
   logic  [7:0]registro;
 
   always_ff@(posedge clk, posedge reset)
       if(reset)       registro <= 0;
       else if(enable) registro <= data;
 
   assign out = registro;
 
endmodule

La Figura 3 muestra la traducción gráfica del circuito que se ha descrito, observe que no existen mas los multiplexores y que las señales que no habían sido conectadas del registro ahora son empleadas, puesto que reset es una señal asíncrona y ahora se encuentra en la lista sensible del proceso always_ff, el flanco positivo de la señal de reset puede hacernos entrar al cuerpo del proceso always y revisar las condiciones y prioridades de las señales; enable (aunque no fue descrita en la lista sensible) ya no necesita mas un multiplexor puesto que las señales sensibles de reset y clk son empleadas y enable tiene la menor prioridad simplemente se conecta a su respectiva linea en el registro.

Fig. 3 Registro asíncrono: código HDL, modelo RTL y reporte de recursos empleados

No hay comentarios:

Publicar un comentario