> ## Content Index
> Fetch the complete content index at: https://cms.yufeiran.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# DDR2 RAM 读写模块[verilog]
- URL: https://cms.yufeiran.com/ddr2-ram-de-shi-xian-verilog/
- Published: 2021-03-10T04:40:03.000Z
- Updated: 2026-09-27T12:37:55.000Z
- Author: Feiran Yu
- Tags: 作品, #legacy-import

## 需求分析

[用Nexys4 DDR 制作一台计算机\[1\] 硬件](https://yufeiran.com/yong-nexys4ddr-zhi-zuo-yi-tai-ji-suan-ji-1/?ref=cms.yufeiran.com)需要一次最小读写宽度8bits，最大读写宽度32bits的内存。

## 原理分析

NEYXS 4 DDR里的DDR2 SDRAM型号为MT47H64M16HR-25:H，它的文档在[这里](https://www.micron.com/-/media/client/global/documents/products/data-sheet/dram/ddr2/1gb%5Fddr2.pdf?ref=cms.yufeiran.com)  
由于DDR协议比较复杂，Xilinx提供了一个简化控制DDR的内存控制器IP核，Memory Interface Generator(MIG)，这里就使用这个IP核来进行操作。

### DDR RAM时序

它一共有以下几个信号  
app\_addr \[26:0\] in 数据地址  
app\_cmd \[2:0\] in 操作指令，3’b001为读，3’b000为写  
app\_en in 指令使能  
app\_rdy out 指令接受，SDRAM接受到信号之后就会将其拉高  
app\_wdf\_data \[127:0\] in 写数据，通过app\_wdf\_mask处理后写入SDRAM  
app\_wdf\_mask \[15:0\] in 写数据中一个byte对应这里一个bit，将某一位设高就意味着忽略该位对应的数据byte后写入SDRAM  
app\_wdf\_end in 在发送最后一个数据的时候将其拉高，以通知SDRAM结束写入操作  
app\_wdf\_wren in 写使能，在把前面的app\_wdf\_data和app\_wdf\_mask都写好了之后，把这个信号拉高，来通知SDRAM可以开始写入  
app\_wdf\_rdy out 写数据指令接收，SDRAM接收到app\_wdf\_data和app\_wdf\_mask之后就会将其拉高  
app\_rd\_data \[127:0\] out 读取的数据  
app\_rd\_data\_valid out 读取数据有效，当SDRAM将数据读取到app\_rd\_data时会将这个信号拉高  
app\_sr\_req in 保留引脚，应该拉低  
app\_ref\_req in 拉高这个信号发送一个refresh指令给DRAM，一次只能拉高一个时钟周期  
app\_zq\_req in 拉高这个信号发送一个ZQ校准指令，校准ODT电阻值，也是一次只能拉高一个时钟周期  
app\_sr\_active out 保留引脚  
app\_ref\_ack out SDRAM响应refresh信号时拉高  
app\_zq\_ack out SDRAM响应ZQ校准信号时拉高  
ui\_clk out IP核给用户用的时钟，对于这个IP核操作的时序电路必须用这个时钟信号  
ui\_clk\_sync\_rst out 给用户用的复位信号，同上，对于这个IP核操作的时序电路必须用这个时钟信号

### wishbone总线写时序

既然是内存，便需要写入数据，下图是写操作时wishbone总线的时序，读操作的数据已经在前一篇flash里介绍了。  

![write](https://yufeiran.com/content/images/2021/03/write.jpg)

  
cpu在需要写入内存的时候，会将STB\_O、CYC\_O,WE\_O拉高，将ADR\_O,DATA\_O数据给出,内存接受到STB\_O和CYC\_O信号拉高的时候会开始执行操作，操作执行完将ACK\_I拉高。  
wishbone总线控制器接收到ACK\_I拉高的信号会提醒CPU并将STB\_O和CYC\_O信号拉低，内存进入等待指令状态

## 设计

### 时序与状态机设计

如下图  

![时序与状态机](https://yufeiran.com/content/images/2021/03/----_20210312153046.jpg)

## 参考链接

[Nexys4 DDR上的DDR2仿真与设计](https://www.jianshu.com/p/9f5d5161839c?ref=cms.yufeiran.com)  
[FPGA基础入门【9】开发板外部存储器DDR2访问](https://blog.csdn.net/qimoDIY/article/details/88986354?ref=cms.yufeiran.com)  
[DDR控制器MIG核的使用](https://blog.csdn.net/weixin%5F42039756/article/details/104356457?utm%5Fmedium=distribute.pc%5Frelevant.none-task-blog-baidujs%5Ftitle-0&spm=1001.2101.3001.4242&ref=cms.yufeiran.com)  
[Vivado中MIG核中DDR的读写控制](https://blog.csdn.net/wordwarwordwar/article/details/79539049?ref=cms.yufeiran.com)  
[PrimeMHD/FPGA\_ThreeLevelStorage](https://github.com/PrimeMHD/FPGA%5FThreeLevelStorage?ref=cms.yufeiran.com)  
[SRAM to DDR Component](https://reference.digilentinc.com/learn/programmable-logic/tutorials/nexys-4-ddr-sram-to-ddr-component/start?ref=cms.yufeiran.com)