以下帖子相当长,但由于我在使SP605主板与DDR3正常交互超过一个月之后遇到了麻烦,希望这对我和其他人处于同样情况的其他人有用。我是很确定它是一个简单的配置或概念错误,但我很乐意尽快解决这个问题。
=== SCENARIO ===
我创建了一个USB-UART接口,用于与FPGA通信并控制DDR3。在ISE中使用IP生成器,我生成了一个MIG包装器,然后我设计了内存接口控制器。但是,我引用了手册ug388和ug416,但我还没有让DDR3按预期运行。
===问题陈述===
使用写入和读取命令的突发长度,我能够从DDR3获取数据,但寻址方案似乎不正确,因为数据在地址0和1,2和3中重复, 4和5,等等。而且,每当我写入地址0时,没有任何改变。然后,当我写入地址1时,地址0和1都用我刚刚发送的数据值更新。我好像失去了#34;由于这种耦合效应,存储空间的一半。
=== DDR3 IP CONFIGURATION ===
下面列出了使用IP发生器的DDR3设置 - 考虑到SP605板的情况。总而言之,我激活了DDR3 Bank 3并将Port0配置为32位双向。
内存选择:
启用AXI接口:未选中
使用扩展的MCB性能范围:未选中
银行3的内存类型:DDR3 SDRAM
银行1的内存类型:无
C3-DDR3 SDRAM的选项
频率:400 MHz
记忆部分:MTJ41J64M16XX-187E
C3 - DDR3 SDRAM的内存选项
输出驱动器阻抗控制:RZQ / 6
RTT(名义) - ODT:RZQ / 4
自动自刷新:已启用
C3-DDR3 SDRAM的端口配置
两个32位双向和四个32位单向端口
Port0:已检查
Port1:未选中
Port2:未选中
Port3:未选中
Port4:未选中
Port5:未选中
内存地址映射选择:row-bank-column
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页:写入数据结构。
===信号分配===
使用所有这些信息,我按以下方式分配了信号:
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;
===结论===
根据配置,有谁知道控制器的预期行为应该是什么? 如果需要任何其他信息以供澄清,请告知我们。
非常感谢, 布鲁诺。