Zynq7 / Zedboard:Xil_in32在读取DRAM时改变数据

时间:2016-03-10 13:57:04

标签: fpga xilinx zynq

我有一个Zedboard,在PL(FPGA)中有以下设置:

自定义AXI(完整)主控 - >互连 - > Zynq_PS(HP0从端口)

  • 自定义AXI主机产生数据(简单计数器,写入DRAM,从0x00000000开始)。
  • 将数据写入DRAM(根据XMD控制台 - > mrd 0x00000000 10)
  • 当PS想要读取数据时(main.c - >调用" Xil_in32(0x00000000)")数据被更改 !!!

问题: 调用函数Xil_in32(用于从DRAM读取数据)在某些情况下改变数据本身? (何时以及为何?)

除非调用Xil_in32,否则不会更改数据。在从main.c调用Xil_in32之前从XMD控制台读取数据证明了这一点。

C代码:

#include <stdio.h>
#include "platform.h"
#include <unistd.h>

#include "xparameters.h"
#include "xil_io.h"
#include "xstatus.h"
#include "xscugic.h"
#include "xil_exception.h"

#include "ps7_init.h"

#define PARAM_BASE_ADDRESS               0x00000000

int main()
{
    // initialization
    init_platform();
    //ps7_init();
    ps7_post_config();

    // variables
    u32 offset;
    u32 param;
    int i = 0;
    xil_printf(" PL WRITING & PS READING DRAM MEMORY TEST ");

    // loop
    while ( 1 ) {

        getchar();

        offset = 0X00000000;
        for (i = 0; i < 50 ; i++){
            offset = offset + 4;
            param = Xil_In32(PARAM_BASE_ADDRESS + offset);
            xil_printf("mem_read %d : %x \n\r",i , param);
        }
    }

    cleanup_platform();
    return 0;
}

XMD阅读数据: 这显示了我已经停止读取内存的位置,然后计数器继续:

  C8:   7252E9D5
  CC:   D7387D6F
  D0:   1E998873
  D4:   5DD8305F
  D8:   C4FEC147
  DC:   347EBE2F <------ last memory read by Xil_in32
  E0:   0000003F <------ counter
  E4:   00000040 
  E8:   00000041
  EC:   00000042
  F0:   00000043
  F4:   00000044
  F8:   00000045
  FC:   00000046
 100:   00000047
 104:   00000048
 108:   00000049
 10C:   0000004A

1 个答案:

答案 0 :(得分:2)

解决方案1)

通过运行cleanup_platform()或disable_caches()来禁用缓存; (在platform.c中定义)解决了改变数据的问题。

问题:

2)哪些禁用缓存对实际应用意味着什么?一切都直接写入/写入DRAM?

3)是否有任何解决方法,只有部分内存可以直接读/写? (当ARM计算某些东西时,不使用缓存似乎非常低效,因此我想避免使用它)

解决方案2)

在通过调用Xil_DCacheFlushRange(PARAM_BASE_ADDRESS,4 * 1)从DRAM读取数据之前刷新缓存; (在xil_cache.c中定义)

#include <stdio.h>
#include "platform.h"
#include <unistd.h>

#include "xparameters.h"
#include "xil_io.h"
#include "xstatus.h"
#include "xscugic.h"
#include "xil_exception.h"

#include "ps7_init.h"
#include "xil_cache.h"

#define PARAM_BASE_ADDRESS               0x00000000

int main()
{
    // initialization
    init_platform();
    //ps7_init();
    ps7_post_config();
    // cleanup_platform();                                  // DISABLING CACHES


    // variables
    u32 offset;
    u32 param;
    int i = 0;
    xil_printf(" PL WRITING & PS READING DRAM MEMORY TEST ");

    // loop
    while ( 1 ) {

        getchar();

        Xil_DCacheFlushRange(PARAM_BASE_ADDRESS, 4*1);      // CACHE FLUSHING
        offset = 0X00000000;
        for (i = 0; i < 50 ; i++){                          // LOOP FOR READING DATA
            param = Xil_In32(PARAM_BASE_ADDRESS + offset);
            xil_printf("mem_read %d : %x \n\r",i , param);
            offset = offset + 4;
        }
    }

    cleanup_platform();
    return 0;
}