在 main.c 的開頭,我們加載了需要使用的幾個頭文件,在 Xilinx SDK 中,已經(jīng)包含了一些預(yù)設(shè)好的函式庫等功能,具體信息請查閱 Xilinx OS and Libraries Document Collection (UG643) 手冊。
xparameters.h 這個頭文件則是 Xilinx SDK 自己產(chǎn)生的,里面會包含一些關(guān)于你使用的 IP Core 的信息,比如標準輸出的基地址 (base address) 或是其他和你這份硬件相關(guān)的設(shè)定。而 xgpio.h 則提供了一些高階的抽象函式,讓你開發(fā) GPIO 相關(guān)的功能可以更加輕松。
#include "xparameters.h"
#include "xgpio.h"
#include
#include
我們用一個非常簡單的延遲 (delay) 函式讓 CPU 很忙碌的計算,來達到延遲程序的效果。
void simple_delay (int simple_delay)
{
volatile int i = 0;
for (i = 0; i < simple_delay; i++);
}
接下來是我們的主程序,我們將它拆開來看,后面見到的程序代碼都會塞到主程序中。
int main(int argc, char *argv[])
{
// code
return 0;
}
是時候進入到 GPIO 的功能設(shè)定,注意到 XPAR_AXI_GPIO_0_DEVICE_ID 這個,你可以把它對應(yīng)回我們的 Block Design 的 axi_gpio_0 ,這個宏(Macro)即是 Xilinx SDK 產(chǎn)生,定義在 xparameter.h 里面。
XGpio led_gpio; /* LED Instance */
/* Initialize LED GPIO settings */
XGpio_Initialize(&led_gpio, XPAR_AXI_GPIO_0_DEVICE_ID);
XGpio_SetDataDirection(&led_gpio, 1, 0);
我們透過 printf 去顯示一些簡單得除錯訊息,這邊的訊息會透過 UART 輸出,你可以透過計算機端的軟件來收到(ex: gtkterm、teraterm),我自己是透過 emacs 的 serial-term 命令來收訊息,baud rate 則是設(shè)定為 115200 、連接目標則是 /dev/ttyUSB1 。
/* Output something via UART1, 115200 baudrate */
printf("Start to blink led !!!\n\r");
最后,使用一個無窮循環(huán)去控制 LED 數(shù)值的變化,并透過 XGpio_DiscreteWrite 去對 GPIO 的通道 1 (參考前面 Block Design) 進行數(shù)據(jù)寫入的工程,再調(diào)整下一次到循環(huán)時要的 LED 數(shù)值,一直重復(fù)這些動作。
就這樣,我們的程序完成了。
int led_value = 0x03; /* default led value */
while(1) {
printf("led value set to 0x%X\n\n", led_value);
/* Set GPIO Channel 1 value. */
XGpio_DiscreteWrite(&led_gpio, 1, led_value);
/* sleep and change led value */
simple_delay(10000000);
led_value = ~led_value;
}
下載到 Zybo board
確定此時你有將 Zybo board 接到計算機,并且你 JP5 設(shè)定在 QSPI 模式下,就像這樣
選擇 Xilinx Tools -> Program FPGA 進行 FPGA 的刻錄。
確認要刻錄的數(shù)據(jù)無誤后,點選 Program 將比特流 (bitstream) 刻錄到 FPGA 去,燒完后你會發(fā)現(xiàn) LD0 ~ LD3 都是亮燈的狀態(tài),因為我們在 Block Design 預(yù)設(shè) AXI_GPIO 輸出為 0xF 。
選擇 Run -> Run Configuration 進行執(zhí)行前的一些設(shè)定。
我們在 Xilinx C/C++ Application(GDB) 建立一個新的設(shè)定,由于我們已經(jīng)刻錄好 FPGA 因此只需要重起處理器系統(tǒng) (Processing System, PS)即可。
確認你有啟用 ps7_init 這些設(shè)定,ps7_init 定義了一些初始化的程序,我們之所以能夠使用 printf 將信息透過 UART 輸出,也是透過 ps7_init 的協(xié)助,具體請參考 Zynq-7000 All Programmable SoC: Embedded Design Tutorial A Hands-On Guide to Effective Embedded System Design (UG1165), p.24 頁。
評論