Memory SP605斯巴达6 DDR3寻址

Memory SP605斯巴达6 DDR3寻址,memory,interface,verilog,xilinx,spartan,Memory,Interface,Verilog,Xilinx,Spartan,下面的帖子很长,但由于一个多月来我一直无法使SP605板正确地与DDR3交互,希望这对我所处的情况相同的其他人有用。我很确定这是一个简单的配置或概念错误,但我非常乐意很快解决这个问题 ==情景=== 我已经创建了一个USB-UART接口来与FPGA通信并控制DDR3。使用ISE中的IP生成器,我生成了一个MIG包装,然后设计了内存接口控制器。然而,我参考了手册ug388和ug416,但我无法使DDR3按预期运行 ==问题陈述=== 利用写和读命令的突发长度,我能够从DDR3获取数据,但寻址方案似

下面的帖子很长,但由于一个多月来我一直无法使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配置===

考虑到SP605板方案,使用IP生成器的DDR3设置如下所示。总之,我激活了DDR3 Bank 3并将端口0配置为32位双向

内存选择:

  • 启用AXI接口:未选中

  • 使用扩展MCB性能范围:未选中

  • 气缸组3的内存类型:DDR3 SDRAM

  • 气缸组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:未选中

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

C3–DDR3 SDRAM的FPGA选项

  • 内存接口引脚端接:校准输入端接

  • 选择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; 
==结论===

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

非常感谢, 布鲁诺