本文是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(),確證比較顯示的值。