您的位置:首页 > 其它

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

2014-09-26 15:51 411 查看
上一篇笔记http://blog.csdn.net/stormragewang/article/details/39008553记录了如何创建一个hello world工程,现在我们使用基本的IO操作,写一个跑马灯的小程序。
这次我们不从ISE创建工程,直接从Xilinx Platform Studio中创建一个新环境



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



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



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



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



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



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



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



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

但是请注意

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

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

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





然后修改约束文件(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Xilinx fpga LED