PL讀寫DDR3 實現PS和PL間的數據交互 查表程序的驗證程序

本文是PL讀寫DDR3 實現PS和PL間的數據交互 查表程序 的續集,ip的源代碼見上文。本文只是提供一種簡單驗證方法。直接用axi_gpio這個系統提供的ip進行驗證,而原文需要自己加建立一個ip來驗證。

建立工程等一般流程這裏不介紹了。

在建立的原理圖裏

添加cpu,然後添加上文介紹自建的ip searchTable, 添加2個axi_gpio。

原理圖如下:

這裏2個gpio 分別設置如下:

輸入需要2路,一路32位,一路位16位,需要使能 Enable Dual Channel。

輸出也是2路,一個32位,一個爲1位 ,需要使能 Enable Dual Channel。

searchTable 這個ip 也要設置一下地址偏移,這裏設置爲0x0400 0000。中間空格只是你好看清楚,設置區間爲DDR的一個區間。

 

爲了連接axi 這裏需要 master axi 和 slave axi,所以處理器需要設置如下:

 

設置好了各ip ,連接好線, 保存原理圖,Create HDL Wrapper ,Generate Output Procucts, 然後產生比特流,輸出硬件,啓動SDK。

在sdk 裏生成一個helloworld 工程, 然後代碼修改如下:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xil_io.h"

#define MY_IPIN	0x41200000
#define MY_IPOUT	0x41210000
#define DDRAM	0x04000000

u32 searcha[2000];
u32 ok=0;
u32 nook=0;


void setram2(u32 count)
{
	u32 comp_addr=DDRAM;
	u32 i;
	for(i=0;i<count;i+=4)
	{
		Xil_Out32(comp_addr+i,i);
	}
}


void searchi(u32 addr)
{
	u16 state=0;
	u32 result;
	int delay=0;
	u32 comp;
	u32 comp_addr=addr+DDRAM;
	comp=Xil_In32(comp_addr);

	Xil_Out32(MY_IPOUT+8,0);

	Xil_Out32(MY_IPOUT,addr);
	Xil_Out32(MY_IPOUT+8,1);
	state=Xil_In32(MY_IPIN+8);
	while((state&0x4000)==0)
	{
		delay++;
		if(delay>1000)
			break;
		state=Xil_In32(MY_IPIN+8);
	}
	result=Xil_In32(MY_IPIN);
	if(result==comp) ok++;
	else nook++;
	printf("------addr=%d rusult=%x comp=%x\n",addr,result,comp);
}


int main()
{
	u32 i;
	u32 counts;
	u32 setNo;
    init_platform();

   // Xil_DCacheDisable();

    counts=80;
    setNo=100;
    setram2(setNo);

    Xil_DCacheFlush();

    ok=0;nook=0;
    for(i=0;i<counts;i+=4)
    	searchi(i);

    printf("counts=%d,ok=%d,fail=%d,setNo=%d\n",(int)counts,(int)ok,(int)nook,(int)setNo);

    cleanup_platform();
    return 0;
 }

代碼調試或運行,結果如下:

------addr=0 rusult=0 comp=0
------addr=4 rusult=4 comp=4
------addr=8 rusult=8 comp=8
------addr=12 rusult=c comp=c
------addr=16 rusult=10 comp=10
------addr=20 rusult=14 comp=14
------addr=24 rusult=18 comp=18
------addr=28 rusult=1c comp=1c
------addr=32 rusult=20 comp=20
------addr=36 rusult=24 comp=24
------addr=40 rusult=28 comp=28
------addr=44 rusult=2c comp=2c
------addr=48 rusult=30 comp=30
------addr=52 rusult=34 comp=34
------addr=56 rusult=38 comp=38
------addr=60 rusult=3c comp=3c
------addr=64 rusult=40 comp=40
------addr=68 rusult=44 comp=44
------addr=72 rusult=48 comp=48
------addr=76 rusult=4c comp=4c
counts=80,ok=20,fail=0,setNo=100

你可以改變程序中的counts, setNo的數值,也可以改變區間初始化賦值的setram2(),確證比較顯示的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章