四、使用SDK編寫IP核驅動程序和應用程序
打開SDK,可以從系統信息system.xml中看到我們的系統信息。可以看到我們實例化連接到系統的ip是my_axi_ip_0,基地址是0x4000000。
建立軟件工程后,修改main代碼,如下
//@超群天晴 http://www.cnblogs.com/surpassal/ 1 #include
2 #include "xparameters.h"
3 #include "xil_types.h"
4 #include "xstatus.h"
5 #include "xil_io.h"http://包含xil_io頭文件,完成對絕對地址的訪問
6 #include "platform.h"
7
8 #define LED_DATA_REG 0x40000000
9
10 void print(char *ptr);
11 void delay(unsigned int delaytime);
12 void LED_Play(unsigned char led);
13
14
15 int main(void)
16 {
17
18 init_platform();
19
20 print("ZedBoard LAB4: MY_AXI_LEDs ");
21 print("超群天晴 2012年10月8日22:12:31 ");
22
23 LED_Play(0x03);
24 while(1);
25
26 cleanup_platform();
27
28 return 0;
29 }
30
31
32 void delay(unsigned int delaytime)
33 {
34 int i;
35 for(i=0;i
36 ;
37 }
38
39 void LED_Play(unsigned char led)
40 {
41 for(;;)
42 {
43 led=(led<<1)|(led>>7);
44 Xil_Out32(LED_DATA_REG,led);
45 delay(50000000);
46 }
47 }
定義了兩個函數
void delay(unsigned int delaytime);
void LED_Play(unsigned char led);
其中delay()為延時函數,參數為延時時間,100000000大約延時1s;
LED_Play()為LED流水燈函數,參數是流水初始值。在程序里面設定的是0x2,也就LD0、LD1最開始亮,然后流水。
其中第8行
#define LED_DATA_REG 0x40000000
使用宏定義,定義LED_DATA_REG,實際上就是自定義IP的基地址。
第44行
Xil_Out32(LED_DATA_REG,led);
使用了xil_io.h提供的絕對地址訪問函數Xil_Out32(u32 OutAddress, u32 Value),定義如下
1 /*****************************************************************************/
2 /**
3 *
4 * Performs an output operation for a 32-bit memory location by writing the
5 * specified Value to the the specified address.
6 *
7 * @param OutAddress contains the address to perform the output operation
8 * at.
9 * @param Value contains the Value to be output at the specified address.
10 *
11 * @return None.
12 *
13 * @note None.
14 *
15 ******************************************************************************/
16 void Xil_Out32(u32 OutAddress, u32 Value)
17 {
18 /* write the contents of the I/O location and then synchronize the I/O
19 * such that the I/O operation completes before proceeding on
20 */
21 *(volatile u32 *) OutAddress = Value;
22 SYNCHRONIZE_IO;
23 }
可以看出,其實現的功能就是向32位絕對地址OutAddress中寫入32位無符號值Value。參考這樣的寫法,可以將地址訪問修改
1 #define LED_DATA_ADDR 0x40000000
2 #define LED_DATA_REG(x) *(volatile unsigned int *) LED_DATA_ADDR = x
然后修改寄存器的值,只需要修改LED_DATA_REG(x)參數x的值即可。
五、運行結果
編譯下載之后,可以從超級終端看到調試信息
同時Zedboard上的 LD 流水
================================
備注:
有關AXI協議,請參考
AXI Bus Functional Model v1.1 Product Brief
================================
完整工程代碼:定制簡單LED的IP核的設計源代碼(Lab4.rar)
評論
查看更多