玩转赛灵思Zedboard开发板(5):基于AXI Lite总线的从设备IP设计
gs.com/surpassal/ 1 #include
2 #include "xparameters.h"
3 #include "xil_types.h"
4 #include "xstatus.h"
5 #include "xil_io.h"//包含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\n\r");
21 print("超群天晴 2012年10月8日22:12:31\n\r");
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
AXI Reference Guide (AXI)
================================
完整工程代码:定制简单LED的IP核的设计源代码(Lab4.rar)