在Xilinx Zynq-7020 SoC(结合ARM处理器和FPGA)中,共享内存(SHM)和片上内存(OCM)是两种不同的内存资源,它们在物理位置、访问速度、用途和设计目标上存在显著差异。以下是它们的核心区别:
1. 物理位置与架构
特性 | OCM(On-Chip Memory) | 共享内存(SHM,Shared Memory) |
---|---|---|
物理位置 | 位于处理系统(PS,Processing System)内部 | 通常位于DDR内存或FPGA(PL)的BRAM中 |
硬件归属 | PS独占资源(ARM CPU专用) | PS和PL(FPGA)共享访问 |
典型容量 | 较小(Zynq-7020的OCM为256KB) | 较大(取决于DDR配置或FPGA BRAM资源) |
2. 访问速度与延迟
特性 | OCM | 共享内存 |
---|---|---|
访问延迟 | 极低(紧耦合,直接通过PS内部总线访问) | 较高(需通过AXI总线或DDR控制器) |
带宽 | 高(无总线竞争,适合实时操作) | 受AXI总线或DDR带宽限制 |
适用场景 | 实时性要求高的任务(如中断处理、关键数据) | 大数据传输、PS与PL协同计算 |
3. 用途与设计目标
特性 | OCM | 共享内存 |
---|---|---|
核心用途 | - 存储关键代码(如BootROM) - 缓存敏感数据(如中断向量表) - 低延迟数据缓冲区 |
- PS与PL间大数据交换 - 实现异构计算数据共享 - 存储非实时性数据 |
设计目标 | 优化PS性能,减少对DDR的依赖 | 实现PS和PL的高效通信 |
4. 软件与硬件管理
特性 | OCM | 共享内存 |
---|---|---|
软件配置 | 通过PS的MMU直接映射,需在链接脚本中指定 | 需手动分配地址空间(如DDR区域或BRAM) |
缓存一致性 | 默认非缓存或缓存一致(无需软件干预) | 需处理缓存一致性(如Xil_DCacheFlush ) |
硬件依赖 | 完全由PS管理 | 依赖AXI互联协议或PL的BRAM控制器 |
5. 典型应用场景
OCM的典型场景
实时任务:存储中断服务程序(ISR)或实时操作系统的关键数据。
低延迟缓冲区:用于高速数据采集的临时存储(如ADC/DAC数据)。
Boot代码:Zynq启动时,BootROM代码通常驻留在OCM。
共享内存的典型场景
PS-PL数据交互:
PL(FPGA)通过AXI总线直接读写DDR中的共享内存。
示例:PL加速器处理图像数据后,将结果写入DDR,PS读取并显示。
大数据缓冲:存储视频帧、网络数据包等需要大容量内存的场景。
多核通信:在AMP(非对称多处理)系统中,多个ARM核通过共享内存交换数据。
6. 配置与使用示例
OCM配置(在Vitis中)
在链接脚本(lscript.ld
)中指定OCM区域:
{ ocm_ram : ORIGIN = 0xFFFF0000, LENGTH = 0x10000 // 64KB OCM } SECTIONS { .ocm_data : { *(.ocm_data) } > ocm_ram }
共享内存配置(PS与PL间)
DDR共享内存:
在PL中通过AXI Master接口访问DDR。
PS端需确保内存区域未被缓存或手动刷新缓存:// 分配非缓存内存 void *shared_buf = Xil_NonCacheableMalloc(BUF_SIZE); // 刷新缓存(PL修改数据后) Xil_DCacheFlushRange((u32)shared_buf, BUF_SIZE)
// 分配非缓存内存 void *shared_buf = Xil_NonCacheableMalloc(BUF_SIZE); // 刷新缓存(PL修改数据后) Xil_DCacheFlushRange((u32)shared_buf, BUF_SIZE);
BRAM共享内存:
在PL中例化BRAM,通过AXI BRAM控制器与PS共享。
在Vivado中配置AXI BRAM控制器地址范围。
7. 性能对比总结
维度 | OCM | 共享内存(DDR) |
---|---|---|
延迟 | 1~2个时钟周期 | 数十到数百时钟周期 |
带宽 | ~10 GB/s | ~1 GB/s(受DDR限制) |
适用数据量 | 小数据(KB级) | 大数据(MB~GB级) |
选择建议
使用OCM:
实时性要求高、数据量小、频繁访问的场景(如中断处理、关键代码)。使用共享内存:
PS与PL间需要传递大量数据、对延迟不敏感的场景(如图像处理、网络协议栈)。
即:通过合理分配OCM和共享内存,可以显著提升Zynq-7020系统的性能和效率。