硬件環境:TLZ7100開發板
軟件環境:Vivado 2017.4
工程功能:(1)創建工程,加入IO控制,串口通信
(2)IO控制方法有MIO、EMIO、AXI總線接口
(3)加入串口,使用串口發送指令,控制不同的LED亮滅
暫定串口指令格式:<1,on> <1,off>
IO控制路數:
LED1 A24 PS_MIO9
LED2 C7 IO_L4P_T0_34
LED3 H8 IO_L15N_T2_DQS_34
KEY1 F24 PS_MIO0
串口
TX PS_MIO12
RX PS_MIO13
步驟:1、創建Vivado工程,芯片選擇xc7z100ffg900-2
2、創建Block Design
3、添加ZYNQ
4、更改ZYNQ配置參數
5、DDR選擇
6、點擊Run Block Auto
7、點擊Creat HDL Wrapper
8、點擊Generate Bitstream
9、點擊File->Export->Export Hardware
10、點擊File->Launch SDK
11、打開SDK後,選擇File->New->Application project,選擇helloword例程
12、可以看到加載的系統地址分配表
同時IP對應的參數配置會自動生成xparameters.h文件,如下圖,此次例化了uart1,因此此處的串口收發指向串口1
13、在main.c中加入如下代碼
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;
#include "xgpiops.h"
#include "sleep.h"
XGpioPs GpioPs_Init()
{
XGpioPs_Config* GpioConfigPtr;
XGpioPs psGpioInstancePtr;
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
return psGpioInstancePtr;
}
int main()
{
init_platform();
static XGpioPs psGpioInstancePtr;
int iPinNumber = 9; //MIO9,與LED相連
u32 uPinDirection = 0x1; //1表示輸出,0表示輸入
psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr); //GPIO初始化
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置爲輸出
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1); //使能MIO9
print("UART-LED Test\n\r");
while(1)
{
while(XUartPs_RecvByte(STDOUT_BASEADDRESS) != '<')
{
;
}
u8RecData[0] = '<';
u8Cnt = 1;
while(1)//回車
{
u8RecData[u8Cnt] = XUartPs_RecvByte(STDOUT_BASEADDRESS);
if(u8RecData[u8Cnt] == 13)
{
break;
}
u8Cnt++;
}
if(u8RecData[1] == '1')
{
if(u8RecData[2] ==',')
{
if(u8RecData[3] == 'o')
{
if(u8RecData[4] == 'n')
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //點亮
}
else
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄滅
}
}
}
}
}
cleanup_platform();
return 0;
}
14、添加RUN->Debug configurations
15、 點擊Debug,進入調試模式
16、點擊Debug全速運行,在SecureCRT輸入<1,on>,LED1亮,輸入<1,off>,LED1滅。
加入EMIO
1、在Vivado中雙擊ZYNQ核,更改爲下圖所示
2、右擊.bd文件,選擇Creat HDL Wrapper生成頂層文件
3、 加入約束,選擇
4、點擊creat file,生成.xdc文件
寫入
set_property PACKAGE_PIN C7 [get_ports GPIO_0_0_tri_io[0]]
set_property IOSTANDARD LVCMOS15 [get_ports GPIO_0_0_tri_io[0]]
5、點擊生成bit文件
6、導入到硬件,打開SDK
7、重新加載工程,刪除工程(不刪除bsp和plantform)
8、創建新的app proj,選擇helloword,將helloword.c更改爲
#include <stdio.h>
#include "platform.h"
#include "sleep.h"
#include "xgpiops.h"
#include "xil_printf.h"
u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;
XGpioPs GpioPs_Init()
{
XGpioPs_Config* GpioConfigPtr;
XGpioPs psGpioInstancePtr;
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
return psGpioInstancePtr;
}
int main()
{
init_platform();
static XGpioPs psGpioInstancePtr;
int iPinNumber = 9; //MIO9,與LED相連
int iPinNumber_EMIO = 54; //EMIO0,與LED相連
u32 uPinDirection = 0x1; //1表示輸出,0表示輸入
psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr); //GPIO初始化
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置爲輸出
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1); //使能MIO9
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber_EMIO, uPinDirection); //EMIO0配置爲輸出
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber_EMIO, 1); //使能EMIO0
print("UART-LED Test\n\r");
while(1)
{
while(inbyte() != '<')
{
;
}
u8RecData[0] = '<';
u8Cnt = 1;
while(1)//回車
{
u8RecData[u8Cnt] = inbyte();
if(u8RecData[u8Cnt] == 13)
{
break;
}
u8Cnt++;
}
if(u8RecData[1] == '1')
{
if(u8RecData[2] ==',')
{
if(u8RecData[3] == 'o')
{
if(u8RecData[4] == 'n')
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //點亮
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 1);//EMIO的第0位輸出1
}
else
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄滅
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 0);//EMIO的第0位輸出0
}
}
}
}
}
cleanup_platform();
return 0;
}
9、將bit文件下載至FPGA
選擇Debug configurations,設置如下
10、點擊debug,在SecureCRT輸入<1,on>,LED1、LED2亮,輸入<1,off>,LED1、LED2滅。