[Icestudio] Circuito de ejemplo de apertura de una cerradura

310 views
Skip to first unread message

Obijuan

unread,
Dec 2, 2017, 3:04:24 PM12/2/17
to FPGAwars: explorando el lado libre
Hola!

Angel millán es un profe de tecnología en un Instituto de Sevilla. Me ha preguntado por privado cómo se podría hacer un circuito que abriese una puerta/caja fuerte al introducir una secuencia por los dos pulsadores de la Icezum Alhambra. Me ha parecido interesante comentarlo en el grupo. El planteamiento del problema, en palabras de Angel, sería este
 
·
El planteamiento sería el siguiente:
- Disponemos de dos pulsadores (A y B), por ejemplo, y un servomotor (que iría instalado, por ejemplo, en la cerradura de una puerta o una caja fuerte.
- Pretendo que el servo se active después de que se introduzca una "clave" con una secuencia concreta de pulsaciones de A y B. Por ejemplo: AB, AAB, AABA ó AABAB (la que se fije de antemano).
- El servo debería permanecer girado un tiempo tras la activación y volver a su posición de reposo pasado ese tiempo.
·

La solución que se me ocurre es dividir el problema conceptualmente en dos circuitos:

1) El primero es el que detecta la secuencia que abre la puerta/caja. Por ejemplo AAB. Cuando la detecta, activa una señal de OK
2) Un segundo circuito que mueve el servo y lo deja en una posición durante un tiempo, y luego vuelve a la de reposo

El circuito 2 es sencillo. Basta con conectar un bloque temporizador a un servo. Este temporizador se activa con la señal de clave ok

El circuito 1 es un autónoma finito. Esto siempre es tedioso de implementar  con puertas lógicas. En verilog se resuelve muy fácil, pero claro, hay que saber Verilog. La solución que yo he usado es usar una memoria como circuito combinacional para calcular el siguiente estado a partir del estado actual y las entradas

Mi solución en Icestudio es la que adjunto en el .zip, junto a un pantallazo .png

La memoria es de 16 posiciones y en cada una se almacenan 2 bits.  Estoy implementando un autómata finitio de 4 estados, para detectar la secuencia AAB (A=pulsador 1, B = pulsador 2). La memoria la tengo dividida conceptualmente en 4 bloques de 4 posiciones. Cada bloque se corresponde a un estado del autómata. Dentro de cada bloque se almacena el número del estado siguiente correspondiente a los 4 casos de los pulsadores. Así, la posición 0 contiene el siguiente estado cuando estamos en el estado 0 y no hay ningún pulsador pulsado. La posición 1 contiene el siguiente estado cuando estamos en el estado 0 y el pulsador B está pulsado, pero el A No lo está.... y así con todos

El contenido de la memoria se lee del fichero autom1.list:

0  // 0
0  // 1
1  // 2
0  // 3
1  // 4 ---------
0  // 5
2  // 6
0  // 7
2  // 8 ---------
3  // 9
0  // 10
0  // 11
0  // 12 ---------
0  // 13
0  // 14
0  // 15 

Cambiando los números de la primera columan, modificamos el autómata

Saludos, Obijuan

cerradura-fpga.png
cerradura-fpga.zip

Ángel Millán

unread,
Dec 2, 2017, 3:36:58 PM12/2/17
to FPGAwars: explorando el lado libre
¡Muchas gracias por la velocidad de respuesta!
Probaré el resultado, y sorprenderé a mis alumnos.

Una duda: ¿El circuito 1 podría implementarse únicamente con biestables (D o JK), aunque hubiera que rediseñar el mismo para cambiar la clave (a costa, claro está, de la elegancia de la solución propuesta)?

Ese fue mi enfoque inicial (el de los biestables), porque creía que esta vía sería más didáctica para alumnado de 4º de E.S.O., pero no llegué a obtener un resultado satisfactorio. 

En fin, ahí queda...

Juan Gonzalez Gomez

unread,
Dec 3, 2017, 1:26:20 AM12/3/17
to FPGA-WARS: explorando el lado libre
Si, claro. El autómata lo puedes implementar como quieras. La forma clásica es con biestables y puertas lógicas. Yo he usado un registro de 2 bits + memoria. Este registro lo pones como 2 biestables D separados y la tabla de memoria la implementas con puertas lógicas

Saludos, Obijuan

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/07bc2e90-e25e-4045-93ec-b9824b091dda%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

i.hernandez

unread,
Dec 3, 2017, 9:31:58 AM12/3/17
to FPGAwars: explorando el lado libre
He visto que hay un bloque de un reloj, que por lo que he visto está X tiempo activo y luego se desactiva.

