-
Notifications
You must be signed in to change notification settings - Fork 1
01. Transmisión de 32 bits por un puerto serie
Cuando se mida el ancho de un pulso, vamos a obtener una palabra de 32 bits (8+8+8+8) que más tarde querremos enviar por un puerto serie con el objetivo de emplear un programa terminal serie o un programa a medida realizado en processing para obtener los datos en ms, ns, sg ... o convertirlo a la unidad de medida deseada (velocidad, metros...)
Como primer parte del proyecto vamos a mostrar un módulo que hemos llamado "Send32.Ice" que se encargará de serializar los 32 bits que recibe como dato por el puerto serie cada vez que se introduzca un "tic" de inicio que desencadenará el envio serie de los 32 bits.
El patillaje general del módulo es el siguiente:
Podemos ver con un poco más de detalle las partes de que se compone el módulo:
En a,b,c,d tenemos 32 bits que queremos transmitir por el puerto serie cada vez que se detecta un Tic ( flanco de subida-bajada del ancho del periodo del reloj de 12Mhz ).
Cada vez que se recibe un "tic" por "TicStart" el biestable RS cambia a "1" habilitando el contador de 2 bits que nos hará el control de la multiplexación de los 4 bytes a enviar.Una vez el contador se desborde,osea, vuelva a cero, el biestable RS se reseteará y dejará deshabilitado el contador.
Se crea un módulo que producirá un cambio de estado ( de 0 a 1, de 1 a 0 ... ) cada vez que el contador se incremente con la excepción de cuando cambie de 3 a 0 (desbordamiento) ya que no habrán más datos a enviar (multiplexar), el cambio de estado será aprovechado por un bloque detector de cambio de estado para producir un "tic" al módulo transmisor serie cada vez que hay un cambio, provocando así el envio de cada uno de los datos por el puerto serie.
Se aprovecha señal "done" del puerto serie para incrementar el contador (multiplexar al siguiente dato a enviar ) y cambiar de estado en el módulo detector de cambio de estado para que transmita el siguiente dato si queda algún dato por enviar.
Mostramos un primer ejemplo donde se introduce una palabra de 32 bits para transmitir la palabra "HOLA".
Al conectar la FPGA por el puerto USB se crean dos conexiones serie:
- Lattice FTUSB Interface Cable (Interface 0), por dicha conexión se realiza la carga del "bitstream" a la FPGA.
- Lattice FTUSB Interface Cable (Interface 1) que se convierte en un puerto COMxx por el cual se establece una conexión que aprovecharemos para conectar con un programa terminal o un programa propio para la recepción de los 32 bits.
Podemos ver la imagen de los puertos en uso:
Configuramos el COMxx adecuado y la velocidad.
Configuramos las pestañas de la consola que queremos ver, para este ejemplo marcamos "ascii,binario,decimal,mixta y receive" indicamos que los datos que vamos a recibir son del tipo "uint32" y seleccionar como "endianness = big-endian ".
Una vez cargado el ejemplo podemos abrir el "Scriptcomunicator" conectar al COMxx deseado y ver como cada 2 segundos se envia la palabra HOLA.
Podemos ver un ejemplo en el siguiente video.
donde podemos ver en función de la pestaña seleccionada, el dato en distintos formatos ( Ascii,binario,decimal y mixto).
Mostramos ahora un segundo ejemplo donde se introduce un número decimal ( debe ser menor que 2^32 - 1 ) que será enviado por el puerto serie ( 32 bits ) cada 2 sg. Este número podría ser por ejemplo la cuenta de un contador de 32 bits, un valor analógico, el ancho de un pulso medido ...
Tras cargar el ejemplo en la FPGA y abrir el "Scriptcomunicator" conectando en el COM adecuado, podemos ver como recibimos los datos cada 2 sg y seleccionando las distintas pestañas de la consola, los podemos ver en distintos formatos.
Hemos visto como utilizar un módulo verilog (Send32.ice,Send32_A.ice,Send32_B.ice) realizado para Icestudio que nos ayudará en la captura de datos de 32 bits de longitud y su envio en paquetes de 8 a través de un puerto serie.
NOTA: La aplicación debe tener en consideración que el procesado y envio por el puerto serie de 32 bits, necesitan un tiempo por lo que la orden de envio ( el tic de inicio ) se debe moderar para que haya dado tiempo al puerto serie a enviar el dato anterior, si no se tiene en consideración este detalle, se podrán solapar datos y como consecuencia, se enviarán datos erróneos por el puerto serie.
Si los datos que se quieren enviar son muchos y se generan con mucha rapidez por el sistema, no se podrán enviar todos ya que de un dato a otro no habrá dado tiempo al puerto serie a enviar toda la información, en estos casos, se deben adoptar las estrategias más adecuadas, en función de la necesidad/tolerancia de la aplicación en desarrollo.
Una opción es guardar todos los datos en una memoria,FIFO,buffer donde se puedan capturar e ir extrayendo por el puerto serie sin solapamiento de datos.
Si la aplicación lo permite, se pueden perder datos y no enviar tantos datos por el puerto serie de forma que le de tiempo al puerto serie a enviar el dato antes de que le llegue el siguiente. ( Por ejemplo enviar uno de cada X datos generados).