2017_03_04: Fablab Valencia

Juan Gonzalez-Gomez edited this page Mar 6, 2017 · 16 revisions

Frikeando con Icestudio y FPGAs libres (Nivel: iniciación)

Ficha

Resumen

Introducción al diseño de circuitos digitales usando Icestudio y la placa Icezum Alhambra, con un enfoque puramente práctico. Se comienza por lo más sencillo: encender un led y se van introduciendo otros elementos gradualmente

Descargas

Fichero Descripción
Taller-Fablab-Valencia.zip Colección con los bloques, ejemplos y ejercicios usados en el taller
fichas.pdf Fichas con los circuitos (PDF)
Fichas Directorio con las fuentes de las fichas, en SVG

Fotos

| | | |----------------------|--------------------------------| | | |

Herramientas y material

Contenido

  1. Hola mundo: Encendiendo un led
    1.1 Ejercicio: Encender el LED7 de la Icezum Alhambra

  2. Encendiendo varios leds
    2.1 Ejemplo 1: Dos cables separados
    2.2 Ejemplo 2: Dos cables unidos
    2.3 Ejercicio: Encender los leds pares de la Icezum Alhambra, con 4 cables separados
    2.4 Ejercicio: Encender los leds impares de la icezum Alhambra, con 4 cables unidos

  3. Led parpadeante. Bombeo de bits
    3.1 Ejercicio: Parpadeo de todos los leds impares a la vez

  4. Led parpadeante. Más rápido
    4.1 Ejercicio: Parpadeo de bits rápido y lento. 4 lentos y 4 rápidos

  5. Pulsador. Hola Mundo
    5.1 Ejercicio: Que se enciendan 4 leds al apretar el pulsador 1 y otros 4 con el pulsador 2

  6. Puerta NOT. Leds alternativos
    6.1 Ejercicio 1: Hacer que los leds 0 y 7 se alternen automáticamente, con ritmo de 1 segundo
    6.2 Ejercicio 2: Generar una secuencia en los leds de forma que los pares se alternen con los impares, con a un ritmo de 4 veces por segundo

  7. Puerta OR
    7.1 Ejercicio 1
    7.2 Ejercicio 2

  8. Puerta AND
    8.1 Ejercicio 1

  9. Pulsador de cambio
    9.1 Ejercicio 1

  10. Tablas de verdad de las puertas lógicas
    10.1 Ejercicio 1

  11. Contador de 4 bits 11.1 Ejercicio 1

  12. Multiplexando señales
    12.1 Ejercicio 1
    12.2 Ejercicio 2
    12.3 Ejercicio 3

  13. Memoria ROM
    13.1 Ejercicio 1

  14. Modificando un bloque de Icestudio

Guión

Instalando la colección

Todos los bloques, ejemplos y soluciones a los ejercicios están en esta colección: Taller-Fablab-Valencia.zip

Lo primero es intalarla en Icestudio. Descargar el fichero .zip (no descomprimir). Abrir icestudio. Ir a la opción Herramientas / Colecciones / Añadir y seleccionar el fichero descargado.

Una vez añadida, la dejamos seleccionada en la opción Seleccionar / Coleccion / Taller-Fablab-Valencia

¡Ya estamos listos para frikear con Electrónica digital! :-)

1. Hola mundo: Encendiendo un led

Comenzamos haciendo un circuito Hola mundo, que simplemente dejará encendido el led0 de la Icezum Alhambra. El circuito está formado por un bit a 1, constante, que se conecta mediante un cable al pin de salida LED0

Para crearlo, seleccionamos el bit a 1 desde el menú superior: Bit/1. A continuación ponemos el pin de salida pinchando en Básico/Salida. Se nos abre una ventana nuevo donde escribimos la etiqueta LED, para indicar que es un pin de salida conectado a un led (pero se le puede poner como nombre el que se quiera). Por último, abrimos el desplegable del pin de salida y seleccionamos LED0

¡Ya tenemos creado nuestro primer circuito digital!

Ahora lo vamos a cargar en la icezum Alhambra. Para ello conectamos la placa al USB y le damos a la opción Herramientas / Cargar (O directamente le datos a control-U) . Al cabo de unos segundos tendremos el led 0 encendido, y el resto apagados:

