5

下面的帖子很长,但是由于我在一个多月以来一直无法让 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; 

=== 结论 ===

根据配置,有谁知道我的控制器的预期行为应该是什么?如果需要任何其他信息来澄清,请告诉我。

非常感谢,布鲁诺。

4

0 回答 0