# Verilog功能模块--RAM和ROM **Repository Path**: xuxiaokang/verilog-function-module--RAM_ROM ## Basic Information - **Project Name**: Verilog功能模块--RAM和ROM - **Description**: Verilog功能模块--RAM和ROM - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-23 - **Last Updated**: 2025-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Verilog功能模块--RAM和ROM ## 前言 RAM和ROM是FPGA中用于数据交互的基础组件,应用非常广泛。 所有的FPGA厂家在其开发工具中都提供可直接使用的RAM/ROM IP,这些IP大都经过详细测试,功能完善,可直接使用,那为什么还需要自编RAM/ROM呢?主要理由是: 1. 自编RAM/ROM能显著增强代码可移植性,例如,我的某些自编IP中需要RAM/ROM,此时如果使用某一厂家RAM/ROM IP,那么换另外厂家的芯片,自编IP就不能用了;或者要为每个厂家的芯片都重写一下自编IP,并且还要在工程中添加RAM/ROM IP,这就使得自编IP的适用性变得很差,难以接受; 2. 在很多应用场景中,并不需要追求大容量的RAM/ROM,也不要求RAM/ROM的高性能,而只是需要RAM/ROM能实现基本的功能就行了,这时使用自编RAM/ROM比用厂家IP就要方便很多了。也不用担心厂家IP升级收费之类的变化。 当然,如果需要大容量的RAM/ROM,或者高性能的RAM/ROM,还是建议用厂家的RAM/ROM IP,毕竟这些IP都经过严格的测试,也能更好的适应特定的芯片,在可靠性和性能上都会优于自编IP。 ## 一、自编RAM/ROM IP的功能 1. 自编RAM/ROM IP的接口信号和处理逻辑都参考Vivado的BRAM IP。 2. 实现了三种RAM类型:1.单端口RAM(SPRAM);2.简单双端口RAM(SDPRAM);3.真双端口RAM(TDPRAM)。 3. 实现了两种ROM类型:1.单端口ROM(SPROM);2.双端口ROM(DPROM)。 4. RAM需要实现三种操作模式:1.写优先(Write First);2.读优先(Read First);3.无变化(No Change)。 5. 实现了端口使能引脚en,功能等价于Vivado BRAM IP中的ena和enb。 6. 实现参数控制的单个/两个输出寄存器,功能等价于Vivado BRAM IP中的Primitives Output Register和Core Output Register。 7. 实现了RAM/ROM使用COE文件进行初始化的功能,功能等价于Vivado BRAM IP中的Memory Initialization功能。 8. 实现了指定RAM/ROM初始默认值的功能,当未指定COE文件或COE文件数据数小于存储器深度时,此默认值起作用,功能等价于Vivado BRAM IP中的Fill Remaining Memory Locations。 9. 暂未实现字节写功能,即Vivado BRAM IP中的Byte Write Enable选项,此功能实现有些复杂,暂不实现。 10. 暂未实现读/写数据位宽转换功能,如果需要此功能,可外部添加我开源的带位宽转换功能的FIFO模块。 11. 暂未实现两端口数据位宽转换功能,如果需要此功能,可外部添加我开源的带位宽转换功能的FIFO模块。 12. 暂未实现复位功能,一般应用通常不需要复位,也难以去对应Vivado BRAM IP中的复位功能,此IP复位功能还需要增加regcn引脚,rst_busy引脚,还有复位优先级区分,以及是否复位存储器值的选项,有些太繁琐了。 总结:实现了Vivado BRAM IP的绝大部分功能,且保证了信号名称完全一致,在大部分应用场景可替换Vivado BRAM IP以增强代码适用性。 ## 二、模块框图与信号说明 TDPRAM模块框图如下,其余模块SDPRAM、SPRAM、DPROM、SPROM略。 参数说明: | 参数名 | 描述 | | ---------------- | ------------------------------------------------------------ | | RAM_STYLE | RAM类型, 可选"block"(默认), "distributed" | | DATA_WIDTH | 数据位宽, 可选1, 2, 3, ..., 默认为8 | | ADDR_WIDTH | RAM地址位宽, 对应RAM深度, 可选1, 2, 3, ..., 默认为6, 对应深度2**6=64 | | OPERATING_MODE_A | 可选"WF"(默认), "RF", "NC"
WF表示Write First,RF表示Read First,NC表示No Change | | OPERATING_MODE_B | 可选"WF"(默认), "RF", "NC"
WF表示Write First,RF表示Read First,NC表示No Change | | USE_ENA | 是否启用ENA信号,0(默认)表示不启用,1表示启用 | | USE_ENB | 是否启用ENB信号,0(默认)表示不启用,1表示启用 | | OUTPUT_REG_NUM_A | A端口输出寄存器数量,可选0(默认), 1, 2
0表示输出不添加寄存器,直接输出
1表示输出添加一个寄存器,输出延时一个时钟周期
2表示输出添加2个寄存器,输出延时两个时钟周期 | | OUTPUT_REG_NUM_B | B端口输出寄存器数量,与OUTPUT_REG_NUM_A一样 | | INIT_FILE | 初始化文件路径,,空“”(默认)表示不初始化,示例目录C:/ram_init.coe,注意斜杆为除法符号 | | INIT_VALUE_HEX | 默认初始值, 在未指定初始化文件或初始化文件行数比RAM深度小时起作用, 使用16进制表示, 默认值0, | ## 相关文章 [Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读(仅Native RAM) – 徐晓康的博客](https://www.myhardware.top/xilinx-ip-解析之-block-memory-generator-v8-4-01-手册重点解读(仅native-ram)/) [Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native RAM) – 徐晓康的博客](https://www.myhardware.top/xilinx-ip-解析之-block-memory-generator-v8-4-02-如何配置-ip(仅-native-ram)/) [Verilog功能模块–RAM和ROM(01)–功能说明与关键代码解析 – 徐晓康的博客](https://www.myhardware.top/verilog功能模块-ram和rom01-功能说明与关键代码解析/) [Verilog功能模块–RAM和ROM(02)–同步写-写冲突与读-写冲突实测 – 徐晓康的博客](https://www.myhardware.top/verilog功能模块-ram和rom02-同步写-写冲突与读-写冲突实测/) [Verilog 功能模块–RAM 和 ROM(03)–自编 RAM 与 Vivado RAM IP 功能对比实测 – 徐晓康的博客](https://www.myhardware.top/verilog-功能模块-ram-和-rom03-自编-ram-与-vivado-ram-ip-功能对比实测/) ## 其它平台 微信公众号:`徐晓康的博客` 徐晓康的博客公众号二维码