微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 玩转赛灵思Zedboard开发板(5):基于AXI Lite总线的从设备IP设计

玩转赛灵思Zedboard开发板(5):基于AXI Lite总线的从设备IP设计

时间:11-23 来源:cnblog 点击:

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)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top