Lo que ha ocurrido, es que físicamente, el circuito que hemos hecho en icestudio, se ha mapeado en la FPGA. Es como si tuviésemos un chip que tiene exactamente el circuito que hemos diseñado:

Dentro de la FPGA sólo está el bit 1 y un cable que sale por el pin que está conectado directamente al led 0. El cable amarillo es fijo. Está en el PCB de la placa. El cable negro se ha generado dentro de la FPGA para conectar el 1 con el pin de salida de la FPGA

Ejercicio 1.1

Encender el led 7 de la icezum Alhambra, en vez del 0

2. Encendiendo varios leds

En electrónica digital, los circuitos funcionan todos en paralelo, al mismo tiempo. Por eso, para encender 2 leds, hacemos 2 circuitos "hola mundo". Es decir, tiramos dos cables, uniendo los bits 1 con sus respectivos pines de salida

Partimos del ejemplo "hola mundo". Usando el botón derecho del ratón, seleccionamos el circuito y le damos a la opción Editar/Copiar (o pulsamos control-c). A continuacion le damos a Editar/Pegar (o con control-V) y nos aparecerá la copia del circuito, que colocamos debajo.

Cambiamos el desplegable del circuito inferior para cambiar LED0 por LED7

Cargamos el programa en la placa y vemos cómo ahora los dos leds están encendidos:

Si mirásemos la FPGA por dentro, veríamos que ahora ha aparecido un nuevo circuito (Se dice técnicamente que la FPGA se ha reconfigurado):

Ejemplo 2: Cables unidos

Para encender dos leds, se puede utilizar este circuito equivalente:

En él, el cable que llega a cada pin de salida procede del mismo bit. El cable que va hacia el led 7, tiene un punto que indica que está conectado al cable que llega al led 0

Ejercicio 2.1

Encender los leds pares de la Icezum Alhambra, con 4 cables separados

Ejercicio 2.2

Encender los leds impares de la icezum Alhambra, con 4 cables unidos

3. Led parpadeante. Bombeo de bits

Los bits que hemos usado hasta ahora eran estáticos: siempre estaban a 1. Para hacer que un led parpadee tenemos que enviarle bits variables, que cambien de 1 a 0 y de 0 a 1. Es decir, tenemos que "bombear" bits. Para ello utilizaremos la bomba de bits, accesible desde Varios / Bombeo_bits / Bomba_x1. Nos aparecerá un bloque con el símbolo del coración y el signo de x1. Lo conectamos mediante un cable a un pin de salida asignado al LED0

Cuando lo tengamos creado, lo cargamos en la icezum Alhambra. Veremos cómo el LED0 late a un ritmo de una vez por segundo ¡Tenemos un circuito que nos muestra el paso de los segundos!

3.1 Ejercicio 3.1

Hacer un circuito que haga parpadear todos los leds impares de la icezum Alhambra a la vez

4. Led parpadeante. Más rápido

Para que el led parpadee con mayor rapidez, cambiaremos el corazón del ejemplo anterior por uno que lata con más pulsaciones. En vez de 1 por segundo, pondremos uno que tiene 4 por segundo (x4). Este nuevo corazón lo encontramos en Varios / Bombeo_bits / Bomba_x4

El circuito que nos queda es:

Una vez cargado en la Icezum Alhambra, veremos cómo el led parpadea mucho más rápido:

4.1 Ejercicio 4.1:

Diseñar un circuito en el que los 4 bits de menor peso (Led0, Led1, Led2 y Led3) parpadeen rápidamente y los 4 leds de mayor peso (Led4, Led5, led6, led7) lo hagan lentamente

5. Pulsador. Hola Mundo

La icezum Alhambra tiene 2 micro-pulsadores de pruebas, SW1 y SW2 en la parte superior que nos sirven para introducir bits desde el exterior a nuestros circuitos. Haremos un circuito que saca la información recibida por el pulsador en el LED0, de manera que se encienda al apretar SW1.

El circuito es muy sencillo: un cable que une el pin de entrada, donde está el pulsador SW1, con el pin de salida, donde está el Led 0. El pin de entrada lo colocamos desde la opción Básico/entrada

Lo cargamos en la placa y lo probamos. Al apretar el pulsador SW1 se encenderá el led, y al soltarlo se apagará

