Skip to content

01. Transmisión de 32 bits por un puerto serie

jospicant edited this page May 29, 2019 · 2 revisions

Introducción

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:

Send32.ice

Podemos ver con un poco más de detalle las partes de que se compone el módulo:

Detalles Send32.ice

Descripción:

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.

Ejemplo1

Mostramos un primer ejemplo donde se introduce una palabra de 32 bits para transmitir la palabra "HOLA".

Ejemplo1

Paso1. Conectar FPGA (Icestick u otra similar)

Icestick

Al conectar la FPGA por el puerto USB se crean dos conexiones serie:

  1. Lattice FTUSB Interface Cable (Interface 0), por dicha conexión se realiza la carga del "bitstream" a la FPGA.
  2. 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:

Puertos

Paso2. Configuramos el "Scriptcomunicator"

Configuramos el COMxx adecuado y la velocidad.

Config1

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 ".

Config2

Paso3. Cargamos el "bitstream" del ejemplo

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.

video Ejem1

donde podemos ver en función de la pestaña seleccionada, el dato en distintos formatos ( Ascii,binario,decimal y mixto).

Ejemplo 2.

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 ...

Ejemplo2

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.

Recepción de un número de 32 bits

Resumiendo:

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).