VHDL

15 entradas

VHDL es un lenguaje de definición de circuitos. V de Very High Speed Integrated Circuit y HDL de Hardware Definition Language. Es decir, no es un lenguaje de programación, sino de definición. Mediante VHDL se definen las interfaces con circuitos, así como su comportamiento interno.

Poco a poco se pueden reutilizar componentes previamente hechos. También la comunidad comparte diseños, llamados cores, con los que puedes reutilizarlos, modificarlos, etc. Esta escalabilidad se puede seguir, el único límite será la complejidad que puede alcanzar el diseño.

Humildemente aquí iré dejando apuntes relacionados con VHDL, mientras que me voy reciclando y poniendo al día, con la mente en las FPGAs.. 😉

VHDL ROM generada con variables

VHDL: ROM hecha con generate y variables

Jugando y jugando con VHDL, que llegamos a encontrar una sentencia llamada generate. Con esta generate podemos generar, en pocas líneas, circuitos más grandes que repiten sus componentes. A su vez también tenemos variables, que podemos usar en estos generates. Con esto junto, reutilizando la ROM anterior, que podemos generar una ROM para nuestras simulaciones de esta forma..

VHDL memoria de sólo lectura ROM

VHDL: memoria de sólo lectura ROM

Y aquí otro code-kata, ahora con una memoria de sólo lectura, de las llamadas ROM. Estas memorias simplemente tienen unos datos internamente grabados que pueden ser consultados accediento a direcciones de memoria. Para este code-kata sólo hay 4 palabras de 64 bits. Es decir un vector de 4 palabras, o una matriz de 4×64 bits, como prefieras verlo. En la entrada recibe 2 pines con las 4 direcciones posibles de palabra.

VHDL register file 16x64 simulando R3

VHDL: un register file de 16×64 bits, simulando una operación de suma en ensamblador

Hoy traigo otro experimento algo más largo de lo normal, otro code-kata para la serie de posts sobre VHDL. Este code-kata es sobre lo que se llama un register file, que simplemente es un circuito compuesto por registros sencillos. En este caso son registros de 64 bits con precarga, y unos decodificadores para apuntar a uno y otro. En concreto, se trata de un register file de 16 registros, y dos decodificadores de 4×16 con entrada de habilitación, para elegir uno de los 16 registros al escribir o leer los datos. Los register file son conjuntos de registros que se utilizan comunmente en los microprocesadores para varias tareas. Por ejemplo, se pueden usar como almacén de datos, de direcciones, contadores, acumuladores, etc.. En esta construcción del circuito, se simula el uso como almacén de datos, para simular el uso en la operación de ensamblador siguiente:

VHDL registro multifunción con carga desplazamiento y rotación

VHDL: registro multifunción con carga, reseteo, desplazamiento y rotación

Otro code-kata a traer vengo de nuevo continuando con el post anterior sobre registros. Los registros se usan para varias tareas como almacenamiento de valores, direccionar a la memoria, el contador de programa, códigos de operación, lo que haga falta.. así que añadiendo funcionalidades al registro simple del post anterior, llegamos al registro multifunción. Es decir, los registros multifunción son como los simples, pero añaden más señales de entrada, para hacer operaciones simples con el dato que les llega, valga la redundancia. Por ejemplo las señales y operaciones pueden ser:

VHDL registro sencillo de 8 bits

VHDL: registro sencillo de 8 bits

Traigo de nuevo otro code-kata, ahora se trata de un registro sencillo. Los registros son circuitos sencillos, en donde se depositan ciertos valores de un dado número de bits, al son del tic tac del reloj. Se usan para direccionar la memoria, llevar la cuenta de dónde está un programa ejecutándose, almacenar un valor, y un largo etcétera. Es decir, es un circuito sencillo en donde simplemente se le deja poner un valor de entrada, que a la vez se puede resetear.

VHDL el tic tac del reloj

VHDL: el tic tac de un reloj a 100 MHzs

Sigo diseñando sencillos circuitos digitales en VHDL. Así que aquí estoy de nuevo con otro code-kata, ahora simulando en el banco de pruebas, el tic tac de un reloj interno que muchos circuitos electrónicos tienen dentro. Es decir, muchas veces tendremos que desencadenar acciones en circuitos al son del tic tac de un reloj o varios. Para simular este tic tac que tendremos que generar estas señales 10101010101.. cambiando de 0 a 1, y de 1 a 0, cada cierto tiempo simulando así una velocidad en Hercios. Por ejemplo, los microprocesadores tienen internamente una señal de reloj, que actualmente suele variar del orden de los 2000-3000 MHzs. En las placas de desarrollo FPGAs podemos tener un reloj de 50-100 MHzs. Así sucesivamente, mediante señales de reloj, podremos disparar acciones y movimientos de los bits de un lado a otro, de un circuito a otro, de un componente a otro. De esta forma es cómo se orquestan realmente las acciones internas de muchos procesamientos digitales..

