Vídeo 6: Bombeando bits - Obijuan/digital-electronics-with-open-FPGAs-tutorial GitHub Wiki
Vídeo
Haz click en la imagen para ver el vídeo en Youtube
Descripción
En hardware las cosas van en paralelo. Los circuitos independientes funcionan en paralelo, lo que nos permite crearlos de manera aislada y luego juntarlo para que funcionen a la vez (Superposición). Aprenderemos cómo podemos hacer parpadear bits a diferentes velocidades mediante el bombeo de bits
Colección
Academia-Jedi-HW-06.zip: Colección para este tutorial. Descargar e instalar
Contenido
- Configurando las colecciones
- Superposición de Circuitos
- Ejemplo 1: Circuitos en paralelo
- Ejemplo 2: Led parpadeante
- Pensamiento Hardware VS pensamiento Algorítmico
- Ejemplo 3: Leds parpadeando a diferentes velocidades
- Ejercicios propuestos (11 Bitpoints)
- Ejercicios entregados
- Autor
- Licencia
- Créditos y agradecimientos
- Enlaces
- FAQs
Configurando las colecciones
Lo primero que haremos será instalar la colección usada en este tutorial: Academia-Jedi-HW-06.zip, y seleccionarla. Si hemos hecho el tutorial 5 y sus ejercicios, tendremos estas colecciones instaladas:
Observamos que hay una opción nueva en el menú: Bombeo
Eliminado colecciones no usadas
Opcionalmente podemos eliminar las colecciones que no vamos a usar. Yo lo hago aquí para enseñaros cómo eliminarlas, pero no es necesario hacerlo para continuar con el tutorial. Nos vamos al menú Herramientas/Colecciones/Eliminar
y nos aparecerán todas las que tenemos instaladas. Seleccionamos la que queremos eliminar, por ejemplo la de Makespace-17
Nos aparece un mensaje de confirmación. Pinchamos en OK
Y sale la notificación de que la colección ha sido eliminada. Repetimos el proceso con el resto de colecciones salvo la que usaremos la que acabamos de instalar. El menú de las colecciones nos queda así
Si tenemos colecciones intaladas no hay problema. Esto es sólo un ejemplo de borrado :-)
Superposición de circuitos
El pensamiento hardware tiene dos características que le diferencian del pensamiento algorítmico:
- Se piensa en espacio: los circuitos ocupan un espacio físico
- Las cosas suceden en paralelo
Una consecuencia muy útil de esto es el poder combinar fácilmente circuitos independientes. Imaginemos que tenemos un circuito que toca una melodía, y otro que hace que un robot siga la línea negra. Los dos funcionan por separado. Si los metemos en la misma FPGA, tendremos un robot que sigue la línea mientras toca música
Esto lo podemos ver gráficamente usando el circuito de encender un led que ya conocemos. El circuito 1 enciende el LED 7. Lo cargamos en la placa y vemos que funciona correctamente
Ahora hacemos el circuito 2, que enciene el LED0. Lo cargamos en la placa y vemos que este LED se enciende
Ahora hacemos un circuito 3 que es la combinación de los dos anteriores: El circuito 1 al lado del circuito 2. Encenderá simultánemente los leds 7 y 0
A esta propiedad la llamaremos superposición de circuitos. Sólo es aplicable a circuitos que son independientes. Aplicando esta superposición, conseguimos que un circuito tenga la suma de comportamientos de sus integrantes
Ejemplo 1: Circuitos en paralelo
Vamos a comprobar la superposición de circuitos. Primero abrimos el circuito 1 desde los ejemplos, accediendo a Archivo/Ejemplos/1-Ejemplos/1-Circuitos-Paralelo/Ejemplo-01-LED7-on
Nos aparece el circuito 1, que simplemente encenderá el LED7
Lo cargamos en la placa para ver su funcionamiento
Abrimos una ventana nueva de Icestudio, con la opción Archivo/Nuevo
Nos aparece una ventana nueva de Icestudio, en blanco
Abrimos el circuito 2 desde los ejemplos, accediendo a Archivo/Ejemplos/1-Ejemplos/1-Circuitos-Paralelo/Ejemplo-02-LED0-on
y nos aparece el circuito 2
Ahora lo cargamos en la placa, y comprobamos que se enciende el LED 0
Pinchando con el botón izquierdo y arrastrando el ratón seleccionamos el circuito completo
Al soltar el bóton, todos sus componentes quedan seleccionados
Nos vamos a la opción Editar/Copiar para copiar el circuito
Nos vamos a la otra ventana, donde está el circuito 1
Y le damos a la opción Editar/Pegar
Nos aparece el circuito que habíamos copiado, superpuesto con el actual
Lo recolocamos para que se vean bien los dos circuitos
y lo cargamos en la placa
Ahora los dos leds están encendidos. Este circuito lo hemos creado poniendo dos circuitos independientes en paralelo, para mostrar un ejemplo "hola mundo" del principio de superposición. En tutoriales venideros aplicaremos este principio a circuitos más complejos
Ejemplo 2: Led parpadeante
Hasta ahora hemos hecho circuitos donde los bits eran constantes. En este ejemplo haremos que un LED se encienda y se apague continuamente, con periodo de un segundo
Partiremos el ejemplo anterior, al que eliminamos los comentarios de texto y el bit 1 superior. Los bloques se eliminan seleccionándos y pulsando la tecla Supr o Delete
Queremos que el LED7 parpadee y que el LED0 se quede encendido
Para hacer que parpadee el LED tenemos que bombear bits. Hay que enviar la secuencia de bits 1 - 0 - 1 - 0 ... Eso lo conseguimos con el bloque corazón
Nos vamos al menú Bombeo y seleccionamos el Corazón de 1Hz.
Es un corazón que bombea bits a un ritmo de un bit 1 por segundo
Al cargarlo en la placa obtendremos esto:
Pensamiento hardware vs pensamiento algorítmico
El ejemplo de hacer parpadear un LED es un clásico. Vamos a analizar cómo se aborda usando el pensamiento algorítmico y el pensamiento hardware
Led parpadeante con pensamiento algorítmico
Cuando queremos hacer que parpadee el LED de Arduino, usamos este programa
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
Hay un procesador (cpu), que ejecuta las instrucciones de una en una. Primero configura el pin para que sea de salida (LED_BUILTIN) y luego se entra en el bucle principal, que se repite todo el tiempo.
Las instrucciones que se ejecutan en el bucle principal son:
- Escribir un 1 en el pin de salida para encender el led
- Esperar durante medio segundo
- Escribir un 0 en el pin para apagar el led
- Esperar durante medio segundo
Pregunta reto
El pensamiento algorítmico es muy potente, pero hay cosas sencillas que son difíciles de implementar con este pensamiento. Aquí lanzo esta pregunta para pensar sobre ello:
¿Cómo podemos hacer para que dos leds parpadeen a diferentes velocidades con pensamiento algorítmico? ¿Y tres leds con velocidades diferentes? ¿Y 10?
Por supuesto esto es algo que se puede hacer, pero no es trivial ni inmediato para alguien que está empezando. Se requieren conocimientos avanzados para entender cómo hacerlo
Led parpadeante con pensamiento hardware
Para hacer parpadear un led con pensamiento Hardware el enfoque es distinto. No pensamos en las instrucciones que hay que darle a un procesador, sino que nos centramos directamente en los bits y es un pensamiento espacial.
Hay que enviar físicamente una tira de bits, a 1 y a 0. Es decir, hay que bombear bits, que se desplazan por el cable hasta que salgan fuera del chip y lleguen al led. Se muestra gráficamente en este animación
Con el pensamiento hardware es muy fácil responder a la pregunta de cómo hacer que parpadeen dos o más leds a diferentes velocidades. Sólo hay que poner en paralelo circuitos con corazones que bombeen bits a diferentes velocidades
Ejemplo 3: LEDs parpadeando a diferentes velocidades
Hacer que varios leds parpadeen a diferentes velocidades con pensamiento hardware es muy sencillo. Sólo hay que poner en paralelo otro corazón, que bombee bits a una velocidad diferente
Haremos que el LED 0 parpadee a una velocidad de 4 veces por segundo, mientras que el LED 7 lo hará una vez por segundo
Partimos del circuito del ejemplo anterior, y añadimos un corazón de 4Hz desde el menú Bombeo/Corazón 4Hz
Eliminamos el bit 1 constante de la parte inferior y lo sustituimos por el nuevo corazón. Tiramos el cable para conectarlo al pin de salida LED 0
Y lo cargamos:
Vemos cómo los dos leds están pardeando a diferentes velocidades :-)
Ejercicios propuestos (11 BitPoints)
-
Ejercicio 1 (Total 3 Bitpoints): Hacer un circuito digital que haga parpadear los LEDs 0 y 7 a la vez, a la velocidad de un parpadeo por segundo. Entregar por redes sociales, con mención a @obijuan_cube
- 1 pantallazo del circuito (1 bitpoint)
- 1 Vídeo del circuito funcionando (1 bitpoint)
- Entrega adicional por Github (1 bitpoint)
-
Ejercicio 2 (Total 3 Bitpoints): Hacer un circuito digital en el que los LEDs pares de la icezum Alhambra parpadeen a una velocidad de 4Hz y los impares a 1Hz. Entregar por redes sociales, con mención a @obijuan_cube
- 1 pantallazo del circuito (1 bitpoint)
- 1 Vídeo del circuito funcionando (1 bitpoint)
- Entrega adicional por Github (1 bitpoint)
-
Ejercicio 3 (Total 3 Bitpoints): Hacer un circuito digital en el que los 4 LEDs pares de la icezum alhambra parpadeen cada uno a una velocidad, según esta tabla:
- LED 6: 10Hz
- LED 4: 7Hz
- LED 2: 4Hz
- LED 0: 1hZ
Entregar por redes sociales, con mención a @obijuan_cube
- 1 pantallazo del circuito (1 bitpoint)
- 1 Vídeo del circuito funcionando (1 bitpoint)
- Entrega adicional por Github (1 bitpoint)
-
Ejercicio 4 (2 Bitpoints). Ejercicio Libre. Premiar la creatividad. Entregar por redes sociales o github: Pantallazos, enlaces, vídeos, etc...
Ejercicios entregados
Alberto Valero
Jesús Sesma
Koyikabuto
Autor
- Juan González-Gómez (Obijuan)
Licencia
Créditos y agradecimientos
Enlaces
FAQs
- ¿Dónde puedo conseguir la placa Icezum Alhambra?
Pueden conseguir una desde Alhambrabits
- ¿Cómo aprendo a manejar github?
Hay mucha información en internet. En su momento hice este Tutorial: Github y FreeCAD para enseñar a manejarlo. Los ejemplos están hechos con ficheros de FreeCAD, sin embargo, lo que se enseña es genérico. También vale para las entregas de los ejercicios del tutorial de Electrónica digital para makers