Vídeo 20: Buses y números - 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
Hasta ahora hemos hecho circuitos que trataban con los bits de manera aislada. Con circuitos más complejos, es mejor agrupar los cables en buses, y tratar la información como números, en vez de bits aislados. Aprenderemos a crear buses, agrupar entradas y salidas, y utilizar componentes cuyas entradas y salidas son números
Colección
Academia-Jedi-HW-20.zip: Colección para este tutorial. Descargar e instalar
Contenido
- Introducción
- Buses
- Números constantes paramétricos
- Separadores y agregadores de bus
- Multiplexores de N bits
- Ejercicios propuestos (20 Bitpoints)
- Ejercicios entregados
- Autor
- Licencia
- Enlaces
- Preguntas frecuentes
Introducción
Hasta ahora hemos trabajado con bits individuales. Cada bit se transmite por un cable, de un componente a otro. Por ejemplo, si queremos encender dos LEDs, hacemos un circuito como este:
Sin embargo, también podemos agrupar los bits en un cable más gordo, que llamamos Bus. Los bit se siguen transportando igual, y en paralelo, cada uno por su cable, pero sólo dibujamos un único cable de bus. De esta forma, los diseños son más sencillos de dibujar y de entender
Según los números con los que trabajemos en nuestro circuito, usaremos buses de un tamaño un otro.
Buses
Veremos buses de 3 tamaños, a modo de ejemplo. Empezaremos por los buses más simples: de 2 bits. Luego mostraremos de 4 y de 8 bits
Buses de 2 bits
Haremos un circuito equivalente al anterior, para enceder 2 LEDs, pero usando una constante y un bus de 2 bits. Primero colocamos la constante 3 (que en binario es 11) desde el menú Const/Bus/2-bits/Valor_3
Nos aparecerá un bloque con el número 3, y el número en binario debajo (11)
Por la salida de este bloque aparece un cable más gordo de lo normal, con el nombre k[1:0]. Se trata de un bus de 2 bits
La letra k es el nombre que se le ha dado al bus en la salida de la constante, pero podría tener cualquier otro. Entre corchetes se indican los números de los cables que transportan los bits más significativo y menos significativo respectivamente. Siempre usaremos el 0 para referirnos al de menor peso. Como es un bus de 2 bits, el más significativo será el 1
Los LEDs los trataremos como un bloque al que le entra un bus de 2 bits. Para ello colocamos un pin de salida como hacemos normalmente, pero en el nombre usamos la nomenclatura del bus: LED[1:0]
Al pinchar sobre el OK nos aparecerá un bloque con 2 salidas, y un bus de entrada. Lo colocamos en el circuito
Ahora tiramos el bus como si se tratase de un cable cualquiera, uniendo los dos bloques. Y por último seleccionamos los LEDs por lo que enviar los bits. Por ejemplo LED1 y LED0
Lo cargamos y lo probamos
Vemos que los dos LEDs, LED0 y LED1 se encienden. Lo importante es saber que los dos circuitos que hemos probado, el que tiene cables aislados y el que tiene el bus, son equivalentes. Este ejemplo de comparación se encuentra disponible en Archivo/Ejemplos/1-Ejemplos/01-Bus-2Bits-LEDs
Al trabajar con buses nos centramos en los números. Lo que transmitimos de un sitio a otro son números. Y eso es lo que nos importa, aunque internamente se transportes los bits individualmente
Los buses se comportan igual que los cables que ya conocemos. Si queremos tirar más de un bus desde la misma salida lo hacemos igual. En este ejemplo se están encendiendo 4 LEDs usando dos buses de 2 bits
Lo cargamos y lo probamos
Las entradas también se pueden agrupar en un bus. En este ejemplo, agrupamos los dos pulsadores de la Icezum Alhambra en un bloque de entrada de 2 bits, y los conectamos con los LEDs de salida mediante un bus de 2 bits
Buses de 4 bits
El funcionamiento de los buses de 4 bit (y de cualquier tamaño) es similar al de dos bits. Este es el circuito de ejemplo para encender 4 LEDs usando un bus de 4 bits. Está accesible desde el menú Archivo/Ejemplos/1-Ejemplo/02-BUS-4bits-LEDs
Vamos a fijarnos en la constante 15. Es el número 15, que en binario es 1111 (Todos los bits a 1), por lo que al enviarla por el bus, hará que se enciendan todos los LEDs. En la parte inferior derecha de la constante está escrito el carácter F, que es el número 15 en hexadecimal. El bus de salida utilizado tiene esta notación k[3:0], cuyo significado se muestra en esta figura
Es un bus formado por 4 cables, numerados desde el 0 (que transporta el bit menos significativo) hasta el 3 (que lleva el más significativo). Esta constante está disponible en el menú Const/Bus/4-bits/Valor_15
Lo cargamos y lo probamos:
Ahora ponemos otra constante de 4 bits, como por ejemplo el 5. Cargamos el circuito y vermos que se encienden los LEDs 6 y 4, ya que el 5 en binario es 0101
Buses de 8 bits
Los buses de 8 bits se utilizan muchísimo. Los procesadores de los primeros ordenadores que llegaron a nuestras casas, en los inicios de la informática, eran de 8-bits. Por ejemplo el procesador Z80 o el 6502, son de 8-bits. Se usaron en los ordenadores de la época, como ZX-spectrum o el Amstrad CPC entre otros muchos. Para transportar los números de 8 bits, estos procesadores usan buses de 8 bits
El circuito para encender los 8 leds de la Icezum Alhambra usando un bus de 8 bits es el siguiente:
Hemos utilizado la constante de 8-bits 255, que se corresponde con el número binario que tiene sus 8 bits a 1, por lo que al enviarlo por el bus de 8-bits se encienden todos los LEDs. El valor en hexadecimal es el FF. Esta constante se encuentra en el menú Const/Bus/8_bits/Valor_255. Como salida tiene un bus de 8 bits, que se ha denotado por k[7:0]
El cable que lleva el bit de mayor peso se ha numerdo como 7, y que lleva el de menor peso como 0
Lo cargamos y lo probamos
Probamos con otra constante, por ejemplo 170. Se corresponde con el número hexadecimal AAh, y el binario 10101010, que se caracteriza porque tiene los bits alternados: pares a uno, impares a 0. La constante 85 (55h) es la negada: se correspone con el número binario 01010101, en el que los bits pares están a 0 y los impares a uno. Ambas constantes, 170 y 85 se utilizan muchísimo en hardware, para hacer pruebas
Números constantes paramétricos
Las constantes que hemos utilizado hasta ahora para introducir valores por los buses, tienen valores fijos, que no se puede cambiar. Volvamos al ejemplo anterior, que enciende los 8 leds de la icezum alhambra a través de la constante 255 en el bus de 8 bits. Si hacemos doble click sobre la constante, verás que está creada a partir de una constante genérica k, a la que se le pasa como parámetro el valor que queramos
Esa constante genérica la podemos colocar desde el menú Const/Bus/8_bits/Genérico y luego le pasamos el valor como parámetro.
Ejemplo 4: Constante genérica de 8 bits
En este ejemplo estamos usando una constante genérica de 8 bits al que le pasamos el valor 129 para mostrar en los LEDs
Si cargamos este circuito en la placa, veremos que se encienden los leds LED7 y LED0, ya que el 129 en binario es 10000001
Al haber usado una constante genérica, podemos editar este valor y poner el que queramos, de 8 bits. Podemos introducir cualquier número de 8 bits
Ejemplo 5: Constante genérica de 4 bits
Si queremos introducir constantes de 4 bits se hace la misma forma, pero ahora colocamos el bloque que está en el menú Const/Bus/4_bits/Genérico. En este ejemplo usamos 2 constantes de 4 bits para activar los LEDs. La primera actúa sobre los 4 leds más significativos, y la segunda sobre los 4 menos significativos. Los valores que enviamos son 12 (1100) y 3 (0011)
Si cargamos el circuito en la Icezum Alhambra, se nos encenderán los siguientes LEDs
El resultarío sería exactamente igual si en lugar de 2 constantes de 4 bits enviamos el valor constante 195, de 8 bits (que en binario es 11000011)
Truncado de números
Cuando trabajamos con números y buses es responsabilidad del diseñador el usar los valores correctos. Cuando se asignan constantes a buses, se trunca la constante a los bits del bus definido, ignorándose el resto. Así por ejemplo, si estamos usando un bus de 4 bits, el valor más alto que podemos usar es de 15, o de lo contrario se truncará el valor. En el siguiente ejemplo estamos introduciendo un valor de 16 a un bus de 4 bits
Lo que ocurrirá es lo siguiente: El valor 16 en binario es 10000. Se necesitan 5 bits para representarlo. Como lo estamos sacando por un bus de 4 bits, sólo se envían los 4 bits menos significativos, ignorándose el 1 de mayor peso (El número se ha truncado). El resultado es que no se encenderá ningún LED
Es importante recordar esto, y siempre tener en la cabeza los números de bits que estamos usando, para evitar truncamientos indeseados
Números en decimal, hexadecimal y binario
Si no indicamos nada, cuando introducimos los valores como parámetros, por defecto están en decimal. Sólo tenemos que tener la precaución de que no se trunque. Todos los valores que hemos introducido hasta ahora estaban en decimal.
Sin embargo, es posible introducirlos también en hexadecimal o binario, usando la notación de Verilog. Esta notación tiene la siguiente sintáxis. Usaremos como ejemplo el valor 255 de 8 bits
Así, si quieremos encender los 8 LEDs, cualquiera de los siguientes valores sería válido:
255
8'd255
8'hFF
8'b11111111
Y aquí está el circuito en icestudio, donde introducimos el valor en binario, pero se muestran las otras posibilidades
Este es otro ejemplo en el que se envían 4 constantes de 2 bits a los LEDs, usando las cuatro representaciones anteriores: por defecto, decimal, hexadecimal y binario
Separadores y agregadores de bus
En nuestros diseños podemos estar trabajando con cables sueltos, y en un momento determinado unirlos para convertirlos en un bus. Esto lo hacemos usando un componente que denominamos agregador. El símbolo que utilizamos es el siguiente:
Y también podemos hacer la operación inversa, extraer los cables aislados a partir de un bus. El componente se llama separador
Mostraremos algunos ejemplos de agregadores y separadores de bus, de tamaños de 2, 4 y 8 bits, aunque cuando aprendamos a hacer nuestros propios bloques nos podremos crear exactamente los que necesitemos
Buses de 2 bits
Como ejemplo vamos a encender 2 LEDs usando un bus de 2 bits, pero separando los cables y luego volviendo a unirlos
Es simplemente un ejemplo de uso. Este circuito es equivalente al que habíamos usado antes con un único cable de bus. La constante 3 de dos bits se lleva por un bus hasta el separador, donde se obtiene sus dos cables, que se llevan de nuevo a un agregador para volver a formar un bus de 2 bits que se muestra por los LEDs 1 y 0
Buses de 4 bits
Los separadores de bus de 4 bits, parten el bus en otros dos buses de 2 bits. Por los agregadores entran dos buses de 2 bits, y se obtiene a la salida un bus de 4 bits. Como ejemplo sacaremos la constante 10 de 4 bits por los LEDs
La constante va por un bus de 4 bits y entra en un separador, obteniéndose 2 buses de 2 bits a su salida. Estos buses se llevan a un agregador que vuelve a formar otra vez un bus de 4 bits que se lleva hasta los LEDs
Una de las aplicaciones muy usadas de los agregadores y separadores es la de intercambiar el orden de los bits de un bus. En este ejemplo enviamos por un lado la constante 10 de 4 bits a los LEDS 7,6,5 y 4 y por otro se intercambian los dos bits de mayor y menor peso y la nueva constante se saca por los LEDS 3,2,1 y 0
Cambiar las posiciones de los bits es una forma simplificada de encriptar información
Buses de 8 bits
Como último ejemplo hacemos lo mismo pero con separadores y agregadores de 8 bits. Se envía la constante AAh (10101010) de 8 bits a los LEDs, primero por un bus de 8 bits que entra en un separador, obteniéndose dos buses de 4 bits. Estos entran en un agregador que vuelve a formar el bus de 8 bits que se envía a los LEDs
Multiplexores de N bits
Los buses se usan como entradas y salidas de otros componentes, por ejemplo de los multiplexores. Hasta ahora sólo habíamos usados multiplexores de 1 bit, en los que los canales que entran son de 1 bit, y la salida son por tanto, también de 1 bit
Con los multiplexores de N bits podemos seleccionar qué números se envían por un bus de salida. Los canales, ahora, serán fuentes de números
Como ejemplo de aplicación haremos un circuito que encienda alternativamente los LEDs pares e impares de la Icezum Alhambra. Esto ya lo hemos hecho previamente, pero pensando en bits aislados. Ahora lo haremos igual, pero pensando con números
Utilizaremos un multiplexor 2 a 1 de 8 bits. Se encuentra en el menú Comb/Mux/8-bits/Mux-2-1
Este multiplexor tiene dos entradas de datos, i1[7:0] e i0[7:0], que ahora son buses de 8 bits. La salida es también un bus de 8 bits, que se denota por o[7:0]. La entrada de selección es de 1 bit
Para hacer que los LEDs pares se alternen con los impares pensamos en los LEDs como un número de 8 bits. Si enviamos el número 170 se encenderán los bits pares, ya que este número en binario es 10101010 (y en hexadecimal AA). Por el contrario, si enviamos el número 85, se encenderán sólo los impares, porque en binario es 01010101 (y 55 en hexadecimal)
Por tanto, nuestro circuito lo único que tiene que hacer es enviar alternativamente los valores 170 y 85 a los LEDs
Lo cargamos y lo probamos
De forma similar podemos usar multiplexores de otro número de bits. Por ejemplo, en este otro ejemplo usamos un multiplexor de 4 a 1 de 4 bits para sacar por los LEDs dos secuencias, según el estado del pulsador
Cuando el pulsador no está apretado (sel1=0), se seleccionan los canales 0 y 1 cada medio segundo, por lo que por los LEDs se visualizan los números 3 y 12 (0011 y 1100 en binario). Cuando el pulsador está apretado (sel1=1), se seleccionan los canales 2 y 3, enviándose las constantes 10 y 5 (1010 y 0101 en binario) a los LEDs
Lo cargamos y lo probamos
Ejercicios propuestos (20 BitPoints)
Ver los detalles de los ejercicios y las entregas en el menú Archivos/Ejemplos/2-Ejercicios de la colección de este tutorial
Resumen:
- Ejercicio 1 (Total 5 Bitpoints): Secuencia de 4 estados en los LEDs
Diseñar un circuito digital que muestre por los 8 LEDs de la Icezum Alhambra la siguiente secuencia: 0, 15, 255 y 15, que se repetirá indefinidamente. Utilizar un multiplexor de 4 a 1 de 8 bits
- Ejercicio 2 (Total 5 Bitpoints): Operación AND en bus de 2 bits
Diseñar un circuito digital que saque por los LEDs 7 y 6 los pulsadores SW2 y SW1, usando un bus de 2-bits. Además, se sacará por el LED0 el resultado de la operación AND entre SW1 y SW2, obteniendo sus valores del bus de 2 bits, mediante un separador
- Ejercicio 3 (Total 5 Bitpoints): Cifrador de números de 4-bits
Diseñar un circuito digital que cifre un número de 4-bits mediante el intercambio de sus bits centrales (Bits 1 y 2), dejando el de mayor y menor peso iguales (bit 3 y bit 0). El número se introducirá mediante 4 interruptores externos que entran en la icezum Alhambra mediante un bus de 4 bits. El número sin cifrar se sacará por los LEDs 7,6,5 y 4, y el número cifrado por los LEDs 3,2,1 y 0
- Ejercicio 4 (5 Bitpoints). Ejercicio Libre. Premiar la creatividad. Entregar por redes sociales o github: Pantallazos, enlaces, vídeos, etc...
Ejercicios entregados
Ximo Catalá
Ejercicio 1
- Vídeo en Youtube:
Ejercicio 2
- Vídeo en Youtube:
Ejercicio 3
- Vídeo en Youtube:
Ejercicio 4
- Vídeo en Youtube:
Federico Coca (fgcoca)
Ejercicio 1
- Vídeo en Youtube:
Ejercicio 2
- Vídeo en Youtube:
Ejercicio 3
- Vídeo en Youtube:
Ejercicio 4
- Vídeo en Youtube:
SrViriato
Ejercicio 1
Ejercicio 2
Ejercicio 3
Ejercicio 4
Autor
- Juan González-Gómez (Obijuan)
Licencia
Créditos y agradecimientos
Enlaces
- Repositorio con las colecciones de la Academia Jedi de Hardware
- BricoGeek. Tienda Friki donde comprar componentes electrónicos
- Repositorio de la Icezum Alhambra
- Documentación de la Icezum Alhambra: (PNG)(SVG)(PDF)
- Icestudio
- Monedas Bit imprimibles
- Printbot Beetle
- Ultimate Gripper
- Pinza paralela
- Robot Educativo Zowi
- Qué es PWM y para qué sirve. Entrada en el bloq de Rincón Ingenieril
- Repositorio de PCBPrints
- PCBPrint Alhambra-Button
- PCBPrint Alhambra Switch
- Soporte Icezum Alhambra
- Soporte para Servo Futaba 3003
- Puntero para servo Futaba 3003
- Clavijas de amarre para servos
- Tablero indicador binario para servo
- Fijador de esquinas
- Fijador de cables
- Fijador de placas
- Octopus passive buzzer, de Elecfreak
- Kit de sensores para Arduino. BricoGeek. Dentro del kit con 37 módulos, hay uno con zumbador
Preguntas frecuentes
- ¿Dónde puedo conseguir la placa Icezum Alhambra?
Pueden conseguir una desde Alhambrabits
-
¿Dónde puedo comprar material electrónico?. Hay muchos sitios. Uno muy bueno es Bricogeek
-
¿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
- Los pulsadores de la Icezum Alhambra no me funcionan
Eso es debido a que se han metido restos de flux y no hacen buen contacto. En el apartado ¡No me funcionan los pulsadores! del Tutorial 9 se indica cómo solucionarlo fácilmente
- ¿Dónde puedo encontrar más información sobre las señales PWM?
Echa un vistazo a este post de Rincón Ingenieril sobre el tema
- He conectado un pulsador externo pero no me funciona. He hecho un circuito para conectar el botón con un led, y al apretar se enciende el LED, pero luego no se apaga. NO funciona bien
Los pulsadores externos que se conecten a los pines de 5v de la Alhambra (D0 - D13) tiene que llevar una resistencia de pull-up o pull-down con valores entre 460 ohm y 2K. Típicamente usamos 1K. Esto hace que los conversores de nivel se configuren como entradas y que el pulsador funcione correctamente. Puedes encontrar más información En este enlace
-
¿Donde puedo conseguir el switch que habéis usado en la PCBprint Alhambra switch? Es el mismo switch que se ha usado en la propio Icezum Alhambra (aunque la versión sin acodar). Los fabricantes los puedes encontrar en la lista de componentes de la propia icezum Alhambra. La referencia del componente en concreto es esta: Slide Switch, SPDT, On-On, Through Hole, WS-SLTV Series, 500 mA. Yo te recomiendo que uses la PCBprint de Diego Lale, que usa interruptores que puedes conseguir en Bricogeek: Mini-interruptor de 3 pines
-
¿Dónde puedo conseguir el servo de rotación continua SM-4303R?
Es un servo muy usado y muy estándar. Si buscar por internet encontrarás muchos sitios donde los vendes, a diferentes precios. Aquí en España se puede conseguir muy fácilmente a través de BricoGeek: Servo SM-4303R Bricogeek y también en Iberobotics: Servo SM-4303R Iberobotics
- Parece ser que los servos Futaba 3003 se pueden trucar para convertirlos en rotación continua. ¿Conoces algún tutorial sobre como hacerlo?
El Futaba 3003 es uno de los servos que típicamente se han trucado para construir robots móviles con ellos. Robots como Tritt, El Skybot o el Miniskybot los utilizan. Existen muchísimos tutoriales para hacerlo. En esta página puedes encontrar todas las formas de trucarlos. El que recomendamos es el caso 2
-
Ya tengo varios PCBprints impresos (de los LEDs y los pulsadores. ¿Dónde podría conseguir los cables que usas para conectarlos directamente a la Icezum Alhambra?
Son cables hembra-hembra de tres hilos. Como son los mismos que se usan para la conexión de servos, los puedes encontrar en tiendas donde vendan cualquier tipo de servo. Por ejemplo:
- En Pololu: https://www.pololu.com/product/779
- En hobby king: https://hobbyking.com/en_us/10cm-female-to-female-servo-lead-jr-26awg-10pcs-set.html?___store=en_us
También se pueden usar cables hembra-hembra aislados. A partir de ellos es muy fácil trenzarlos y hacerte tu propio cable de 3 pines:
- Adafruit: https://www.adafruit.com/product/266
- En Bricogeek: http://tienda.bricogeek.com/cables/585-set-de-cables-h-h-10-unid.html
- En Iberobotics: Aquí también tienen los hembra-hembra: https://www.iberobotics.com/comprar/electronica-componentes/cables-y-conectores/ Es otra tienda española que está en Santander