El 25/05/17 a las 14:40, Juanma Rico escribió:
> ¿Es muy difícil manejar un bus Wishbone?
No, es muy simple.
> ¿Da muchos problemas?
Para nada.
Si no entiendo mal lo que necesitás es escribir un maestro WISHBONE.
La interconexión es muy simple.
Yo uso un script que la genera, aunque de momento solo soporta VHDL.
Me podría poner a ver si puedo hacer que genere Verilog, lo voy a
necesitar hacer de todas maneras.
> ¿Es mejor hacer las pruebas con SPI-UART o es quizás mejor hacerlo por
> separado para no hacer doble trabajo después y con la idea de poder
> conectar algo más al bus Wishbone y eliminar la UART del core si no
> hace falta?
No se muy bien que es lo que querés hacer, pero si la idea es luego
volar la UART yo diría que es mejor trabajar con los cores separados.
> Si alguien tiene experiencia en el bus Wishbone, su manejo en Verilog
> y me puede aconsejar le estaría tremendamente agradecido... :))
Yo siempre lo usé en VHDL, pero la idea base es la misma.
En la especificación explica como es un ciclo de lectura o escritura.
Adjunto una presentación simple que usé varias veces para explicar lo
básico.
Saludos, Salvador
--
El 25/05/17 a las 13:17, Juanma Rico escribió:
[snip]
> De todo esto ya habló Unai en el hilo referido y se llegaron a
> conclusiones interesantes y genéricas, pero quedaba por ver las
> posibilidades de nuestra FPGA y concretar en ella. Lo ideal es que ya
> existiera el módulo SPI en un módulo "hard IP core"... pero la
> cuestión es que por más que busco no encuentro que en nuestra iCE40HX
> se disponga de dicho módulo SPI para otro uso que no sea la
> programación del chip (ver Technical Note TN1248 tabla 1). Otros chips
> de la familia
> <https://en.wikipedia.org/wiki/ICE_%28FPGA%29#iCE40_.2840_nm.29> sí lo
> admiten (pero el nuestro no... nuestro "gozo en un pozo").
Correcto, es una línea diferente a la HX.
> Así que habrá que sintetizar un módulo SPI para comunicar con la
> flash... pero surge otra duda... lo suyo sería usar en dicho módulo
> los pines ya conectados en nuestra tarjeta... ¿Se puede hacer?
Si.
> ¿No afectaría al "boot" normal de la configuración de la FPGA?
No.
> ¿Cómo se hace? :)))
De la forma más natural. Cuando la FPGA no está configurada (antes del
boot) esos pines se conectan al core SPI interno que configura la SRAM
interna. Cuando la FPGA se configura y "bootea" esos pines son lo que
uno le haya dicho en el HDL. Mi primer prueba del SPI de Lattuino fue
leer el ID de la memoria de configuración.
[snip]
> Si alguien estuviera interesado, supiera guiarme, darme pistas o
> incluso sintetizar el módulo SPI... sería perfecto. :)))
Estoy un poco tapado de cosas, pero te comento que el SPI del Lattuino
ya está portado a Verilog.
Saludos, Salvador
Este es el código sketch que probé:
// include the SPI library:
El 29/05/17 a las 16:18, Juanma Rico escribió:
>
> ¡¡Guauuu!! Gracias Salvador, menudo empujón que me has dado... :))
>
> Ya he estado haciendo pruebas con los cambios y comentarios que me
> sugeriste.
> El /*flash_ok */no consigo hacer que funcione... de momento estoy
> haciendo pruebas enviando caracteres a la UART. Ahora recibo bytes
> (creo) de la flash, pero no sé si son los correctos, el protocolo que
> sigo:
>
> Envío una "A", lo que me devuelve una "K" de confirmación y envía a la
> flash el 0xAB para que la /*princesita*/ (la flash) despierte del
> /*sueño profundo*/ en el que ha caído por culpa de la /*bruja*/
> (FPGA)... Sinceramente no sabía que el cuento era así... :)))
:-)))
A mi me dio bastante dolor de cabeza la princesita dormida cuando
modifiqué el flashrom. Hasta que vi bien lo que decía la datasheet de la
iCE40.
> .tx_i (data_spi), // Presupongo que es el byte que se le envía al SPI.
> // Yo la defino como "reg[7:0]".
Si, lo que esté ahí es lo que se envía.
> .rx_o (data_flash), // Creo que es el byte que proviene del SPI.
> // La defino como "reg[7:0]".
Si, tené en cuenta que en el SPI se recibe mientras se envía. No existe
"solo enviar" o "solo recibir".
Lo normal es enviar 0s cuando estás queriendo leer una respuesta.
> .busy_o(), // Imagino que es un flag de "ocupado recibiendo
> un byte" que se puede consultar.
> // Yo no la defino.
Si es algo así, aunque teniendo en cuenta lo que te digo arriba es
"transmitiendo un byte". Jamás deberías levantar start mientras busy sea 1.
Con tu mecanismo "manual" supongo que no es necesario que lo leas, pero
en cuanto quieras transmitir automáticamente vas a tener que leerlo.
> .irq_o(flash_ok), // Imagino que es una señal que se activa cuando
> el rx_o del SPI está preparado.
Si. La idea es que esto genere una interrupción a la CPU.
> // Tengo problemas con esta señal, no sé si definirla como "reg" o
> como "wire".
> // Cuando me da error le cambio la definición
> y sintetiza pero
> // en un "if" parece no funcionar.
De tu lado es un wire. La idea es que irq_o pasa a 1, vos leés el valor
que está en rx_o y avisás con ack (un pulso).
> .ack_i(ack), // Ok, es la señal que "rearma" la interrupción.
> // No sé como definirla, me da errores en
> ambas "reg" y como "wire".
Depende de como armes tu core. Con que dure un pulso de reloj alcanza.
Puede ser un reg. Lo más lógico es que armes una máquina de estados que:
1) Espera a recibir la orden de transmisión
2) Levante start
3) Baje start
4) Espere a que irq_o sea 1
5) Retire rx_o
6) Levante ack
7) Baje ack
8) Vuelva a 1
Esto se puede hacer con 2 estados:
IDLE, espera a que tenga que transmitir, mantiene ack en 0, si tiene que
transmitir levanta start
WAIT, mantiene start en 0, espera a que irq_o sea 1. Cuando irq_o es 1:
copia rx_o y levanta ack.
Acá start y ack son 2 FFs separados del FF que codifica el estado. Con
más estados serían cables.
> El resto de señales creo que no necesitan interpretación.
> La cuestión es que no me va la lectura de la flash... :(((
> Voy a intentar el */sketch/* que me has puesto con el */Lattuino/* a
> ver si soy capaz de sacar alguna conclusión.
Miralo bien, es importante lo que hace con SS. En tu caso SS bajaría a
0, mandás Wake-up, ponés SS en 1. Luego para leer el ID: bajás SS,
enviás 0x9F, enviás tantos 0s como bytes quieras leer del ID, subís SS
Saludos, Salvador
Hola José,
Lo primero pedirte disculpas por tener abandonado en el proyecto del PID, veo que en ese hay muchas personas que te pueden ayudar, pero también veo que el proyecto del Warm/Cold Boot estaba parado y solo estoy yo y... pocos más... Unai está desaparecido... :-P (Espero esté bien).
La cuestión es que (gracias al empuje de Salvador y su Lattuino) he retomado el tema porque me gustaría cerrar el círculo de esta posibilidad que nos brinda nuestra placa. La placa tiene un chip FPGA limitado y hay que estrujarlo al máximo y con ello los chips que le rodean... eso si queremos que sea una placa competitiva y poder usarla a tope... para ello hay que poder acceder directamente a la flash desde la FPGA y, como no dispone de ello en el hard-core (otra limitación, en este caso de la familia HX), sintetizar y saber controlar un módulo SPI... en ello estamos. :)))
Una vez controlado el acceso a flash ya se podrá usar, no solo para el sistema Warm/Cold Boot, sino para guardar cualquier tipo de información (se me ocurre en el proyecto del PID poder guardar un histórico de señales o parámetros "no volátiles" de sintonización que se necesiten... y miles de otros circuitos que seguro necesitarán de una memoria no volatil...).
Respecto a OpenCores... sí, tienes razón hay muchos módulos en Verilog (y algunos muy interesantes), el tema está en que si usas icestudio pocas ventajas vas a tener.
Icestudio (a mi entender) tiene ese problema, fallo, handicap, limitación... como quieras llamarlo, es una cuestión de concepto... y es que reutilizar código de terceros que no estén hechos en icestudio es complicado (no se diseñó para eso), lo único que puedes hacer es encerrarlo en una cajita y volcar el código en un bloque de código... pero poco más... y a partir de ahí tienes que seguir usando icestudio, no puedes volver atrás (al menos no fácilmente)... y sinceramente, no sé si el esfuerzo merece la pena (al menos en fases de pruebas), ya bastantes problemas te da echar a andar un módulo que no has hecho tú y "simplemente" hay que comprenderlo un poco y copiar un fichero para sintetizarlo (Jesús no estaría de acuerdo conmigo, claro... :))) ).
Pero no quiero desanimarte, si tú usas icestudio y te ves con ánimo, adelante. Imagino que ese bloque que adaptes, si funciona, lo terminarán usando otros muchos usuarios de icestudio.
Icestudio es una herramienta que, de alguna u otra forma, también puede potenciar nuestra placa... y más ahora que van a haber como 250 nuevos propietarios de una recién salida de fábrica. :)))
Imagínate si tu esfuerzo sirve para que estos 250 no tengan que pelearse con un módulo SPI y simplemente utilizarlo uniendo líneas con otros módulos que ellos hayan creado y que esos nuevos los pongan a disposición de los demás... Icestudio se llenaría de módulos en muy poco tiempo... es para estar orgulloso... yo lo estaría. :)))
--
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.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/ae6aed89-5ea9-46a0-b631-321701a4b2bc%40googlegroups.com.
Hola Juanma:
El 30/05/17 a las 14:12, Juanma Rico escribió:
>
> Buenas Salvador,
>
> Sí, no entra casi nada en la iCE40HX-1k...¡Que malo eres! nos pones
> delante la zanahoria del /Lattuino/ y vemos como con desesperación no
> llegamos a ella....¿Seguro que no se puede usar una DRAM externa o
> algo similar con la suficiente velocidad como para que sirva de
> memoria principal al AVR y meterle un "chute" de memoria a la iceZUM
> Alhambra? :)))
Eso resolvería el problema de la memoria de programa/RAM, pero no el de
los periféricos.
>
> ¡al final vas a hacer que me tenga que construir la Kéfir-8k!
> jajajajajaja :))
:-)))
>
> Por otra parte...
> Sí, estuve echando un vistazo a la secuencia y encontré varios fallos
> en mi forma de pensar el protocolo (seguramente por mi falta de
> práctica en el SPI... creo que mi mente está más hecha al I2C).
Lo más recomendable es que mires la hoja de datos de alguna de las
memorias. Suelen tener dibujada la secuencia en que se mueven las señales.
> Así que con esto y lo que me has comentado en el mensaje anterior de
> las señales del "/Interface/" del bloque *SPI_master.v* espero poder
> ya centrar el problema.... Por cierto... ¿Este /interface/ del módulo
> SPI es un /interface/ propio? He estado buscando por el proyecto de
> github y no he encontrado ninguna referencia al mismo (igual no he
> buscado bien).
No se si interpreto bien la pregunta. Las señales que usa el core para
comunicarse con el exterior son más o menos las mismas que usa cualquier
otro core, hay algunos detalles de las señales que tienen que ver con
como funcionan el AVR y sus periféricos. En cuanto a la implementación
interna del core: fue hecha desde 0, fijate que hay otra diferente en el
repo, pero estaba más pensada para otros usos.
>
> A mi personalmente me aclararía mucho (soy eminentemente visual, lo
> tengo que dibujar todo) e imagino que siempre viene bien tener todas
> las señales de los procesos básicos en una imagen, no tienes que leer
> código y la mente no se te dispersa en la secuencia el mismo. Por
> supuesto es una sugerencia... creo que didácticamente sería una
> herramienta útil para comprobar el funcionamiento de un bloque. :)))
Al menos en Linux basta con instalar make, gtkwave y ghdl y correr:
$ make test_m
$ gtkwave Work/spi_controller_tb.ghw
Adjunté las formas de onda de el test de spi_controller (el otro core)
pidiendo el ID a una S25FLxxx (simulada)
Saludos, Salvador
No es imposible, pero lleva tiempo.
Yo para soldar el prototipo usé una estación de soldadura PACE con una
punta bien finita y un videoscopio, que es más cómodo que una lupa.
Estoy viendo si le puedo hacer llegar a Obijuan los PCBs de Milk y
Kéfir, junto con los componentes, para que pueda armarla.
El diseño fue pensado para que sea lo más simple posible, no es
indispensable usar un horno de refusión y pasta de estaño, el PCB es de
sólo 2 caras, etc. Pero los componentes como la FPGA tienen un paso
fino, aún cuando es el encapsulado más fácil de soldar de la iCE40,
pensá que hay de 16 bolitas en 1,4x1,5 mm ;-)
>
>
> >
> > Por otra parte...
> > Sí, estuve echando un vistazo a la secuencia y encontré varios
> fallos
> > en mi forma de pensar el protocolo (seguramente por mi falta de
> > práctica en el SPI... creo que mi mente está más hecha al I2C).
>
> Lo más recomendable es que mires la hoja de datos de alguna de las
> memorias. Suelen tener dibujada la secuencia en que se mueven las
> señales.
>
>
> ¡A sus órdenes! Eso haré... Me da un poco de pereza, la verdad... pero
> lo haré. jajajajajajaja :)))
Te lo ahorré con la captura ;-)
Saludos, Salvador
Y eso es todo... ya en teoría podemos escribir/leer directamente en la flash desde nuestra propia FPGA instanciando un módulo SPI... queda establecer toda esta secuencia en una máquina de estados y hacer pruebas de escritura por subsectores... y sobre todo aplicar esto a modificar directamente la cabecera de la flash para poder cambiar los vectores del Cold/Warm boot y así poder elegir entre 127 imágenes sintetizadas desde la propia FPGA..... ¡Sin ningún PC conectado, sin usar iceprog! :)))
Un pasito más...
Saludos.
Pdta: Calmado mi SAV, os recuerdo que el módulo SPI no solo es útil para grabar nuestra flash interna (esa era mi "batalla" particular para usarla con el Cold/Warm boot)... con los pines redirigidos adecuadamente desde la FPGA podemos ya comunicarnos con cualquier dispositivo externo que necesite SPI, al igual que Obijuan ha usado el módulo I2C para comunicarse con el chip ADC interno de la placa, pueden usarse estos mismos módulos para comunicarnos con cualquier otro dispositivo externo... unos cablecillos y listo... a ver quién es el primero... ¡¡lanzado está el reto!! :)))
Pdta2: Si alguien reproduce el experimento (con el binario no llega ni a 10 segundos) me gustaría quedara constancia de la ID de la flash... a modo de trofeo. Escribid un mensaje con las capturas de los ID's en este mismo hilo si lo conseguís. :)))
--
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 una entrada 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 este debate en la Web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/0d5d208e-2168-4ae4-92f3-9dc15e7284ff%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Con esto podemos leer la memoria completa pulsando las teclas 4 y 5 repetidamente (os sorprendería ver lo que guarda la memoria de vuestra flash después de unas cuantas programaciones de prueba... ;P).
En cuanto tenga otro hueco (no sé cuando) intentaré establecer la dirección de lectura mediante otro comando y así poder leer los vectores de la applet, con los vectores obtenidos podemos acceder a los nombres de las imágenes que contiene la flash (si se ha usado el icemulti modificado para ello) y así poder extraer el listado (opción iceprog -l del iceprog modificado) con la idea de poder decidir qué imagen intercambiar con los vectores seleccionables por Warm boot y así cambiar el bitstream "ejecutable" por la FPGA.
Tened en cuenta que por ahora uso la UART por comodidad para las pruebas (enviar comandos y recibir información por el puerto serie), pero la idea final es que los comandos se puedan enviar por simples botones (o un pequeño teclado) y la información pueda ser reflejada en un LCD o similar, de tal forma que hagamos innecesaria la conexión con el PC (o MAC) para cambiar el bitstream interno de la FPGA. De esta manera damos mayor independencia a la placa para cambiar su comportamiento.
Ahora elijo el bitstream 3 y es un robot de sumo... ahora elijo otro bitstream y es un sigue líneas... ahora elijo el circuito que sinteticé para salir de un laberinto... en fin, lo que se os ocurra... la versatilidad de la FPGA ya la conocéis. :))))
--
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...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/8332bde9-3425-4828-8c96-fc9217970d6cn%40googlegroups.com.