具体参考Xilinx文档,pg058-blk-mem-gen Version8.4。
一、Block Memory Generator有什么用?
Block Memory Generator是Vivado中的IP核,即块存储器生成器。
Block Memory Generator IP核是一种高级内存构造器,可使用Xilinx fpga中的嵌入式块RAM资源来生成面积和性能优化的内存空间。
Block Memory Generator支持(Native)本地接口和AXI4接口。
二、Block Memory Generator怎么用?
基本参数设置
Interface Type: 接口类型。Native(本地): 实现一个本地块存储器生成器核心,可兼容先前发布版本的本地块存储器生成器核心;AXI4:实现AXI4接口块存储器生成器内核。
Generate address interface with 32 bits: 选中该项,则地址输入端口(addra和addrb)的位宽固定为32位。
Memory Type: 存储器类型。选择五个选项之一:Single-port RAM(单端口RAM),Single Dual-port RAM(单双口RAM),True Dual-port RAM(真双口RAM),Single-port ROM(单端口ROM), Dual-port ROM(双端口ROM)。
Common Clock: 公共时钟。当输入时钟 (clka和clkb) 由同一时钟缓冲器驱动时,可选择Common Clock选项。
ECC Options: ECC选项。当选择简单双端口RAM存储器类型时,ECC类型选项变为可用。
可供选择的ECC类型有:
No ECC: 不使用ECC。
Soft ECC: 软ECC。当选择的ECC类型是Soft ECC时,启用软错误校正 (使用汉明码)。
Built-In ECC: 内置ECC 。当选择的ECC类型为BuiltIn ECC时,启用内置汉明纠错。
Write Enable: 写入启用功能。
Byte Write Enable: 选择是否使用字节写入启用功能。
Byte Size(bits): 字节大小。当使用字节写入启用(Byte Write Enable)功能时,可以选择字节大小。字节大小为8位 (无奇偶校验) 或9位 (包括奇偶校验)。存储器的数据宽度是所选字节大小的倍数。
Algorithm Options: 算法选项。
选择用于实现内存的算法,分别为:
Minimum Area Algorithm: 最小面积算法。使用最少数量的基元,生成核。
Low Power Algorithm: 低功率算法。在读或写操作期间启用最小数量的块RAM基元的情况下,生成核。
Fixed Primitive Algorithm: 固定原语算法。连接单个原语类型来实现内存,进而生成核。
Primitive: 选择原语类型,可选16kx1、8kx2、4kx4、2kx9、1kx18、512x36、256x72。
端口A/B参数设置
Memory Size: 存储器大小。
Write width: 写入位宽。指定端口A/B的写入宽度(1-4608bits)。
Read width: 读取位宽。从有效选项的下拉列表中选择端口A/B的读取宽度(下拉列表中,可选位宽均是写入位宽的2的正整数幂或负整数幂倍)。
Write Depth: 写入深度。指定端口A/B的写入深度(2-1048576)。
Read Depth: 读取深度。读取深度是自动计算的。(前三项设置好后,自动计算得到)
Operating Mode: 操作模式。指定端口A/B的操作模式。
Read First: 读优先。
Write First: 写优先。
No Change: 不变。
Enable Port Type: 启用端口类型。选择启用类型:
Always enabled: 始终启用 (无可用的ENA/ENB引脚)。
Use ENA/ENB pin: 使用ENA/ENB引脚。
Port [A|B] Optional Output Registers: 端口A/B的可选输出寄存器。
选择要使用的输出寄存器级:
Primitives Output Register: 基元输出寄存器 。选择该项,则在存储器之后插入输出寄存器,分别用于端口A和端口B的原语。在独立模式下,该选项被设置为默认选项。如果您选择寄存存储器的输出,则使用块RAM原语中的嵌入式输出寄存器原语。
Core Output Register: 核心输出寄存器。选中该项,则为每个端口 (A或B) 在该端口的内存核心的输出上插入一个寄存器。选中时,使用FPGA片实现寄存器以寄存核心输出。
REGCE[A|B] Pin: REGCE[A|B] 引脚。选择该项,则使用单独的REGCEA或REGCEB输入引脚来控制存储器中最后一个输出寄存器级的使能。当未选择时,所有寄存器级由ENA/ENB启用。
Port [A|B] Output Reset Options: 端口 [A|B] 输出重置选项。
Use RST[A|B] Pin (set/reset pin): 使用RST[A|B] 引脚 (设置/重置引脚)。 选择是否需要设置/重置引脚 (RST [A|B])。
Reset Behavior: 复位行为。仅当选择相应端口的使用RST引脚选项和存储器基元的寄存器输出选项、且相应端口的寄存器存储器核心选项未被选择时,该端口的复位行为 (复位存储器锁存器) 选项才可用。
Output Reset Value (Hex): 输出复位值 (十六进制)。指定存储器输出锁存器和输出寄存器的复位值。这些值与读取端口宽度有关。
Reset Memory Latch: 复位存储器锁存器。修改重置的行为,并更改重置值的持续时间。重置断言的最小持续时间将根据此选项的选择。
Reset Priority: 复位优先级。仅当选择了相应端口的Use RST Pin选项时,每个端口的Reset Priority选项才可用,其中可以将重置优先级设置为CE或SR。
Read Address Change [A|B] Option: 此功能仅适用于UltraScale设备。这是一种节省功率的选项,并且使能块RAM内的读地址改变(比较) 检测电路。
Enable ECC PIPE: 启用ECC管道。启用流水线寄存器以提高最大频率。仅端口B可使用。
其他选项参数设置
Pipeline Stages within Mux: 在Mux中的流水线级。仅当为端口A和端口B都选择了存储器核心寄存器输出的选项时,以及当构造的存储器在深度上具有多于一个基元时,该项才可用,可使在输出处需要MUX。从下拉列表中可选择值0、1、2或3。
Memory Initialization: 存储器初始化。
Load Init File: 选择是否使用COE文件初始化内存内容。
Fill Remaining Memory Locations: 是否使用默认值初始化剩余的内存内容。当使用非对称端口宽度或数据宽度时,COE文件和默认值相对于端口A的写入位宽。
Remaining Memory Locations(Hex): 填充剩余的内存位置,可输入填充数(十六进制)。
COE是指定两个参数的文本文件:
memory initialization radix: memory_initialization_vector中的值的基数。有效的选择是2、10或16。
memory initialization vector: 定义每个内存元素的内容。每个值都是LSB对齐的,并假定在memory_initialization_radix定义的基数中。
Structural/UNISIM Simulation Model Options: 结构/UNISIM仿真模型选项。
Collision Warnings: 碰撞警告功能。选择发生碰撞时结构仿真模型生成的警告消息和输出的类型。对于选项All,Warning_Only和Generate_X_Only,UNISIM模型中启用了碰撞检测功能,可以在任何条件下处理碰撞。对于选项None,如果选择NONE,则在模型中禁用碰撞检测功能,且碰撞期间的行为留给仿真器来处理。
Behavioral Simulation Model Options: 行为模拟模型选项。选择行为模拟模型生成的警告消息的类型。对于碰撞警告,选择模型是否应采用同步时钟 (通用时钟)。
Disable Collision Warnings: 选中该项,则关闭碰撞警告。
Disable Out of Range Warnings: 选中该项,则关闭超出范围警告。
Dynamic Power Saving: 动态功率节省。在存储器在延长的时间段内未被活动地使用的情况下实现静态功率节省。当存储器阵列进入睡眠模式时,存储器保存数据。要使用内存,请将sleep引脚设置为0以唤醒内存。
Safety logic to minimize BRAM data corruption: 以最小BRAM数据损坏为目的的安全逻辑。
Enable Safety Circuit: 使能安全电路。块存储器发生器IP包括一个内置安全电路,当有设置/保持时,最大限度地减少BRAM数据损坏的发生。当块存储器发生器的安全电路包括两个输出端口rsta_busy和rstb_busy信号是有效时,表示BRAM不应该被访问。
摘要选项
Memory Type: 存储器类型。报告选定的存储器类型。
Block RAM Resources: Block RAM资源 (block RAM Resources)。报告用于构建核心的18k和36k Block RAM原语的确切数量。
Total Port A Read Latency: 总端口A读取延迟数。端口A的读取操作的时钟周期数。此值由上一个选项卡上端口A的可选输出寄存器选项控制。
Total Port B Read Latency: 总端口B读取延迟数。端口B的读取操作的时钟周期数。此值由上一个选项卡上端口B的可选输出寄存器选项控制。
Address Width: 地址宽度。每个端口的地址总线的实际宽度。
功率估计选项配置
选中Additional Inputs for Power Estimation(功率估计所需的额外输入),则有以下选项:
Port [A|B] Clock: 端口[A|B]的时钟频率。即端口A或端口B的工作时钟频率(0-800)。
Port [A|B] Write Rate: 端口[A|B]的写速率。即端口A或端口B的写速率(0-100)。
Port [A|B] Enable Rate: 端口[A|B]的访问速率。即端口A或端口B的平均访问速率(0-100)。
AXI接口选项配置
前提: 在基础选项配置中,选择接口类型为AXI4,实现AXI4接口块存储器生成器内核。
AXI4 Interface Options: AXI4接口选项。
AXI4: 实现AXI4块内存生成器核心。
AXI4-Lite: 实现AXI4-Lite块存储器生成器核心。
AXI4 Slave Options: AXI4从属选项。
Memory Slave: 内存从属。在内存从属模式下实现AXI4接口块存储器生成器核心
Peripheral Slave: 外设从属。在外设从属模式下实现AXI4接口块存储器生成器内核。
ID Width Configurations: ID宽度配置。
ID Width: ID宽度。当启用支持awid/bid/arid/rid生成时,ID宽度可以配置为1到16位。
端口说明
以(True Dual-port RAM)真双口RAM为例。
信号 | 输入/输出 | 端口描述 |
---|---|---|
clka | I | 端口A时钟:端口A操作与此时钟同步。对于同步操作,这必须由与clkb相同的信号驱动。 |
addra | I | 端口A地址 (Address):为端口A读和写操作寻址存储器空间。在所有配置中可用。 |
dina | I | 端口A数据输入:要通过端口A写入存储器的数据输入。适用于所有RAM配置。 |
douta | O | 端口A数据输出:通过端口A读取操作的数据输出。除简单的双端口RAM外,所有配置均可用。 |
ena | I | 端口A时钟启用 (Enable):通过端口A启用读、写和复位操作。在所有配置中是可选的。 |
wea | I | 端口A写启用 (Write Enable):启用通过端口A的写操作。适用于所有RAM配置。 |
rsta | I | 端口A设置/重置端口A:重置存储器输出锁存器或输出寄存器。在所有配置中是可选的。 |
regcea | I | 端口A寄存器使能:使能端口A的最后一个输出寄存器。在具有端口A输出寄存器的所有配置中是可选的。 |
clkb | I | 端口B时钟:端口B操作与此时钟同步。可在双端口配置。对于同步操作,这必须由与clka相同的信号驱动。 |
addrb | I | 端口B地址:为端口B读和写操作的存储器空间寻址。可在双端口RAM/ROM配置。 |
dinb | I | 端口B数据输入:要通过端口B写入存储器的数据输入。在真双口RAM配置中可用。 |
doutb | O | 端口B数据输出:通过端口B进行读取操作的数据输出。可在双端口RAM/ROM配置。 |
enb | I | 端口B时钟启用端口:通过端口B启用读取、写入和重置操作。 |
web | I | 端口B写启用 (Write Enable):通过端口B启用写操作。在双端口RAM配置中可用。 |
rstb | I | 端口B设置/重置端口:存储器输出锁存器或输出寄存器。在所有配置中是可选的。 |
regceb | I | 端口B寄存器使能:使能端口B的最后一个输出寄存器。在双端口配置中是可选的。 |
sbiterr | O | 单比特错误标记:内存中已在输出总线上自动纠正的单比特错误。 |
dbiterr | O | 双位错误标志:内存中存在双位错误。内置ECC解码模块无法自动纠正双位错误。 |
injectsbiterr | I | 注入一位错误:仅适用于Zynq® -7000和7系列ECC配置。 |
injectdbiterr | I | 注入双位错误:仅适用于Zynq-7000和7系列ECC配置。 |
rdaddrecc | O | ECC错误输出读地址:仅适用于Zynq-7000和7系列ECC配置。 |
eccpipece | I | ECC管线寄存器时钟启用功能:仅适用于基于UltraScale体系结构的设备。 |
sleep | I | 动态省电:如果sleep引脚为高,则块内存生成器内核处于省电模式。仅适用于基于UltraScale体系结构的设备。 |
实例化代码
// 以双端口RAM为例
wire clka; // 端口A时钟
wire rsta; // 端口A复位信号,高电平有效
reg ena; // 端口A使能
reg wea; // 端口A写使能位
reg [9:0] addra; // 端口A地址输入
reg [31:0] dina; // 端口A输入数据
wire [31:0] douta; // 端口A输出
wire clkb; // 端口B时钟
wire rstb; // 端口B复位信号,高电平有效
reg enb; // 端口B使能
reg web; // 端口B写使能位
reg [9:0] addrb; // 端口B地址输入
reg [31:0] dinb; // 端口B输入数据
wire [31:0] doutb; // 端口B输出
assign rsta = ~i_rst_n;
assign rstb = ~i_rst_n;
blk_mem_gen_0 blk_mem_gen_0(
.clka(clka), // input wire clka
.rsta(rsta), // input wire rsta
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addra), // input wire [9 : 0] addra
.dina(dina), // input wire [31 : 0] dina
.douta(douta), // output wire [31 : 0] douta
.clkb(clkb), // input wire clkb
.rstb(rstb), // input wire rstb
.enb(enb), // input wire enb
.web(web), // input wire [0 : 0] web
.addrb(addrb), // input wire [9 : 0] addrb
.dinb(dinb), // input wire [31 : 0] dinb
.doutb(doutb) // output wire [31 : 0] doutb
);