Tabla de contenido:

Haga cualquier sensor con una FPGA: 4 pasos
Haga cualquier sensor con una FPGA: 4 pasos

Video: Haga cualquier sensor con una FPGA: 4 pasos

Video: Haga cualquier sensor con una FPGA: 4 pasos
Video: FPGA#04 Implementar comunicación UART - camino a FPGA 2024, Noviembre
Anonim
Image
Image
La FPGA
La FPGA

La mayoría de los fabricantes intentaron construir al menos una vez en su vida un termómetro, tal vez el que tienen en casa no sea lo suficientemente inteligente, o tal vez piensen que pueden construir el próximo NEST. Sin embargo, en algún momento tuvieron un microcontrolador con su software de última generación conectado a un sensor de temperatura (y tal vez a otros sensores: presión, luz). Hasta ahora todo perfecto, el software está funcionando y el sensor está detectando. ¡Probémoslo!

Hmmmm… tal vez debería calentar el sensor con un secador de pelo y enfriarlo con hielo, funciona por un tiempo. Pero no parece profesional, el sensor cambia los valores demasiado rápido si lo calientas, no se calienta más de un par de grados. ¡El proyecto es un fracaso! Pero el algoritmo es nuevo, tiene en cuenta muchos factores, qué lástima que se haya quedado atascado en esta cosa estúpidamente menor.

Mi solución es la siguiente: hacer que una FPGA actúe como un sensor con valores transmitidos desde una PC (o almacenados en la memoria, o creados ad-hoc dentro de la FPGA). Entonces, para su preciosa MCU, la FPGA parece un sensor, pero no cualquier sensor: el sensor que desee. Tal vez decidas que necesitas más resolución o un tiempo de respuesta más rápido de lo esperado, tienes que cambiar el sensor. Pídelo online, llegará en un par de días, de un par de meses, quién sabe. Vuelva a girar su PCB o solicite un módulo con el nuevo sensor. O … un par de clics y la FPGA se configura como su nuevo sensor y puede emular la configuración interna exacta.

En el momento de escribir esto, la FPGA podría actuar como un LM75 con datos de temperatura almacenados en BRAM (en la FPGA).

Paso 1: la MCU

Mi MCU de elección es un LPC4337 en un LPCXpresso. Encima tengo un escudo (LPC General Purpose Shield) con una pantalla y un sensor LM75 real. LPC4337 es un ARM Cortex M4 que se ejecuta a 200MHz y un Cortex M0 más pequeño (no se usa aquí). El sensor real está conectado al periférico I2C1 y nuestro sensor virtual estará conectado a I2C0. La fuente está disponible en mi GitHub.

¿Cómo construirlo? Descargue LPCXpresso IDE junto con la biblioteca LPCOpen. Importe esa biblioteca al IDE y también abra el proyecto desde GitHub. Todo debe estar configurado y puede hacer clic en "Depurar" en la esquina inferior izquierda.

Todo el proyecto se basa en uno de los ejemplos de NXP (como para mostrar que mi proyecto simula un sensor real y no necesita un código especial en el lado de la MCU). En el archivo principal (llamado iox_sensor.cpp) se encuentra este código:

#define SENSORS_ON_SHIELD

#si está definido (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif definido (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

Al cambiar SENSOR_ON_SHIELD y SENSOR_OR_FPGA, el usuario puede cambiar en tiempo de compilación a qué sensor hablar, el real o el virtual, ya que están en diferentes pines I2C.

Paso 2: la FPGA

Mi placa FPGA de elección es una Artix 7 fabricada por Digilent, que tiene una Xilinx Arty 7. Se utilizan dos de los conectores PMod, uno para depuración y otro para la carga útil real, la conexión con la placa MCU.

Nuevamente, el código fuente de la FPGA está disponible en mi GitHub (carpeta fpgaSide).

¿Cómo construirlo? Descarga, compra o abre Xilinx Vivado IDE. Importa los archivos del proyecto desde GitHub. Uno de los archivos (content.coe) son los datos de temperatura en formato sin procesar que se transmitirán al sensor falso. También hay un archivo de Excel con el mismo nombre que ayuda a convertir datos de temperatura legibles por humanos en datos LM75 sin procesar. Estoy pensando en cambiar esto a un proceso automatizado con un software escrito en Java, pero hasta entonces esta solución funciona. La síntesis y la implementación deberían tomar un tiempo, tenga esto en cuenta.

Paso 3: ¿Cómo funciona?

¿Como funciona?
¿Como funciona?
¿Como funciona?
¿Como funciona?

Como dije, para el MCU, el FPGA parece un sensor, más exactamente un sensor I2C. La salida del periférico I2C está conectada a la entrada de la FPGA. Dentro de la FPGA hay 3 componentes principales: - Controlador I2C - Dispositivo I2C - Datos El controlador I2C recibe datos I2C de los pines de la FPGA y los envía al resto de la FPGA y hace lo mismo en orden inverso. Mantiene una máquina de estado interna para el protocolo I2C (por cierto, aquí está la documentación). ¿Qué envía este componente al dispositivo I2C? El byte recibido actualmente, la posición de ese byte en la comunicación actual y si la MCU está escribiendo o leyendo en la FPGA. El dispositivo I2C recibe los bytes enviados y actualiza la estructura interna simulada del sensor. Podría simplemente actualizar el puntero de registro o solicitar nuevos datos de la fuente de datos. El componente de datos transmite nuevos puntos de datos. Actualmente es solo una memoria ROM cuya dirección se incrementa (aproximadamente) dos veces por segundo.

¿Cuál es mi objetivo final? Se muestra en la segunda imagen. Es decir: hacer posible que más dispositivos I2C (sensores y otros) sean simulables al mismo tiempo dentro de la FPGA. Los datos en el backend del sensor se almacenarán en caché en la FPGA y se transmitirán desde la PC a través de USB o Ethernet. Admite sensores más avanzados y otros dispositivos I2C (memoria, controladores LED, etc.).

Paso 4: Poniéndolo todo junto

Poniendolo todo junto
Poniendolo todo junto
Poniendolo todo junto
Poniendolo todo junto

Ahora es el momento de conectar todo. En teoría, es simple: la placa mcu tiene un conector PMod (I2C0 y SSP0 (puede funcionar como SPI)). La placa Artix tiene 4 conectores PMod que se pueden utilizar como se desee. Elijo el conector D para hablar con la MCU y el conector B para conectarlo a mi analizador lógico.

Advertencia

No puede conectar las dos placas juntas así. ¿Por qué? PMod fue construido para facilitar la conexión de una placa Master / Host (que da energía) a una placa Slave / Sensor (que recibe energía). Pero en este proyecto ambas placas dan energía y si conecta la salida de 3.3V de una placa a la salida de 3.3V de la otra placa, podrían suceder cosas malas. Pero es posible que no lo hagan y es posible que simplemente cambie los parámetros de los rieles de alimentación de la FPGA (están diseñados con mucho cuidado). Así que no corra este riesgo y mueva el conector un pin a la izquierda (y también voltee la placa FPGA) como se ve en las imágenes de arriba. Aquí está la especificación de PMod, puede estudiarla, lo que hice en pocas palabras es no conectar los VCC de las dos placas.

Recomendado: