1. vivado的安裝
不得不說賽靈思vivado安裝比較費時,有時候還裝不上。比較好的解決辦法是找一臺網卡比較好的電腦下載安裝包。我這裏安裝的是web design 2019.1。
安裝直接去賽靈思官網下載就行。
2. PYNQ_Z2 board file
使用pynq_z2,我們首先要從官網下載boardfile。
https://d2m32eurp10079.cloudfront.net/Download/pynq-z2.zip
解壓,將文件複製到安裝路徑下。如圖所示。
3. 新建一個vivado工程
1.1 vivado 部分
輸入工程名字。next。
這裏不需要添加源文件,勾選,do not specify sources at this time。next。
選擇板卡PYNQ_Z2。next,
然後點擊finish。
vivado界面介紹在這裏不做解釋。現在直接操作。點擊 create block design.。輸入名字test_led。點擊OK。
生成如下界面。
點擊中間的加號添加IP核 。並在彈出的框輸入zynq,選擇zynq7 processing sysem。
然後點擊,run block automation。默認,不用操作。.
手動連接CLK,結果如下,然後雙擊這個IP核。
在這裏,雙擊IP後,不需要做任何操作。如圖所示。
點擊加號,或者右擊空白處,選擇添加IP核。
輸入GPIO ,選擇AXI GPIO
結果如下。
同樣的,點擊run connection automation 。選擇GPIO接口爲leds_4bits。
結果如圖所示。
點擊sources,右擊test_led。
單擊,create HDL wrapper,生成頂層文件。並選擇,let vivado manage wrapper and auto-update
這樣一個vivado工程已經完成了。
接下來是邏輯綜合和下載了。
現在把目光看到左邊的欄目flow navigation.
單擊 generate bistream, 生成比特流文件。
點擊OK,等待一段時間。時間長短看電腦性能(一般半個小時左右吧),完成後會自動彈出下圖的對話框,右上角顯示狀態,是正在執行還是完成,完成了顯示打勾。
完成後選擇implementation點擊OK。(也可以直接 view report)
然後點擊open implemented design,再點擊 report ultilization。如圖所示,查看資源使用情況。
然後接下來是加載到SDK了。
1.2 SDK 部分
點擊,file,選擇export ->export hardware。然後需要勾選 include bistream,點擊OK
然後再次點擊file,選擇 launch SDK ,再點擊OK
等待一段時間,打開SDK。
SDK界面就不一一詳細介紹啦,自己需要的話可以自己點擊一下看看。
新建一個SDK工程
file->neew->application project
輸入工程名字爲led_test
然後點擊Next
選擇empty appllication,點擊finish。打開led_test->src
右擊src,添加led_test.c
在led_test.c輸入以下代碼。
/*
* led_test.c
*
* Created on: 2019年10月1日
* Author: wwccss
*/
/* Include Files */
#include "xparameters.h"
#include "xgpio.h"
#include "xstatus.h"
#include "xil_printf.h"
/* Definitions */
#define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID /* GPIO device that LEDs are connected to */
#define led_delay 10000000 /* Software delay length */
#define led_channel 1 /* GPIO port for LEDs */
#define printf xil_printf /* smaller, optimised printf */
unsigned int mled = 0x01; /* first led*/
XGpio Gpio; /* GPIO Device driver instance */
int LEDOutputExample(void)
{
volatile int delay;
int Status;
/* GPIO driver initialisation */
Status = XGpio_Initialize(&Gpio, GPIO_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/*Set the direction for the LEDs to output. */
XGpio_SetDataDirection(&Gpio, led_channel, 0x00);
/* Loop forever blinking the LED. */
while (1) {
/* Write output to the LEDs. */
XGpio_DiscreteWrite(&Gpio, led_channel, mled);
mled = mled<<1;
if(mled>0x8)
mled = 1;
/* Wait a small amount of time so that the LED blinking is visible. */
for (delay = 0; delay < led_delay; delay++);
}
return XST_SUCCESS; /* Should be unreachable */
}
/* Main function. */
int main(void){
int Status;
/* Execute the LED output. */
Status = LEDOutputExample();
if (Status != XST_SUCCESS) {
xil_printf("GPIO output to the LEDs failed!\r\n");
}
return 0;
}
注意:這個SDK需要ctrl+s,保存後編譯有效。
編譯無誤後,下載驗證。
首先是program FPGA這是邏輯部分。
單擊左上角的Xilinx -> program FPGA -> program
然後是SDK工程。
板子的跳線帽選擇,QSPI(固化時候可選,JATG)點擊,等待。。。
然後點擊運行。可以看到PYNQ_Z2板子上的LED輪流依次點亮。
先點擊中間的,disconnect,然後點擊右上角第二個圖標,退出調試狀態,返回編輯狀態。
接下來就是程序的固化了。
1.3 PYNQ_Z固化流程
首先建立一個FSLB工程,FSBL是幹什麼的,自行百度。
點擊Next
然後選擇Zynq_FSBL,點擊OK,等待。
然後點擊,Xilinx->Create Boot Image
選擇Output BIF file path ,
結果如下boot爲了區分,自己新建的。
然後是在boot image partition 這一欄。
需要添加一個bootloader文件和兩個datafile,結果如下。
上述添加的文件要按照如上順序,否則會出問題。
然後單擊 create image
然後點擊Xilinx->program flash
添加剛剛生成的鏡像文件,以及fsbl file,這裏選擇flash type 爲qspi-4x-single(這個具體看板子的介紹會有說明)
這裏PYNQ_Z2板子跳線帽選擇的是QSPI,如果失敗,會提示選擇JATG.。
重新上電,會看到LED燈和剛纔調試的一樣的方式,輪流點亮。
1.4 SD卡啓動
將剛剛製作的鏡像文件複製到SD卡,如圖所示。
這裏還需要uImage,否者啓動失敗,.bin修改爲其他名字也會無法啓動。
uImage獲取方法是:
首先燒錄PYNQ_Z2的鏡像到SD卡,然後格式化SD卡會剩下BOOT.bin和uImage,然後就可以得到想要的uImage了。