Xilinx FPGA ML605 开发笔记——跑马灯程序

上一篇笔记 http://blog.csdn.net/stormragewang/article/details/39008553记录了如何创建一个hello world工程,现在我们使用基本的IO操作,写一个跑马灯的小程序。

这次我们不从ISE创建工程,直接从Xilinx Platform Studio中创建一个新环境


打开界面后选择使用向导创建工程

Xilinx FPGA ML605 开发笔记——跑马灯程序_第1张图片

接下来选择工程的存储位置

Xilinx FPGA ML605 开发笔记——跑马灯程序_第2张图片

接下来是选择开发板的型号

Xilinx FPGA ML605 开发笔记——跑马灯程序_第3张图片

然后选择你需要的外设,我这个跑马灯程序只需要LED和LED_BUTTONS,串口用来输出信息

Xilinx FPGA ML605 开发笔记——跑马灯程序_第4张图片

选择你需要的外设点击“完成”就可以了,之后进入工程的编辑界面,我们什么都不做,直接依次运行左边的Implement Flow就可以了

Xilinx FPGA ML605 开发笔记——跑马灯程序_第5张图片

到最后Export这一步选择“Export and Launch SDK"就可以打开SDK了


在SK中我们新建一个Demo_LED的hello world工程,在工程对应的BSP工程下的sys.mss文件中有你添加的外设的相关文档和示例,直接选择LED就可以,效果如下图

Xilinx FPGA ML605 开发笔记——跑马灯程序_第6张图片

第二个xgpio_example.c中有如何使用示例代码


但是请注意

1、截图中有个axi_gpio_0,那是因为中间我把LED删除了,然后通过添加GPIO的IP核方式添加到LED的连线上

2、示例代码是有问题的,我们参考相关的函数就好

3、默认的LED只作为GPIO的输出线,所以XGpio_DiscreteRead函数不好使。需要把它改为IO线(在Xilinx Platform Studio中修改)

Xilinx FPGA ML605 开发笔记——跑马灯程序_第7张图片


然后修改约束文件(system.ucf)使GPIO的IO线连接LED(仅参考LED的接线)

#
# pin constraints
#
NET CLK_N LOC = "H9"  |  DIFF_TERM = "TRUE"  |  IOSTANDARD = "LVDS_25";
NET CLK_P LOC = "J9"  |  DIFF_TERM = "TRUE"  |  IOSTANDARD = "LVDS_25";
NET Push_Buttons_5Bits_TRI_I[0] LOC = "G26"  |  IOSTANDARD = "LVCMOS15";
NET Push_Buttons_5Bits_TRI_I[1] LOC = "A19"  |  IOSTANDARD = "LVCMOS15";
NET Push_Buttons_5Bits_TRI_I[2] LOC = "G17"	|  IOSTANDARD = "LVCMOS15";
NET Push_Buttons_5Bits_TRI_I[3] LOC = "A18"  |  IOSTANDARD = "LVCMOS15";
NET Push_Buttons_5Bits_TRI_I[4] LOC = "H17"  |  IOSTANDARD = "LVCMOS15";
NET RESET LOC = "H10"  |  IOSTANDARD = "SSTL15"  |  TIG;
# 
# additional constraints
#

NET "CLK" TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 200000 kHz;

#
# the LED constraints
# 
NET axi_gpio_0_GPIO_IO_pin[0] LOC = "AC22"	|	IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[1] LOC = "AC24"	|	IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[2] LOC = "AE22"	|  <span style="white-space:pre">	</span>IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[3] LOC = "AE23"	|  <span style="white-space:pre">	</span>IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[4] LOC = "AB23"	|	IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[5] LOC = "AG23"	|	IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[6] LOC = "AE24"	|	IOSTANDARD = "LVCMOS15";
NET axi_gpio_0_GPIO_IO_pin[7] LOC = "AD24"	|	IOSTANDARD = "LVCMOS15";

# IOSTANDARD = "LVCMOS25";
# the uart constraints
#
NET axi_uartlite_0_RX_pin LOC = "J24"  |  IOSTANDARD = "LVCMOS15";
NET axi_uartlite_0_TX_pin LOC = "J25"  |  IOSTANDARD = "LVCMOS15";
再重新生成bit文件和导出到SDK中

3、改成IO线后需要使用XGpio_SetDataDirection函数来设置数据的传递方向才能再读写数据,下面是我最终的代码

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xgpio_l.h"

XGpio Gpio_LEDS;
#define LED_DELAY	5000000
#define LED_CHANNEL 1
#define LED_NUM  	8

int show_leds(void)
{
	int status;
	int index = 0;
	u32 DATAS[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
	u32 tmp;
	volatile int Delay;
	status = XGpio_Initialize(&Gpio_LEDS, XPAR_GPIO_0_DEVICE_ID);
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
	XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, 0x00);
	while (1) {
		XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0x00000000);
		XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, DATAS[index]);
		index ++;
		index = index % LED_NUM;
 		for (Delay = 0; Delay < LED_DELAY; Delay++);
 		XGpio_SetDataDirection(&Gpio_LEDS, LED_CHANNEL, 0xFFFFFFFF);
		tmp = XGpio_DiscreteRead(&Gpio_LEDS, LED_CHANNEL);
		xil_printf("Read the data:%d\r\n", tmp);
	}

	return XST_SUCCESS;
}




你可能感兴趣的:(FPGA,led,Xilinx)