SP605 Spartan 6 DDR3寻址

bup*_*d82 5 memory verilog spartan interface xilinx

下一篇文章很长,但是由于我已经有一个多月无法使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性能范围:未选中

  • 存储区3的内存类型:DDR3 SDRAM

  • bank 1的内存类型:无

C3的选项– DDR3 SDRAM

  • 频率:400 MHz

  • 内存部分:MTJ41J64M16XX-187E

C3 – DDR3 SDRAM的内存选项

  • 输出驱动器阻抗控制:RZQ / 6

  • RTT(标称)– ODT:RZQ / 4

  • 自动自我刷新:已启用

C3的端口配置– DDR3 SDRAM

  • 两个32位双向和四个32位单向端口

  • 端口0:选中

  • 端口1:未选中

  • Port2:未选中

  • 端口3:未选中

  • Port4:未选中

  • 端口5:未选中

  • 内存地址映射选择:行库列

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
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

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; 
Run Code Online (Sandbox Code Playgroud)

===结论===

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

非常感谢,布鲁诺。