下面的帖子很长,但是由于我在一个多月以来一直无法让 SP605 板与 DDR3 正确交互,希望这对与我发现自己处于相同情况的其他人有用。我很确定它是一个简单的配置或概念错误,但我很乐意尽快解决这个问题。
=== 场景 ===
我创建了一个 USB-UART 接口来与 FPGA 通信并控制 DDR3。使用 ISE 中的 IP 生成器,我生成了一个 MIG 包装器,然后我设计了内存接口控制器。但是,我参考了 ug388 和 ug416 手册,但我无法让 DDR3 按预期运行。
=== 问题陈述 ===
玩弄写入和读取命令的突发长度,我能够从 DDR3 取回数据,但寻址方案似乎不正确,因为数据在地址 0 和 1、2 和 3、4 和 5 中重复,等等。此外,例如,每当我写入地址 0 时,都没有任何变化。然后,当我写入地址 1 时,地址 0 和 1 都会更新为我刚刚发送的数据值。由于这种耦合效应,我似乎“丢失”了一半的内存空间。
=== DDR3 IP 配置 ===
下面列出了使用 IP 生成器的 DDR3 设置(考虑到 SP605 板场景)。总之,我激活了 DDR3 Bank 3 并将 Port0 配置为 32 位双向。
内存选择:
启用 AXI 接口:未选中
使用扩展 MCB 性能范围:未选中
bank 3 的内存类型:DDR3 SDRAM
bank 1 的内存类型:无
C3 选项 – DDR3 SDRAM
频率:400兆赫
内存部分:MTJ41J64M16XX-187E
C3 的内存选项 – DDR3 SDRAM
输出驱动阻抗控制:RZQ/6
RTT(标称)- ODT:RZQ/4
自动自刷新:启用
C3 的端口配置 – DDR3 SDRAM
两个 32 位双向端口和四个 32 位单向端口
端口 0:已检查
端口 1:未选中
端口 2:未选中
端口 3:未选中
端口 4:未选中
端口 5:未选中
内存地址映射选择:row-bank-column
C3 的 FPGA 选项 – DDR3 SDRAM
存储器接口引脚端接:校准的输入端接
选择 RZQ 引脚位置:R7
选择 ZIO 引脚位置:W4
内存控制器的调试信号:禁用
系统时钟:差分
=== 数据结构 ===
在 Matlab 中,我发送了一个 64 位命令,该命令应该根据该命令中提供的地址和数据写入或读取 DDR3。
wire [00:00] cmd_instruction = usb_data[63:63]; // ‘0’ = write; ‘1’ = read
wire [27:00] cmd_address = usb_data[62:37]; // 26-bit address
wire [31:00] cmd_data = usb_data[31:00]; // 32-bit data
在ug388中,可以提取以下内容:
第 20 页:地址为 26 位宽。
C_MEM_ADDR_WIDTH = 13
C_MEM_BANKADDR_WIDTH = 3
C_MEM_NUM_COL_BITS = 10
C_P0_DATA_PORT_SIZE = 32 // 32-bit data ports
C_P0_MASK_SIZE = 4 // 4 bytes = 32 bits (1 mask bit = 1 entire data byte)
第 26-27 页:命令数据结构。
pX_cmd_addr[29:0]:30 位地址,但最后两位应 = “00”,因为每个字(32 位)由 4 个字节组成。
pX_cmd_bl[5:0]:通过将此信号设置为 0 来获得 1 的突发长度。
pX_cmd_instr[2:0]:唯一使用的命令指令是 write=”000” 和 read=”001”。
第 28 页:编写数据结构。
- pX_wr_mask[PX_MASKSIZE-1:0]:4 位掩码设置为“0000”,以便始终将所有 4 个字节写入内存。
=== 信号分配 ===
使用所有这些信息,我以下列方式分配我的信号:
assign p0_mcb_cmd_instr = {2'b00, cmd_instruction};
assign p0_mcb_cmd_addr = {2’d0, cmd_address, 2'd0};
assign p0_mcb_cmd_bl = 6'd0;
assign p0_mcb_wr_data = cmd_data;
assign p0_mcb_wr_mask = 4'd0;
localparam C3_MEM_BURST_LEN = 8;
=== 结论 ===
根据配置,有谁知道我的控制器的预期行为应该是什么?如果需要任何其他信息来澄清,请告诉我。
非常感谢,布鲁诺。