什么是FPGA
Xilinx以制造 可編程門陣列(FPGA)而聞名,它是基于一個通過可編程接點連接的可配置邏輯塊(CLBs)矩陣。根據(jù)Control Engineering Europe中的 “FPGA的優(yōu)點(Advantages of FPGA)”這篇文章,多種控制回路能夠以不同但是十分快的速度在FPGA設(shè)備上運行。FPGA也可以在制造后再編程以達(dá)到別種應(yīng)用或是功能需求,這使它在專業(yè)工程師中非常流行。許多工程師都把這種技術(shù)應(yīng)用到機械學(xué)習(xí),無線通信,嵌入式視覺和云計算應(yīng)用中。
什么是ZYNQ
Xilinx Zynq?-7000 全可編程系統(tǒng)芯片 (AP SoC)系列包含了基于嵌入式處理器的軟件可編程性和FPGA的硬件可編程性。這個技術(shù)使得我們在單一設(shè)備上集成CPU,DSP,ASSP和混合信號功能時進(jìn)行關(guān)鍵分析和硬件加速。
安裝Vivado, SDK 和板支持文件
在創(chuàng)建數(shù)字或系統(tǒng)設(shè)計前你首先需要安裝 Xilinx Vivado 設(shè)計套件。 Xilinx Vivado Webpack 這個版本是免費的,通過 Digilent Wiki 上提供的使用指導(dǎo)也可以幫助你快讀安裝和運行Vivado。在下載Vivado時,確保你使用設(shè)計工具(Design Tools)欄目中的“軟件開發(fā)套件(Software Development Kit)”來安裝SDK。為了防止你忘了這個步驟,你也可以返回安裝軟件來安裝“軟件開發(fā)套件(Software Development Kit)”。
內(nèi)容
一旦你下載并安裝了Vivado,你需要把ZYBO板文件放入本地Xilinx Vivado文件夾,它定義了ZYBO板上的不同界面和協(xié)議。之后你就可以成功建立IP和SDK了。Diligent提供了一個教程: https://reference.digilentinc.com/reference/software/vivado/board-files?。.. 。
注意:在Vivado board文件安裝指導(dǎo)中,你需要把頭文件(board_files)放入你的本地文件夾。然后,我會推薦你復(fù)制獨立的board文件(例如,一旦你下載了vivdado board文件,找到vivado-boards-master ewoard_files并復(fù)制“zybo文件夾”。否則你可能會在設(shè)計中碰到一些不必要的錯誤。
創(chuàng)建項目
我將會使用 Digilent ZYBO 并根據(jù)他們的 開始指南(getting started guide) 來創(chuàng)建一個簡單的HelloWorld項目。
項目概要
在這個項目中你將會學(xué)到如何用四個板上的開關(guān)來控制板上的LED。當(dāng)你按下四個不同的按鈕后,你可以看到來自電腦端的多種信息。
設(shè)計流程
打開Vivada并選擇Zybo板
創(chuàng)建一個新的Vivado項目
在新的項目中創(chuàng)建一個空的板塊設(shè)計工作區(qū)
使用IP集成工具添加需要的IP模塊并創(chuàng)建硬件設(shè)計
驗證并保存板塊設(shè)計
創(chuàng)建HDL系統(tǒng)封裝
運行設(shè)計綜合與實現(xiàn)
生成Bit文件
導(dǎo)出包含了bit源文件的硬件設(shè)計到SDK工具
開啟 SDK
硬件設(shè)計概要
你可以根據(jù)開始指南(getting started guide)中的步驟2-6來創(chuàng)建硬件設(shè)計,以下是一些說明。
自動運行模塊(Run Block Automation)對話框可以讓你提供微處理器系統(tǒng)需要的一些基礎(chǔ)特性輸入。
“3.4)雙擊新的axi_gpio_0內(nèi)核可以彈出自定義窗口。在IP設(shè)置頁檢查啟動雙通道,并點擊OK”,你可以創(chuàng)建兩種輸入-SW和BTN。每一個axi_gpio內(nèi)核都支持32位單雙GPIO通道。在這個項目中,每個通道我們只需要四位。你可以在AXI GPIO Guide中找到詳細(xì)信息。
“3.5)重復(fù)步驟3.3可以添加另一個GPIO內(nèi)核,但是不要啟動雙通道”,你將會創(chuàng)建一個輸出-LED。
自動運行連接可以幫助你hook界面和外部I/O接口
默認(rèn),UART界面中的一種已經(jīng)被放置在ZYNQ IP中了
請參考:http://blog.dev-flow.com/en/8-first-use-of-the-zynq-7000-processor-system-on-a-zynq/。
軟件設(shè)計概要
你可以根據(jù)開始指南(getting started guide)中的步驟7-10來創(chuàng)建軟件設(shè)計,以下是一些說明。
當(dāng)你打開“src”文件夾中的“helloworld.c’’文件后(參考開始指南(getting started guide)中的步驟9.4),你可以通過以下步驟在用戶界面看到一些預(yù)設(shè)功能和庫的詳細(xì)內(nèi)容。
標(biāo)記功能/庫
右擊預(yù)設(shè)功能/庫并打開新選項看到聲明
以下是代碼和注釋
/*****************************************************
Getting Started Guide for Zybo
This demo displays the status of the switches on the
LEDs and prints a message to the serial communication
when a button is pressed.
Terminal Settings:
-Baud: 115200
-Data bits: 8
-Parity: no
-Stop bits: 1
1/6/14: Created by MarshallW
****************************************************/
/*include libraries from Xilinx*/
#include
#include “platform.h”
#include
#include “xparameters.h”
#include “sleep.h”
int main()
{
XGpio input, output; /*Declare two structure input & output. XGpio is*/
int button_data = 0; /*Declare & Define initial button value*/
int switch_data = 0; /*Declare & Define initial switch value*/
/*Initialize the XGpio instance provided by the caller based on the given DeviceID.*/
XGpio_Initialize(&input, XPAR_AXI_GPIO_0_DEVICE_ID); /*We define AXI_GPIO_0 as inputs - BTN & SW*/
XGpio_Initialize(&output, XPAR_AXI_GPIO_1_DEVICE_ID);/*We define AXI_GPIO_1 as inputs - LED*/
XGpio_SetDataDirection(&input, 1, 0xF); /*set first channel of input tristate buffer to input*/
XGpio_SetDataDirection(&input, 2, 0xF); /*set second channel of input tristate buffer to input*/
XGpio_SetDataDirection(&output, 1, 0x0); /*set only channel of output tristate buffer to output*/
init_platform(); /*Initialize the platform hardware resources*/
/*Indefinite loop - running forever*/
while(1){
switch_data = XGpio_DiscreteRead(&input, 2); /*Read the switch (SW) value*/
XGpio_DiscreteWrite(&output, 1, switch_data); /*Write the switch (SW) value to LED (LD)*/
button_data = XGpio_DiscreteRead(&input, 1); /*Read the button (BTN) value*/
/*Set up if-else-if statement to print message in the
*UART terminal. This depends on whether one or
* more buttons are pressed
*/
if(button_data == 0x0){} /*If no button is pressed, do nothing*/
/*If button value is binary 0001 (decimal 1), button 0 (BTN0) is pressed. Use pre-defined function Xil-printf
* to print the message in the terminal
*/
else if(button_data == 0x1)
xil_printf(“button 0 pressed ”);
/*If button value is “binary 0010 (decimal 2)”, button 1 (BTN1) is pressed. Use pre-defined function Xil-printf
*to print the message in the terminal
*/
else if(button_data == 0x2)
xil_printf(“button 1 pressed ”);
/*If button value is “binary 0100 (decimal 4)”, button 2 (BTN2) is pressed. Use pre-defined function Xil-printf
*to print the message in the terminal
*/
else if(button_data == 0x4)
xil_printf(“button 2 pressed ”);
/*If button value is “binary 1000 (decimal 8)”, button 3 (BTN3) is pressed. Use pre-defined function Xil-printf
*to print the message in the terminal
*/
else if(button_data == 0x8)
xil_printf(“button 3 pressed ”);
else
xil_printf(“multiple buttons pressed ”); /*All other values, print “multiple buttons pressed*/
usleep(200000); /*Delay 200000us*/
}
cleanup_platform(); /*Clean up all caches*/
return 0;
}
運行項目
你可以根據(jù)步驟11來運行項目。在你對FPGA進(jìn)行編程并成功創(chuàng)建應(yīng)用后,你可以看到以下:
1. 試著按下四個開關(guān),并且各自相對應(yīng)的LED會亮起
2. 在串口端,按下每一個按鈕,會彈出“按鈕已被按下”的信息。
評論
查看更多