【问题标题】:Zynq7 / Zedboard: Xil_in32 alters data when reading from DRAMZynq7 / Zedboard:Xil_in32 在从 DRAM 读取时改变数据
【发布时间】:2016-06-25 10:00:50
【问题描述】:

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

自定义 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

【问题讨论】:

    标签: fpga xilinx zynq


    【解决方案1】:

    解决方案 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;
    }
    

    【讨论】:

    • 可能是 Vivado 设计中某处的缓存大小被配置为使用地址为0x00 的 DRAM 块,最高可达0xe0。但这似乎是一个荒谬的缓存大小......除非没有足够的数据来填充它并更改您的数据?
    • AXI ACP 端口提供对 DDR 的高速缓存一致访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2021-08-24
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多