# 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-功能对比实测/)
## 其它平台
微信公众号:`徐晓康的博客`
