[X]关闭
 专注集成电路FPGA应用生态推广
 微信公众号
扫码关注
米联客uisrc 首页 技术类 随心笔记 查看内容
3

实现电脑PCIE和PS的ARM共享DDR设计

摘要: 最近有客户小朋友用我们的PCIE教程去实现PCIE和ARM共享PS DDR的数据,这位小朋友总是搞不出来,总是来骚扰我,所以抽出一个晚上,把这个功能简单调试下,真的很简单,下面把代码贴出来。 首先是ARM测试程序的升 ...
            
最近有客户小朋友用我们的PCIE教程去实现PCIE和ARM共享PS DDR的数据,这位小朋友总是搞不出来,总是来骚扰我,所以抽出一个晚上,把这个功能简单调试下,真的很简单,下面把代码贴出来。
       首先是ARM测试程序的升级,我们PCIE上位机发送4096个数据,ARM端程序,只要收到第一个数据为1就表示PCIE上位机已经发送数据到PS DDR了,之后我们的ARM端程序会读出所有的4096个数据,并且加1 再写入到PS DDR.


[pre]
#include
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#define PCIE_DATA_ADDR 0x10000000
u8*BufferPtr = (u8 *)PCIE_DATA_ADDR;

int main()
{
    int i=0;
    int read_val = 0;
    Xil_DCacheDisable();
    while(1)

    {       read_val=Xil_In8(PCIE_DATA_ADDR);
                    if(read_val==1)
                    {
                            for(i = 0; i < 4096; i++)
                            {
                                    read_val=Xil_In8(PCIE_DATA_ADDR + i);
                                    Xil_Out8(PCIE_DATA_ADDR + i, read_val+1);
                              //printf("pcie read %d: %d\r\n",i,read_val);
                            }
                    read_val=0;
                    }
    }
    return 0;
}
[/pre]
      再来看上位机程序,上位机可以利用PCIE 第三课CH03_BAR_DDR程序只要稍作修改,每次发送4096字节数据,并且把的第一个数据设置为1,发送完成后要等待一会,等ARM端读并且加1后写入到DDR,完成后再读出PS DDR数据,做比较,看是否加1了。
测试结果如下

[pre]
void MainWindow::on_TestDDR_clicked()
{
    unsigned char buf1[4096];
    unsigned char *buf2 = c2h_align_mem_tmp;
    unsigned int i=0;
    unsigned char tmp;
    unsigned int error_cnt =0;

    for(i=0;i<4096;i++)
    {
        buf1 = i+1;
    }
    put_data_to_fpga_ddr(FPGA_DDR_START_ADDR,buf1,4096);

    Sleep(1000);
    get_data_from_fpga_ddr(FPGA_DDR_START_ADDR,buf2,4096);

    for(i=0;i<4096;i++)
    {
        tmp = buf1 + 1;
        if(tmp!= buf2)
            error_cnt++;
    }
    if(error_cnt)
    {
        m_ddrpass++;
        QString str  =  QString("%1 %2").arg("DDR bad data = ").arg(error_cnt);
        ui->labelDDRPASS->setText(str);
    }
    else
    {
        m_ddrpass++;
        QString str  =  QString("%1 %2").arg("DDR PASS Times = ").arg(m_ddrpass);
        ui->labelDDRPASS->setText(str);
    }

}
[/pre]

测试结果:
74JQCN$IOS75R`G@G3XYVL3.png

最后小结:可以看到测试只用了byte读写测试也就是8bit,如果用32bit测试,也就是4bytes,应该还要注意ARM和X86主机之间大小端对齐的问题。这个留给具体开发应用的人去做把。我这里只会给出一个简单的例子,表示共享数据没有问题的。





路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有3条评论

最新评论...

云海2020-3-9 17:40引用

谢谢

I'mpossible2020-4-1 16:24引用

感谢分享

OwenMao2021-6-7 17:07引用

支持!

查看全部评论(3)

本文作者
2019-9-6 18:22
  • 6
    粉丝
  • 1921
    阅读
  • 3
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
相关分类
热门评论
排行榜

关注我们|扫描二维码

米联客微信公众号

米联客天猫旗舰店

客服服务热线:

0519-80699907

常州-总部:常州溧阳市中关村吴潭渡路雅创高科智造谷10-1幢楼

南京-分部:南京市栖霞区仙林大道181号5幢1821室

邮编:213300 Email:tjy@uisrc.com

Copyright   ©2020-2026 内容版权归©UISRC.COM    ( 苏ICP备19046771号-2 )