Interfaz Hardware/Software y Mapa de Registros¶
La interfaz entre el software en FreeRTOS y los bloques de lógica programable se realiza principalmente a través del mapa de registros AXI-Lite v11 expuesto por la IP drx_axil_regs en rtl/drx_top.sv.
Diagrama de la Frontera HW/SW¶
La figura a continuación ilustra cómo las funciones del driver en C interactúan con los buses físicos AXI y las direcciones de memoria asignadas en el BSP:
flowchart LR
subgraph SW["Firmware C (FreeRTOS)"]
APP["Aplicación / Tareas<br/>(drx_status / drx_ray)"]
DRV_HW["drx_regs_hw.c<br/>(Driver Registros)"]
DRV_DMA["drx_dma.c<br/>(Driver AXI DMA)"]
end
subgraph BUS["Buses AXI PS7"]
GP0_REGS["AXI GP0 M00<br/>Base: 0x43C00000"]
GP0_DMA["AXI GP0 M01<br/>Base: 0x40400000"]
HP0_DATA["AXI HP0 Slave<br/>RAM DDR3"]
end
subgraph PL_IP["Lógica Programable (PL)"]
REG_IP["drx_axil_regs v11<br/>(Control & BITE Sticky)"]
DMA_IP["axi_dma S2MM<br/>(Motor Scatter-Gather)"]
end
APP --> DRV_HW
APP --> DRV_DMA
DRV_HW -- "Xil_In32 / Xil_Out32" --> GP0_REGS
DRV_DMA -- "XAxiDma_BdRing*" --> GP0_DMA
GP0_REGS --> REG_IP
GP0_DMA --> DMA_IP
DMA_IP -- "Escritura de Rayos" --> HP0_DATA
Tabla del Mapa de Registros AXI-Lite (v11)¶
Dirección Base en memoria del PS: XPAR_M_AXI_REGS_BASEADDR = 0x43C00000.
Ancho de datos: 32 bits. Alineamiento a palabra de 4 bytes.
| Offset | Nombre | Acceso | Bits Usados | Descripción y Semántica |
|---|---|---|---|---|
0x00 |
VERSION |
RO | [31:0] |
Versión del mapa de registros (actualmente 11). Permite al firmware verificar compatibilidad con el bitstream cargado antes de operar. |
0x04 |
CTRL |
RW | [0], [2] |
Bit 0: mode_coarse (0 = fino, 1 = grueso).Bit 1: Reservado (lee 0). Bit 2: vector_load (1 = congela lector de BRAM de estímulo para permitir carga vía VEC_DATA). |
0x08 |
STATUS |
RO + W1C | [N_CH-1:0] |
Bit c: Flag sticky de overrun del canal c de range gate. Se limpia escribiendo un 1 en el bit correspondiente (Write-1-to-Clear). |
0x0C |
OVERFLOW |
RO + W1C | [N_CH-1:0] |
Bit c: Flag sticky de desbordamiento por saturación en la cadena DDC del canal c. Limpieza W1C. |
0x10 |
TIMING_CTRL |
RW | [1:0] |
Bit 0: enable del secuenciador de lotes PRF.Bit 1: timing_paced (0 = el motor cuenta ciclos de reloj, 1 = cuenta avances de muestra). |
0x14 |
TIMING_STATUS |
RO + W1C | [2:0] |
Bit 0: radial_done sticky.Bits 2:1: config_invalid para lote alto y bajo según regla D-09 (W1C). |
0x18 |
PRF_DIV_LOW |
RW | [31:0] |
División de PRF para el lote bajo (ciclos de FS_HZ por PRI). |
0x1C |
PRF_DIV_HIGH |
RW | [31:0] |
División de PRF para el lote alto (ciclos de FS_HZ por PRI). |
0x20 |
PULSE_WIDTH |
RW | [15:0], [31:16] |
[15:0]: Ancho de pulso lote bajo (ciclos). [31:16]: Ancho de pulso lote alto (ciclos). |
0x24 |
N_PULSES |
RW | [15:0], [31:16] |
[15:0]: Cantidad de pulsos en lote bajo. [31:16]: Cantidad de pulsos en lote alto por radial. |
0x28–0x34 |
TRIG_DELAY_0..3 |
RW | [31:0] |
Retardo del pulso de disparo (en ciclos de FS_HZ) para cada uno de los 4 canales de disparo. |
0x38–0x44 |
TRIG_WIDTH_0..3 |
RW | [31:0] |
Ancho del pulso de disparo (en ciclos de FS_HZ, debe ser \(\ge 1\)) para cada uno de los 4 canales. |
0x48 |
BINS_LOW |
RW | [31:0] |
Cantidad de celdas de distancia (bins) para el lote bajo. |
0x4C |
BINS_HIGH |
RW | [31:0] |
Cantidad de celdas de distancia (bins) para el lote alto. |
0x50 |
GATE_TRUNCATED |
RO + W1C | [N_CH-1:0] |
Bit c: Flag sticky que indica si un rayo del canal c fue truncado antes de completarse. W1C. |
0x54 |
TRIG_COUNT |
RO | [31:0] |
Contador libre acumulativo de impulsos de disparo de la PL. No se borra al leer. |
0x58 |
NCO_PINC |
RW | [31:0] |
Palabra de incremento de fase para el NCO del DDC. Dispara re-sintonía en el mezclador. |
0x5C |
VEC_ADDR |
RW | [12:0], [18:16] |
[12:0]: Puntero de dirección dentro del banco BRAM. [18:16]: Banco objetivo (0..2 por canal, 7 = difusión a todos). |
0x60 |
VEC_DATA |
RW | [15:0] |
Muestra de 16 bits enviada a BRAM. Escribir autoincrementa VEC_ADDR. |
0x64 |
VEC_LEN |
RW | [12:0] |
Longitud del bucle de reproducción del vector de estímulo (por defecto 4000 muestras). |
Driver de Bajo Nivel (fw/src/app/drx_regs_hw.c)¶
El acceso al mapa de registros desde C se abstrae en las funciones DrxReg_Read y DrxReg_Write:
/* fw/src/app/drx_regs_hw.c */
#include "drx_regs_hw.h"
#include "xil_io.h"
#include "xparameters.h"
uint32_t DrxReg_Read(uint32_t offset)
{
return Xil_In32(XPAR_M_AXI_REGS_BASEADDR + offset);
}
void DrxReg_Write(uint32_t offset, uint32_t value)
{
Xil_Out32(XPAR_M_AXI_REGS_BASEADDR + offset, value);
}
Precaución con los registros Sticky (W1C)
Los registros STATUS, OVERFLOW, TIMING_STATUS y GATE_TRUNCATED utilizan la semántica Write-1-to-Clear. Escribir un bit en 1 borra esa bandera en la PL. Para evitar limpiar eventos no deseados por accidente, nunca realices operaciones de lectura-modificación-escritura (OR de bits) sobre estos registros; escribe únicamente una máscara con los bits específicos que deseas limpiar.