Hacer cualquier sensor de un FPGA: 4 pasos

Hacer cualquier sensor de un FPGA: 4 pasos

Tabla de contenido:

Anonim

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 tenían 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 está perfecto, el software está funcionando y el sensor está detectando. ¡Vamos a probarlo!

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é pena que se haya quedado atascado en esta cosa estúpidamente menor.

Mi solución es la siguiente: hacer que un FPGA actúe como un sensor con valores transmitidos desde una PC (o almacenados en la memoria, o creados ad-hoc dentro del FPGA). Así que para su preciosa MCU, la FPGA parece un sensor, pero no cualquier sensor: el sensor que desee. Tal vez decida que necesita más resolución o un tiempo de respuesta más rápido que el esperado, tiene que cambiar el sensor. Pídalo en línea, llegará en un par de días, de un par de meses, quién sabe. Respete su PCB o solicite un módulo con el nuevo sensor. O … un par de clics y el FPGA está configurado como su nuevo sensor y puede emular la configuración interna exacta.

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

Suministros:

Paso 1: El MCU

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

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

El proyecto completo se basa en uno de los ejemplos de NXP (para demostrar 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 #if 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 el momento de la compilación a qué sensor hablar, el real o el virtual, ya que están en diferentes pines I2C.

Paso 2: El FPGA

Mi placa FPGA de elección es un Artix 7 fabricado por Digilent, con un Xilinx Arty 7. Se usan dos de los conectores PMod, uno para la depuración y uno para la carga útil real, la conexión con la placa MCU.

Una vez más, el código fuente para el FPGA está disponible en mi GitHub (carpeta fpgaSide).

¿Cómo construirlo? Descarga, compra o abre Xilinx Vivado IDE. Importar los archivos de 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 a datos LM75 sin procesar. Estoy planeando cambiar esto a un proceso automatizado con un software escrito en Java, pero hasta entonces esta solución funciona. La síntesis y la implemantación deberían tomar un tiempo, tome esto en consideración.

Paso 3: ¿Cómo funciona?

Como dije, para la MCU, la FPGA parece un sensor, más exactamente un sensor I2C. La salida del periférico I2C está conectada a la entrada del FPGA. Dentro del FPGA hay 3 componentes principales: - Controlador I2C - Dispositivo I2C - Datos El controlador I2C recibe datos I2C de los pines del FPGA y los envía al resto del 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 para ello). ¿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 desde el FPGA. El dispositivo I2C recibe los bytes enviados y actualiza la estructura interna simulada del sensor. Es posible que solo actualice el puntero del registro o solicite nuevos datos del origen de datos. El componente 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) puedan simularse al mismo tiempo dentro del FPGA. Los datos en el backend del sensor se almacenan en caché en el FPGA y se transmiten 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

Ahora es el momento de conectar todo juntos. 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 pueden usarse como desee. Elijo el conector D para hablar con la MCU y el conector B para conectarme a mi Logic Analyzer.

Advertencia

No puedes conectar las dos tablas juntas así. ¿Por qué? PMod fue construido para facilitar la conexión de una placa maestra / anfitriona (que le da energía) a una placa esclava / sensor (que recibe energía). Pero en este proyecto, ambas placas proporcionan alimentación y si conecta la salida de 3.3 V de una placa a la salida de 3.3 V de la otra. cosas malas podría ocurrir. Pero podrían no hacerlo y usted podría cambiar los parámetros de los rieles de alimentación del FPGA (están diseñados con mucho cuidado). Así que no se arriesgue y mueva el conector un pin a la izquierda (y también gire la placa FPGA) como se ve en las imágenes de arriba. Aquí está la especificación de PMod, usted puede estudiarlo, lo que hice en pocas palabras es no conectar las VCC de las dos placas.