5.1 Ejercicio 5.1

Se propone como ejercicio que se enciendan 4 leds al apretar el pulsador 1 y otros 4 con el pulsador 2. De forma que si están apretados los dos, todos los leds están encendidos

6. Puerta NOT. Leds alternativos

En este ejemplo usaremos nuestra primera puerta lógica: una puerta NOT. Es un componente que invierte los bits. Si recibe un 0, devuelve un 1, y si recibe un 1, devuelve un 0.

La usaremos para crear un circuito que encienda alternativamente los Leds 0 y 7, al accionar el pulsador

El pulsador está conectado directamente al LED 0. Este pulsador también está conectado al LED 7 a través de la puerta inversora. Esto garantiza que los leds 0 y 7 siempre estárán en estados diferentes. Al cargarlo en la placa podemos ver su efecto:

6.1 Ejercicio 1

Hacer que los leds 0 y 7 se alternen automáticamente, con ritmo de 1 segundo

6.2 Ejercicio 2

Generar una secuencia en los leds de forma que los pares se alternen con los impares, a un ritmo de 4 veces por segundo

7. Puerta OR

La puerta OR tiene dos entradas. Por su salida se obtiene un bit a 1 cuando alguna de sus entradas (o las dos) están a 1. O dicho de otra manera, sólo saldrá 0 por la salida si sus dos entradas están a 0

Como ejemplo, vamos a hacer que un led parpadee a un ritmo de 1 segundo. Al al apretar el pulsador SW1, su valor quedará fijado a 1, dejando de parpadear. Al soltar el pulsador, continuará parpadeando:

Cuando el botón no está apretado, al llegar un 1 del corazón, saldrá por su salida, encendiendo el led. Al llegar un 0, las dos entradas de la OR están a 0 y por tanto, saldrá un 0, por lo que el led se apagará. Sin embargo, en cuanto se aprieta el botón, por la salida de la OR siempre saldrá un 1, independientemente del estado de los bits recibidos del corazón

7.1 Ejercicio 1

Hacer un circuito en el que el led 0 parpadee a un ritmo de 1 segundo, mientras el pulsador SW1 esté sin apretar. Al apretarlo, el led debe quedarse encendido

7.2 Ejercicio 2

Modificar el circuito del ejercicio anterior para que el led 0 quede encendido si se pulsa tanto el pulsador SW1 o el SW2. Cuando no estén apretados, deberá parpadear

8. Puerta AND

La puerta AND tiene también dos entradas. Su salida sólo se pone a 1 cuando ambas entradas están a 1. En caso contrario permanece a 0. En este circuito de ejemplo, los dos pulsadores se introducen por una puerta AND y la salida se conecta al LED 0. De esta forma, sólo cuando ambos pulsadores estén apretados, se encenderá el led

8.1 Ejercicio 8.1

Hacer un circuito que haga parpadear un led pero sólo cuando se apriete SW1 (SW1 se denomina señal de habilitación). Si el pulsador no está accionado, el led 0 permanecerá apagado

9. Pulsador de cambio

Voy a usar nuestro primer elemento de memoria: el pulsador de cambio. Es un componente que almacena un bit. Inicialmente está a 0. Con cada click del pulsador de su entrada cambia de estado (Un click es cuando se aprieta el pulsador y se suleta). En este circuito de ejemplo, su salida está conectada a un led, de manera que con cada click cambia. Con el primer click el led se enciende. Con el siguiente se apaga. Y así sucesivamente

9.1. Ejercicio 1

Utilizar dos pulsadores de cambio, asociados a los dos pulsadores sw1 y sw2 y sacar sus salidas a 2 bits. Esto nos permite visualizar números binarios de 2 bits

10. Tablas de verdad de las puertas lógicas

Usaremos dos pulsadores de cambio para establecer los valores de las dos entradas de una puerta OR y observar su salida. Si anotamos sus valores en una tabla, obtenemos lo que se denomina tabla de verdad. Como tiene 2 entradas, en total tendremos 4 casos posibles

Pulsador SW1 Pulsador SW2 OR
0 0 0
0 1 1
1 0 1
1 1 1

El circuito que nos permite observar esta tabla de verdad es:

10.1 Ejercicio 10.1

