什么是FPGA
Xilinx以制造 可編程門陣列(FPGA)而聞名,它是基于一個通過可編程接點連接的可配置邏輯塊(CLBs)矩陣。根據Control Engineering Europe中的 “FPGA的優點(Advantages of FPGA)”這篇文章,多種控制回路能夠以不同但是十分快的速度在FPGA設備上運行。FPGA也可以在制造后再編程以達到別種應用或是功能需求,這使它在專業工程師中非常流行。許多工程師都把這種技術應用到機械學習,無線通信,嵌入式視覺和云計算應用中。
什么是ZYNQ
Xilinx Zynq?-7000 全可編程系統芯片 (AP SoC)系列包含了基于嵌入式處理器的軟件可編程性和FPGA的硬件可編程性。這個技術使得我們在單一設備上集成CPU,DSP,ASSP和混合信號功能時進行關鍵分析和硬件加速。
安裝Vivado, SDK 和板支持文件
在創建數字或系統設計前你首先需要安裝 Xilinx Vivado 設計套件。 Xilinx Vivado Webpack 這個版本是免費的,通過 Digilent Wiki 上提供的使用指導也可以幫助你快讀安裝和運行Vivado。在下載Vivado時,確保你使用設計工具(Design Tools)欄目中的“軟件開發套件(Software Development Kit)”來安裝SDK。為了防止你忘了這個步驟,你也可以返回安裝軟件來安裝“軟件開發套件(Software Development Kit)”。
內容
一旦你下載并安裝了Vivado,你需要把ZYBO板文件放入本地Xilinx Vivado文件夾,它定義了ZYBO板上的不同界面和協議。之后你就可以成功建立IP和SDK了。Diligent提供了一個教程: https://reference.digilentinc.com/reference/software/vivado/board-files?。.. 。
注意:在Vivado board文件安裝指導中,你需要把頭文件(board_files)放入你的本地文件夾。然后,我會推薦你復制獨立的board文件(例如,一旦你下載了vivdado board文件,找到vivado-boards-master ewoard_files并復制“zybo文件夾”。否則你可能會在設計中碰到一些不必要的錯誤。
創建項目
我將會使用 Digilent ZYBO 并根據他們的 開始指南(getting started guide) 來創建一個簡單的HelloWorld項目。
項目概要
在這個項目中你將會學到如何用四個板上的開關來控制板上的LED。當你按下四個不同的按鈕后,你可以看到來自電腦端的多種信息。
設計流程
打開Vivada并選擇Zybo板
創建一個新的Vivado項目
在新的項目中創建一個空的板塊設計工作區
使用IP集成工具添加需要的IP模塊并創建硬件設計
驗證并保存板塊設計
創建HDL系統封裝
運行設計綜合與實現
生成Bit文件
導出包含了bit源文件的硬件設計到SDK工具
開啟 SDK
硬件設計概要
你可以根據開始指南(getting started guide)中的步驟2-6來創建硬件設計,以下是一些說明。
自動運行模塊(Run Block Automation)對話框可以讓你提供微處理器系統需要的一些基礎特性輸入。
“3.4)雙擊新的axi_gpio_0內核可以彈出自定義窗口。在IP設置頁檢查啟動雙通道,并點擊OK”,你可以創建兩種輸入-SW和BTN。每一個axi_gpio內核都支持32位單雙GPIO通道。在這個項目中,每個通道我們只需要四位。你可以在AXI GPIO Guide中找到詳細信息。
“3.5)重復步驟3.3可以添加另一個GPIO內核,但是不要啟動雙通道”,你將會創建一個輸出-LED。
自動運行連接可以幫助你hook界面和外部I/O接口
默認,UART界面中的一種已經被放置在ZYNQ IP中了
請參考:http://blog.dev-flow.com/en/8-first-use-of-the-zynq-7000-processor-system-on-a-zynq/。
軟件設計概要
你可以根據開始指南(getting started guide)中的步驟7-10來創建軟件設計,以下是一些說明。
當你打開“src”文件夾中的“helloworld.c’’文件后(參考開始指南(getting started guide)中的步驟9.4),你可以通過以下步驟在用戶界面看到一些預設功能和庫的詳細內容。
標記功能/庫
右擊預設功能/庫并打開新選項看到聲明
以下是代碼和注釋
/*****************************************************
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;
}
運行項目
你可以根據步驟11來運行項目。在你對FPGA進行編程并成功創建應用后,你可以看到以下:
1. 試著按下四個開關,并且各自相對應的LED會亮起
2. 在串口端,按下每一個按鈕,會彈出“按鈕已被按下”的信息。
評論
查看更多