我正在使用 Xilinx FPGA (MicroBlaze) 开发 SoC 上的收发器。
这种情况是我需要从 FPGA 的 UltraRam(URAM) 块加载收发器的固件,因为固件阵列无法与程序中的所有其他内容一起放入 MicroBlaze 系统的 BlockRam。 因此,需要将固件数据移动到 URAM 中。 但是URAM不支持初始化,所以我必须在主程序运行时写入固件数据。
我编写的代码遵循以下类似的模式。请注意,我有两种将程序写入 FPGA 的方法:通过 Vitis/UART (#define UART_LOAD) 和通过内存配置。 *为了一致性,“#ifndef UART_LOAD”表示固件是通过内存配置从外部 CPU 加载的。
#ifndef UART_LOAD //load bitstream from external CPU
unsigned char *FW_Array;
#else // load bitstream + program via Vitis/Uart
/* URAMBLOCK Starts at 0xD0000000 */
unsigned char FW_Array[] __attribute__((section(".URAMBLOCK")))= {0x00, 0x01, ... , 0xFF};
#endif
unsigned int FW_Array_Len = 0x100;
int main(void)
{
#ifndef UART_LOAD
FW_Array = (unsigned char *) 0xD0000000; // UpdateMem error if I allocate/assign outside runtime
/* ... Load/Write FW_Array contents from external CPU via some comm interface ...*/
#endif
/* Read FW_Array contents here */
return 0;
}
有没有更好的方法来实现这一目标?
只有 .URAMBLOCK 部分链接到物理 URAM,程序部分(.data、.bss 等)的重置链接到 BRAM。我担心实际程序可能会不小心写到 FW_Array 的 URAM 空间。