Modificar el ejemplo anterior para hacer la tabla de verdad de la puerta AND

11. Contador de 4 bits

Un contador es un componente que almacena un número. Cada vez que recibe un latido por su entrada, incrementa este valor. En este ejemplo mostramos un contador de 4 bits, que comienza en 0. Con cada latido de 1 segundo incrementa su número, de forma que cuenta 0, 1, 2 ... hasta 15, pero en binario. Su salida se muestra por los leds del 0 al 3. En realidad lo que tenemos es un segundero en binario

11.1. Ejercicio 11.1

Modificar el segundero binario del ejemplo anterior para que al llegar a su cuenta máxima (15, que en binario es 1111), se encienda el LED 7 para notificarnos que ha llegado al final, y que en el próximo segundo volverá a 0

12. Multiplexando señales

Los multiplexores son unos componentes que nos permiten seleccionar entre varias entradas. En este ejemplo usaremos un multiplexor de 2 entradas y una entrada de control, que nos permitirá seleccionar la velocidad a la que queremos que parpadee un led. Por la entrada 0 del multiplexor se introduce la señal de un segundo y por la entrada 1 la señal de 4 pulsaciones por segundo (rápida). Mediante el pulsador SW1 seleccionamos cuál de las dos señales queremos que llegue al led 7 para que parpadee:

12.1. Ejercicio 1

Modificar el ejemplo para que además de controlar la velocidad de parpadeo con SW1, se pueda activar o desactivar el parpadeo con el pulsador SW2. Se puede hacer de varias formas, pero en este ejercicio se pide utilizar un multiplexor adicional

12.2. Ejercicio 2

Hacer un contador binario de 4 bits que cuente a dos velocidades, lenta o rápida. Con el pulsador SW1 se cambia la velocidad

12.3. Ejercicio 3

Modificar el diseño del ejercicio anterior para hacer que con el pulsador SW2 la cuenta se detenga y se vuelva a reanudar al hacer otro click

13. Memoria ROM de 16x5

Una memoria rom es un componente que almacena valores fijos en su interior. En este ejemplo usaremos una memoria rom de 16 posiciones y en cada posición se almacena 5 bits. El contenido de la rom lo volcaremos en los leds, visualizándose una posición cada vez. Usamos un contador de 4 bits para acceder secuencialmente a cada una de las 16 posiciones: desde la 0 hasta la 15, mostrando su valor en los leds

13.1. Ejercicio 1

Modificar el ejemplo para que la memoria se pueda recorrer de dos formas: automática y manualmente. El modo automático es el mismo que el ejemplo anterior: el contador se incrementa de forma automática. Con cada click del pulsador SW1 cambiamos de un modo a otro. En el modo manual, en los leds se muestra el dato de la dirección actual, indefinidamente. Al hacer click en SW2 se incrementa el contador y se accede a la siguiente dirección

14. Memoria ROM de 16x5 inicializada desde Fichero

Los valores de la memoria ROM podemos hacer que se carguen desde un fichero de datos. Eso lo logramos usando el componente ROM16X5_file, que al sintetizar se carga con los valores contenidos en el fichero roms0.list

Es un fichero ASCII, con los datos en hexadecimal, cada palabra en una línea. Un ejemplo de este fichero sería:

01  
03  
07  
0F  
1F  
1F  
0F  
07  
03  
01  
00  
00  
00  
00  
00  
00  

Los 5 bits menos significativos de cada palabra son los que se graban en la memoria ROM

Es importante que el fichero rom0.list se encuentre en la misma carpeta donde esté guardado el proyecto de icestudio

14.1. Ejercicio 1

Modificar los valores de la memoria rom para generar una secuencia diferente en los leds

Autores

  • Jesús Arroyo
  • Eladio Delgado
  • Juan González (Obijuan)

Licencia

Más información

Créditos

Agradecimientos

  • Al HackerSpace Valencia por la organización de la charla y el taller. ¡Muchas gracias!
  • A Matthew Venn por invitarme a dar la charla y alojarme en su casa. ¡Muchas gracias! :-)
  • A Arturo Sapiña por toda su ayuda en la organización y por esas cervezas ;-) ¡Muchas gracias!
  • A David H. por su ayuda en la organización. ¡Muchas gracias!