SP605 Spartan 6 DDR3寻址

时间:2016-01-06 01:22:23

标签: memory interface verilog xilinx spartan

以下帖子相当长,但由于我在使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页:写入数据结构。

  • 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; 

===结论===

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

非常感谢, 布鲁诺。

0 个答案:

没有答案