🛠 Despliegue de un nodo IoT con Sapphire RV64: Red y Almacenamiento
Objetivos
Este tutorial tiene como objetivo configurar el SoC Sapphire RV64 para un caso de uso típico de IoT industrial: adquisición de datos mediante interfaces periféricas (SPI/I2C) y transmisión de red. Ilustraremos cómo explotar la arquitectura configurable para asignar los recursos de memoria y las interfaces necesarias, centrándonos en la integración de buses AXI4/APB3 y la gestión de memoria externa.
Hardware necesario
- Una placa FPGA Efinix compatible (Titanium, Topaz o Trion, T20 o superior).
- Software Efinity versión 2026.1 o más reciente.
- Un módulo de memoria externa compatible (DDR3, LPDDR4x o HyperRAM) conectado al FPGA.
- Cableado para interfaces GPIO, SPI e I2C según su esquema de prueba.
- Un entorno de desarrollo RISC-V (compilador GCC RISC-V, OpenOCD).
Pasos
- Configuración del núcleo VexiiRiscv: En Efinity, instancie el bloque IP Sapphire RV64. Seleccione el núcleo VexiiRiscv. Active las extensiones
RV64IMACFDpara soporte de punto flotante (cálculos de sensores) yZba_Zbc_Zbspara optimización de operaciones bit a bit. Si su aplicación requiere un SO completo, active la MMU SV39.
- Asignación de memoria: Configure la RAM en chip a 64 KB para la pila y variables críticas. Para almacenar registros o buffers de red, conecte la memoria externa. Por ejemplo, si usa HyperRAM (500 Mbps), configure el controlador de interfaz correspondiente en el bloque IP. Asegúrese de que la caché L1 esté activada para reducir la latencia de acceso.
- Interconexión de bus: Conecte el núcleo a los periféricos mediante el bus AXI4 para altas velocidades (memoria externa) y APB3 para periféricos lentos (UART, GPIO). Asigne direcciones de memoria para periféricos I2C (hasta 5 maestros disponibles) y SPI (3 maestros).
- Generación de bitstream: Sintetice el diseño. Verifique que se cumplan los tiempos, especialmente si apunta a la frecuencia máxima de 400 MHz. Cargue el bitstream en el FPGA.
- Desarrollo de software: Escriba el firmware en C. Use los controladores proporcionados para inicializar las interfaces SPI para leer un sensor. Almacene datos en buffer en la memoria externa. Implemente una pila TCP/IP ligera (como lwIP) usando la interfaz de red (si está disponible vía GPIO/SPI Ethernet o módulo externo) para transmitir datos.
Verificación
Use el depurador RISC-V estándar a través de OpenOCD. Coloque puntos de interrupción de hardware (hasta 4 disponibles) en la rutina de adquisición de datos. Verifique mediante un analizador lógico que las señales SPI/I2C sean correctas. Confirme que los datos se escriben correctamente en la memoria externa leyendo las direcciones correspondientes mediante el depurador.
Para ir más allá
Explore el uso de la caché L2 compartida (64 a 512 KB) para acelerar el acceso a memoria en modo multinúcleo (hasta 4 núcleos). También puede probar el rendimiento con extensiones de punto flotante de doble precisión para procesamiento de señal embebido.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
gpio_blink_riscv.inoC (RISC-V)uart_echo_riscv.inoC (RISC-V)spi_sensor_read.inoC (RISC-V)i2c_master_write.inoC (RISC-V)timer_interrupt_handler.inoC (RISC-V)i2c-bmp280-temperature-6.inoC