VHDL unidad aritmetico lógica

VHDL: diseñando una unidad aritmético lógica

Aquí dejo otro code-kata en VHDL, esta vez de una ALU básica con 8 modos de funcionamiento: suma, resta, multiplicación, exponente a 2, complemento a 2, and, or y not. ALU son las siglas de Arithmetic Logic Unit. Se trata de un componente básico de los procesadores. Resumiendo, es un circuito que recibe unas entradas y saca unas señales de salida, destinado a hacer operaciones aritméticas o lógicas como pueden ser la suma, resta, multiplicación, and, or, etcétera. En esta ALU tenemos 3 entradas: 2 de ellas son los números, y la tercera entrada es el modo de funcionamiento (la operación que queremos que haga). En las salidas le he puesto 3 salidas: 1 es el resultado básico para la mayoría de estas operaciones, 1 resultado de multiplicación que es un vector de bits más largo, y una salida de estado que aunque no se en éste código usa la idea es dar una señal de éxito 0 o de error 1.

VHDL sumador completo de 4 bits haciendo port map

VHDL: uniendo circuitos, un sumador completo de 4 bits

Sigo poniéndome al día en electrónica digital, diseñando circuitos digitales. Así que aquí vuelvo con otro code-kata para hacer un sumador de varios bits. Para este sumador reutilizo un componente previamente hecho, diseñando un sumador completo de 4 bits. Es decir, en un post anterior escribí un sumador completo simple de 1 bit. Ahora con la instrucción de VHDL llamada port map, podemos enlazar tantos componentes como necesitemos en circuitos más grandes. Usando port map es la forma que tenemos de escalar tanto como queramos, todos los circuitos que queramos en sistemas digitales cada vez más grandes.

VHDL restador completo de 1 bit

VHDL: restador completo de 1 bit

Aquí dejo otro code-kata en VHDL, ahora para construir un restador completo de 1 bit. Recibe 3 entradas y saca 2 salidas. Es muy parecido al sumador completo del post anterior. La tabla de verdad de este circuito es la siguiente: Acarreo de entrada A B Acarreo de salida Resta 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 El código fuente del restador Las primeras pruebas construyendo sin simplificar, después el simplificado: El restador simplificado De nuevo, utilizando las tablas de Karnaugh llegamos a simplificar el código anterior a este siguiente: El banco de pruebas Igual que con el sumador, nos sirve casi el mismo banco de pruebas. Sólo cambio el componente y la nomenclatura de alguna variable: Si todo ha ido bien, al visualizar las señales de entrada y salida, tanto con el circuito normal como con el simplificado, se tiene que ver algo como la imagen del principio.

VHDL multiplexor 4 a 1 son selección de 2 bits

VHDL: multiplexor de 4 a 1 con selección de 2 bits

Code-kata para generar un circuito de un multiplexor. En este caso es un multiplexor que recibe 4 señales de entrada y las encauza en una salida eligiendo con otras dos señales de entrada cuál tiene que encauzar a la salida. Es decir, los 2 pins de entrada para seleccionar nos permiten 4 posibilidades: 00, 01, 10 y 11. Esto nos permite, suponiendo que tenemos 4 señales de entrada x0, x1, x2 y x3; que si seleccionamos 00 en la salida saldrá la señal de entrada x0, si ponemos 01 saldrá la señal x1, si ponemos 10 saldrá la señal x2 y si ponemos en selección 11 saldrá la señal de entrada x3 por la única salida que hay.

VHDL decodificador BCD de 4 bits a display de 7 segmentos

VHDL: decodificador BCD de 4 bits para display de 7 segmentos

Code-kata para mostrar en un display de siete segmentos números en binario que van desde el 0 al 9. Es un sencillo circuito que se puede encadenar con otros para mostrar los dígitos que sean necesarios. Esto es lo que se llama un decodificador BCD de 4 bits para un display de 7 leds, en este caso. No tiene mucho que explicar simplemente que es un circuito que convierte las señales de entrada de 4 bits en una señal de salida de 7 bits. Las de entrada son números en binario del 0 al 9. Mientras que las de salida simplemente encienden o apagan los segmentos para pintar el número que toque.