在Vivado下,Xilinx公司提供了很多实用的IP核,其中包括内存存储ROM (read-only memory,只读存储器),这些集成IP核功能强大,接口简单,仿真文件齐全,配套的设计案例丰富。建议在工程中充分利用这些简单,高性能,而且稳定可靠的IP核。本文主要介绍Block ROM的生成与配置。
Quartus下关于ROM IP核的生成,参考文章Quartus ROM 的生成与配置详解。
1.Vivado下内存配置与Quartus下的不同点
- Vivado下ROM由Distributed Memory Generator生成的时候,可以不需要时钟锁存,直接生成,而Quartus的ROM IP核必须地址锁存。
- Vivado下内存接口基本上都提供了AXI 4接口,而Quartus没有提供AXI4接口。
除此之外,注意在Xilinx中,内存IP核种类划分和Quartus 中RAM/ROM用端口数量和内存种类划分不一样,如图1所示。

图1 Quartus下内存分类。
Xilinx下通过内存的基本实现单位分为两大类,每一类可以细分为RAM/ROM和单端口/双端口,见图2所示:

图2 Xilinx下内存分类
2. Vivado ROM/RAM IP核分类
Xilinx下内存IP核分为了两种:
- Distributed Memory Generator
- Block Memory Generator
Distributed Memory Generator:分配式内存,主要使用LUT 资源来生成内存结构。LUT(lookup table)是只包括一个真值表的微小存储单位,因为LUT结构遍布FPGA,常见,灵活,所以LUT是最快的存储单元,一般被称为作distributed memory。
Block Memory Generator:相对较大的数据片上存储。详情参见文章Xilinx 7系列FPGA Block RAM概述。
3. Vivado下生成Block ROM IP核步骤
ROM是一个免费但功能强大的IP核。这里使用Block Memory Generator生成ROM IP以及配置和应用的例子。下面以使用Block Memory Generator生成一个16 X 256的单端口ROM为例介绍Block ROM IP配置步骤。步骤如下:
- 在Vivado IP catalog 中找到Block Memory Generator,双击跳出界面如图3所示,

图3
- 在图3中的选择合适的参数进行配置,各个参数的选择如下:
- 选择Interface Type为Native(这里不选择AXI4,关于配置成AXI4接口的例子,在之后会有专门的文章进行讨论)。
- Memory Type选择为 Single Port ROM。
- Write Enable 在选择 ROM后,会自动禁用;因为ROM在初始化后,只能读,而不能写。
- Algorithm Options 可选Minimum Area,Low Power和Fixed Primitives 3种。这里选择Minimum Area。 三种算法的举例如图4所示:

图4
Minimum Area算法可以使用最少的RAM原语块。Low Power算法最小化读取或写入操作期间启用的Block Memory的数量,但是可能会使用更多的Block Memory块。Fixed Primitives算法只需要一种RAM原语块,并根据需要进行拼接。

图5
- 由于是Single Port ROM,这里只需要配置Port A Option。这里设置为宽度16-bit,深度256-bit。
- 注意Enable Port Type选择Always Enabled
- 对于Port A Optional Output Registers有两个选项:Primitive Output Register和Core Output Register,优点是会提升性能,缺点是都会为读取操作增加一个额外的时钟周期延迟。这里选择的是 Primitive Output Register,是Block Memory Generator里的嵌入式输出寄存器,不需要额外的FPGA资源,而Core Output Register需要FPGA的额外资源和通用的内部连线,如图所示:

图6

图7
- Memory Initialization:使用*.coe文件初始化ROM,关于*.coe文件,参考文章Verilog 仿真工程应用-生成coe/mif 文件。

图8
- Block Memory Generator IP核的总结,Memory Type是单端口ROM,因为16* 256 = 4Kb,所以只需要使用1个18K BRAM就足够
- 地址锁存需要的一个时钟周期加上输出的锁存,总共读操作会有2个时钟周期的延时
- 地址宽度是8-bit
之后的文章会讲解如何使用这个生成的单端口ROM IP核。