¿Como hago para meter en mi biblioteca ese reloj? Lo pregunto porque al abrir el bloque del reloj solo me abre en "modo lectura" y en este modo no puedo guardalo para meterlo en la biblioteca. Tiene alguna solución?

Por cierto impresionante la máquina de estados es un tema que se me escapa un poco. Gracias

Democrito

unread,
Dec 3, 2017, 10:52:25 AM12/3/17
to FPGAwars: explorando el lado libre
Abre dos Icestudios para hacer esta prueba. En uno con lo que quieres copiar, un circuito completo por ejemplo, señalas lo que te interesa y pulsas "control C", en el otro Icestudio pulsa "control V" y verás que se ha realizado la copia. Ese segundo Icestudio puede ser un circuito que estés montando, no hace falta que sea en blanco.

Democrito

unread,
Dec 3, 2017, 11:10:17 AM12/3/17
to FPGAwars: explorando el lado libre
Se que no es la respuesta que buscabas, pero es una manera de "ir pillando" elementos de otros circuitos.

El repositorio más completo (hasta donde yo sé) lo tiene Obijuan aquí:


Te pillas el zip y te vas a Icestudio y le das a: Tools ----> Collections ----> Add

Democrito

unread,
Dec 3, 2017, 11:22:13 AM12/3/17
to FPGAwars: explorando el lado libre
Se me olvidaba.

Una vez cargada la colección haz lo siguiente para poder ver/utilizar dicha colección:

Select -----> Collections -----> Makespace-17 (o el nombre que le hayas puesto si lo cambiaste)

Democrito

unread,
Dec 3, 2017, 11:33:09 AM12/3/17
to FPGAwars: explorando el lado libre
Y esto que te voy a comentar ahora no lo he probado, pero parece evidente ser así:

1) Borras todas las colecciones. Esto es opcional.

2) Tomas el zip de por ejemplo Obijuan (anterior mencionado), y dentro verás que hay carpetas, en la carpeta que te interese (o creas tú una nueva) pones el elemento (el ICE) que te interesa. Todo esto ha de ser dentro del zip (o si está descomprimido, lo "zipeas" después).

3) Añades esa colección (explicado arriba), con el nombre que gustes, por ejemplo "Mi colección".

El problema es que para cada elemento que añadas has de hacer este proceso.

i.hernandez

unread,
Dec 3, 2017, 2:49:13 PM12/3/17
to FPGAwars: explorando el lado libre
Gracias Democrito es mismo es lo que estoy haciendo para ir creando la colección que me interesa. Como comentas el problema es que no se puede extraer un bloque de un circuito y guardar en una biblioteca sino que hay que copiar y pegarlo desde el circuito. Salu2

Jesús Arroyo

unread,
Dec 6, 2017, 7:11:23 AM12/6/17
to FPGAwars: explorando el lado libre
Buenas,

Añadir bloques a través de una colección es una forma de hacerlo, pero no la única.

Se puede añadir cualquier proyecto ICE como bloque seleccionando en "File > Add as block...". Así añadir un bloque, por ejemplo el temporizador, es tan sencillo como descargarse el fichero (link de Github Raw > Guardar como...) y añadirlo a vuestro proyecto de Icestudio.

Os comento también que cuando se añade una colección, todos los bloques están accesibles en forma de proyecto. En el menú "File > Blocks" podéis abrir todos los bloques para modificarlos y guardarlos como ficheros ICE, y posteriormente incluirlos en otros proyectos, añadirlos a una colección personalizada, etc.

Un saludo.

i.hernandez

unread,
Dec 7, 2017, 3:08:50 PM12/7/17
to FPGAwars: explorando el lado libre
Gracias Jesus por los comentarios, no sabía que el reloj estaba en esa colección, ya la he metido en la mía.

Lo que comentaba con Democrito y creo que también lo he comentado con algún otro es que hechamos poder guardar para una colección un componente que esté en un circuito pero no se sepa de que colecciónes. Por ejemplo el circuito que ha subido obijuan tenía un reloj. Me ha parecido interesante, pero no lo podía meter en mi colección porque no sabía en que colección estaba creada. Porque al hacer doble click sobre el reloj puedes ver las tripas pero está a modo lectura por lo que no puedes modificar, ni copiar, ni crear un bloque de las tripas... Por ese motivo la única manera de poder usar el rejos (si no tienes acceso a la colección madre) es guardando el rejos en un ficher ICE pero no como bloque y cuando lo quieras usar buscar ese archivo ICE abrirlo copiar el bloque y pegarlo en tu proyecto.

No se si se entiende del todo lo que comento, es lo que le hecho en falta. Un saludo y gracias por esta estupenda herramienta y placa
Reply all
Reply to author
Forward
0 new messages