本文主要介绍在 Vivado 软件中生成 Block Memory IP 核的方法,相关配置定义,以及搭建 Testbench 对生成的 IP 读写控制时序进行仿真和测试。
一、Block Memory IP 生成与配置
1.1 RAM IP 创建方法
- 新建工程:打开 Vivado,创建一个新的工程项目。
- 打开 IP Catalog:在 Vivado 主界面中,单击 IP Catalog。
- 搜索 RAM:在右侧窗口的 Search 框中输入
ram,会出现相关 IP 条目。 - RAM IP 类型:在 Memories & Storage Elements 分类下,可以看到两种主要的 RAM 创建入口:
- Distributed Memory Generator
- Block Memory Generator
- 主要差别:
- Distributed Memory Generator:生成的 RAM/ROM 核心占用 FPGA 的 LUT(查找表) 资源。查找表本质上是一种小型 RAM,因此这种方式适合对存储容量要求不大但需要快速访问的场景。
- Block Memory Generator:生成的 RAM/ROM 核心占用 FPGA 的 Block Memory(嵌入式硬件 RAM) 资源。适合需要较大容量存储、节省 LUT 资源的应用。
选择 Block Memory Generator 双击鼠标进入 RAM IP 配置界面。
1.2 Xilinx RAM IP 配置说明
- 常规接口(Native):原生端口,直接控制信号。
- AXI 接口:用于与 AXI 总线系统集成。
全局 Summary,点击 OK。
初始化设置:RAM IP 的初始化配置用于在 FPGA 上电或复位时为存储单元设置初始值,可以选择默认填充(如全 0 或全 1),也可以通过加载初始化文件(如 .mem 或 .coe 文件)写入自定义数据。初始化可以在生成时包含初始内容,也可以通过逻辑模块在系统上电后写入,Vivado 常通过 COE 文件指定每个地址的初始数据。同时,可以配置是否在初始化时对输出端口进行寄存,以保证上电或复位期间读出的数据符合预期。这种初始化常用于存放查找表数据、系统默认值或测试仿真阶段的初始化数据。
端口 B 输出寄存器配置:端口 B 的输出寄存器配置主要用于控制读出数据是否经过寄存器缓存,以改善时序性能或满足设计需求。在简单双端口 RAM 中,虽然端口 B 只能进行读操作,但仍可以配置其输出寄存器,通常可以选择 无寄存器(直接输出)或 有寄存器(输出数据经过寄存器打一拍),这样可以根据系统时序要求优化读数据的稳定性和延迟。在真双端口 RAM 中,同样可以独立配置端口 B 的输出寄存器,实现更灵活的时序控制。
端口 B 输出置位/复位设置:这里不创建置位/复位端口,需注意这里置位/复位并不复位 RAM 中的数据而是只复位寄存器上的值。
端口 B 数据位宽和内存深度的设置:在简单双端口 RAM 中,端口 B 仅用于读操作,无法进行写操作,因此其操作模式不可修改。而在真双端口 RAM 中,端口 B 则可以进行操作模式设置。这里将端口 B 的使能设置为 Always Enable,确保该端口始终处于使能状态。
端口使能信号类型设置:端口使能信号类型设置,一个是一直使能,一个是通过一个 ENA 信号管脚控制,这里选择 Always Enable。
操作模式设置:在 RAM IP 的配置中,操作模式(Write Mode)提供三个选项,主要用于处理当同一地址在同一时钟周期同时发生读写操作时的行为。具体而言,这些选项决定了读出的数据是 写入的最新数据、该地址原有的数据,还是 。选择合适的操作模式可以确保在读写冲突情况下的逻辑行为符合设计需求。Write First 模式下的波形,同时对同一地址读写,读出数据刚写入该地址的数据。Read First 模式下的波形,同时对同一地址读写,读出数据刚上次写入该地址的数据。No Change 模式下波形,读出的数据只有在进行读操作但未进行写操作时更新数据,在同时读写数据时,读出数据保持不变。


