Verilog Práctico

Capítulo 20. Registros

18 de marzo de 2023

En el capítulo 7 estudiamos los flip-flop tipo D. Vimos que los flip-flops son la unidad básica de almacenamiento; un flip-flop almacena un bit de información. 


En términos sencillos, un registro es un grupo de flip-flops. Cuando unimos un número x de  flip-flops decimos que tenemos un registro de tamaño x


Los registros se utilizan para almacenar datos, por ejemplo el estado actual de una Máquina de Estado Finito (FSM) o como puerto de E/S cuando se utilizan como interfaz de comunicaciones serie tal como SPI, I2C…


A continuación veremos cuatro ejemplos de cómo modelar registros en Verilog, para luego pasar a describir los registros de desplazamiento.

1.1. Registro sencillo de 4 bits

Esquema

El dato se introduce de forma paralela en los pines D0 a D3 mediante un dip switch. Unos ledes nos ayudan a visualizar el dato seleccionado. La salida Q la vemos reflejada en los ledes 4 a 7 donde el LED7 es el menos significativo. 

Código Verilog 

Archivo .pcf 

Este tipo de registros no es muy útil en la práctica, ya que la salida se actualiza con cada flanco de subida de la señal de reloj y no almacena el dato más allá de un ciclo de reloj. 

1.2. Registro de 4 bits con carga paralela


En el siguiente ejemplo vamos a introducir una mejora al registro anterior. Añadiremos un multiplexor 2-1 en cada entrada D de los flip-flop individuales. El multiplexor nos permite seleccionar el dato que  introducimos en el flip-flop, entre d_in y Q, de manera que  en reposo  el registro  mantiene el dato actual y al pulsar load cargamos un nuevo dato. 

Utilizamos el mismo montaje que en el ejemplo 1. Seleccionamos el dato con un dip switch y lo cargamos con el pulsador  sw1 de la Alhambra FPGA. 

Código Verilog 

Archivo .pcf 

Lo subimos a la Alhambra FPGA y vemos que ahora la salida mantiene su valor, el registro almacena el dato que hemos puesto en la entrada y permanece así hasta que pulsamos el botón de load, momento en el cual se actualiza de nuevo la salida. 

1.3. Registro de 4 bit con carga y reset asíncrono


Con el mismo circuito que en el ejemplo anterior, vamos a añadir un pulsador de reset asíncrono para poner las salidas a cero sin importar la señal de reloj.

Esquema


 El pulsador de reset lo implementamos en el sw2 de la Alhambra.

Código Verilog 

Archivo .pcf 

Subimos el código a la Alhambra FPGA y comprobamos que con el pulsador de load se muestra el dato seleccionado con el dip switch y al pulsar reset las salidas se ponen a cero. 

1.4. Registro de 4 bit con carga, reset asíncrono y set síncrono


Para terminar con los registros, en este último ejemplo vamos a modelar un registro con reset asíncrono y set síncrono activo a nivel bajo. El pulsador set, pone todas las salidas a 1 si está pulsado  durante el flanco de subida del reloj. 

Esquema

La señal de set la introducimos en pin D13 con un pulsador externo. Al ser una señal activa a nivel bajo, conectamos el pulsador a GND y en la entrada D13 conectamos una resistencia pull-up de 1K2. 

Código Verilog

archivo .pcf 

2. Registros de desplazamiento


Los registros de desplazamiento o Shift Registers, se utilizan ampliamente en protocolos de comunicación para transmitir datos en serie, utilizando un sola línea de comunicación y disminuyendo así el número de cables necesarios.

También se utilizan para hacer operaciones matemáticas, tales como multiplicar y dividir.

2.1. Registro de desplazamiento de 4 bits


Para empezar vamos a modelar un registro de desplazamiento sencillo, de 4 bits, con desplazamiento hacia la derecha.

Con el pulsador sw1 introducimos los datos en serie. El dato aparece en el bit más significativo Q[3] que se corresponde con el LED4 y se va desplazando hacia la derecha por los ledes LED5, LED6 y LED7 de la Alhambra FPGA.

Para ver mejor el funcionamiento del registro, he creado una señal de reloj de 1 Hz que será la que aplicaremos en la entrada de los flip-flop.


Código Verilog

Archivo .pcf

Para describir un registro con desplazamiento a la izquierda, sólo hay que cambiar el segundo bloque always por el que se muestra a continuación: 

También se puede escribir de la siguiente forma: 

El ejemplo que acabamos de ver tiene el problema de que está siempre funcionando; el registro está continuamente desplazando los bits con cada flanco de la señal de reloj.

2.2. Registro de desplazamiento de 4 bits con carga paralela y reset.


Vamos a añadir un pulsador de load para cargar un dato de forma paralela en los flip-flop individuales. Mantenemos también la entrada serial_in para introducir datos en serie.

Con un pulsador de reset asíncrono hacemos la salida 0 sin importar la señal de reloj. 

Esquema


Para introducir los datos en serie utilizamos el sw1. Con el sw2 reseteamos la salida.

La opción de load la implementamos con un pulsador externo conectado en el pin D13.

El dato paralelo se selecciona con un dip switch y lo introducimos en los pines D0 a D3. 

Código Verilog 

archivo .pcf 

2.3. Registro de desplazamiento universal


Un registro de desplazamiento universal, agrupa todas las funcionalidades típicas de los registros de desplazamiento, tales como: desplazamiento a derecha e izquierda, carga paralela, reset, set y  entrada serie por el bit más -y menos-  significativo.

Para seleccionar el modo de funcionamiento empleamos dos entradas  sel_0 y sel_1 de acuerdo con la siguiente tabla. 

Esquema


Vamos a modelar un registro universal de 8 bits.

Con los pulsadores sw1 y sw2 implementamos las entradas serie LSB_in y MSB_in.

La función de reset la realizamos con un pulsador conectado en el pin D13.

Con un dip switch doble, seleccionamos el modo de funcionamiento.

La entrada de datos la realizamos en los pines D0 a D7.

La salida la mostraremos en los ledes de la Alhambra FPGA.

Código Verilog 

Archivo .pcf 

Descargas

Puedes bajar el código Verilog de los ejemplos vistos anteriormente en el siguiente enlace.