基於Vivado的嵌入式開發 ——PS+PL實踐


基於Vivado的嵌入式開發

——PS走起

硬件平台:ZedBoard

開發工具:Vivado 2014.2

 

 

1、規划

廢話不多說,依然是流水燈,這次是采用PS+PL實現。

功能依舊簡單,目標是為了學習IP核的添加方式、熟悉嵌入式系統設計界面、熟悉Vivado下ChipScope的使用方法。

1) 項目功能:流水燈

2) 編程語言:C

3) 設計流程:建立工程à添加ARM內核、GPIO IPà綜合、實現、燒寫à板級測試(此處不再給現象,和上一篇相同)

 

2、設計

整體框圖為:

 

 

 

核心功能由ARM軟件實現。添加PL部分的GPIO IP主要目的是熟悉IP添加流程,如何和ARM內核連接,從而組建嵌入式系統。IP功能是從總線上取出數據,送至8個LED。

 

3、總結

這次來個倒敘,先上使用感受

1) Vivado將所有功能集成到一個框架下,不像原來那樣在設計過程中需要在各工具之間不斷切換主界面,使整個設計流程更加清晰、流暢。界面也有所美化,贊一個!

2) 雖然是第一次用Vivado做嵌入式設計,但也不是說和XPS、PlanAhead天差地別,變化主要是在原先由XPS完成的部分,其他和PlanAhead的使用是比較類似的。整個設計過程都是自己摸索出來,總體來說還是挺順利的,所以,想上手Vivado的朋友不必擔心不適應。

3) 對於嵌入式設計(准確的說是Block Design)而言,去除了一些自動連線,使開發人員手動或者利用工具完成整個連線過程,可以幫助開發人員更好地熟悉一些信號、總線(有可能糊里糊塗也能搞定,保險起見還是了解一下更好)。這貌似也從一個側面展現了Vivado開發團隊“自動化設計方式,不強制設計方式”設計理念。

4) 嵌入式設計雖然比純邏輯開發更加復雜,使用了硬核PS7和軟核GPIO,但整個design實現的時間並沒有大幅度增加,我的主觀感覺反而是比純邏輯開發耗的時間更短。由此可見Vivado在復雜設計上面要優於ISE。

5) 通過查看Vivado的工程目錄發現,Vivado的工程目錄相當清晰,不像ISE那樣,各種文件的堆在一個文件夾下。但是這種工程文件的組織也有缺點——會導致一些文件路徑很長。

 

4、添加資源

工程的建立,可以參考《Vivado實現純邏輯開發——從最簡單的開始》。

4.1、創建Block

在左側的Flow Navigator子窗口找到IP Integrator(默認展開),找到該目錄下的Create Block Design命令並單擊。

 

 

 

圖2

    命名為system,如圖3所示。

 

 

 

圖3

    進度條跑完之后界面發生變化,出現了Diagram子窗口,Sources自選項卡右邊多出了3個選項卡,如圖4所示

 

 

 

圖4

4.2、添加cpu

    在Diagram子窗體中找到Add IP按鈕,位置如圖5所示的紅色方框內。

 

圖5

 

    點擊按鈕后,彈出IP搜索對話框,如圖6所示。

 

 

圖6

    輸入system,對IP進行過濾,結果如圖7所示。

 

圖7

 

    雙擊ZYNQ7 Processing System,會自動添加該IP,結果如圖8所示。

 

 

圖8

除了雙擊之外,還可以選中后回車;還可以選中后拖拽至Diagram窗口中釋放。

4.3、添加其他IP

用4.2小節所述的方法添加GPIO IP。添加完成后的情形如圖9所示。

 

 

圖9

在XPS中添加AXI IP時,XPS會自動完成總線連接,創建相關端口,Vivado默認不做任何工作。還可以看到總線的時鍾和復位信號被單獨拿了出來,如果沒記錯的話,之前是和其他總線信號放在一起的,封裝在BUS_INTERFACE中的。

4.4、端口連接和IP配置

圖9中可以看到Run Block Automation和Run Connection Automation選項,Run Block Automation可以為模塊創建端口,Run Connection Automation可以完成端口的自動連線。

點擊Run Block Automation,進入圖10所示的界面。

 

 

圖10

看一下注釋,該過程是將開發板的預設置導入進來,並且將FIXED_IO(MIO)、DDR接口生成外部連接端口。OK,進度條跑完之后,界面發生變化,如圖11所示。

 

 

圖11

DDR,FIXED_IO已經連接到端口,還多出了TTC0_WAVE0_OUT等選項,應該是對PS7進行了參數配置造成的,雙擊PS7可以對之進行配置,界面如圖12所示,和XPS中大同小異,配置過程不多說了,這里沒有改動。

 

 

圖12

    雙擊GPIO IP對之進行配置,主要是將位寬改為8bits,如圖13所示。

 

 

圖13

點擊Run Connection Automation,選擇,如圖14所示。

 

 

圖14

    彈出對話框如圖15所示,提示將gpio的AXI接口映射到主端的地址空間。還詢問是否自動連接時鍾,這里不管它,直接OK。

 

 

圖15

連線結果如圖16所示。

 

 

圖16

    系統自動添加了互聯模塊(AXI Interconnect,和XPS相同)和一個時鍾、復位控制模塊。

    再次Run Connection Automation,將GPIO連接到輸出端口,在圖17所示對話框中選擇開發板端口為leds_8bits。

 

 

圖17

    終於完成了,不容易啊,最終結果如圖18所示。

 

 

圖18

4.5、為Block Design創建wrapper文件

    點擊Sources自選項卡,按照圖19的指示為該Block Design創建wrapper文件,bd文件是不可以作為設計頂層的,為了方便頂層調用,需要為之生成一個wrapper文件。

 

 

圖19

    選擇讓Vivado幫助我們管理wrapper文件,如圖20所示。

 

 

圖20

4.6、添加約束文件

這里我也不確定是否需要添加DDR和MIO相關引腳的約束,暫時不管他們。由於所有連接都是自動完成的,有理由相信Vivado為這些引腳做了約束,所以,這里我忐忑的偷個懶,不寫約束代碼,直接Generate Bitstream。

果然直接過了,估計沒問題了,轉戰SDK。

 

 

圖21 啟動sdk

 

將硬件導出(1、FileàExport Hardware 2、FileàLaunch SDK,相當於PlanAhead和XPS的Export Hardware & Launch SDK)。進入SDK歡迎界面后,SDK會自動導入硬件信息,如圖22所示。

 

 

圖22

5、軟件設計

    SDK的使用不多說了,和之前的變化不大,直接上代碼。

 

#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xgpio.h"
#include "sleep.h"


/************************** Constant Definitions *****************************/

/*
 * The following constant maps to the name of the hardware instances that
 * were created in the EDK XPS system.
 */
#define XPAR_LEDS_ID XPAR_AXI_GPIO_0_BASEADDR


/*
 * The following constant is used to determine which channel of the GPIO is
 * used for the LED if there are 2 channels supported.
 */
#define LED_CHANNEL 1

/************************** Variable Definitions *****************************/

/*
 * The following are declared globally so they are zeroed and so they are
 * easily accessible from a debugger
 */

XGpio Gpio; /* The Instance of the GPIO Driver */

int main()
{
    init_platform();
    u8 i=0;
    int Status;

	/*
	\ Initialize the GPIO driver
	*/
	Status = XGpio_Initialize(&Gpio, XPAR_LEDS_ID);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	/*
	\ Set the direction for all signals to be outputs
	*/
	XGpio_SetDataDirection(&Gpio, LED_CHANNEL, 0x00);

	/*
	\ Loop forever run the LED
	*/
    while(1)
    {
    	for(i=0;i<8;i++)
    	{
			XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, (1<<i));
			sleep(1);
    	}
    }

    return 0;
}

 

 

    搞定,流水燈跑起來了。

6ChipScope觀測內部信號

本來想在這一篇學一下ChipScope,寫着寫着發現又變成一篇長文,所以還是放在后面吧。

 

 

 

版權聲明:

本文由博主“cuter”發布。歡迎轉載,但不得擅自更改博文內容,也不得用於任何盈利目的。轉載時不得刪除作者簡介和版權聲明。如有盜用而不說明出處引起的版權糾紛,由盜用者自負。

博客官方地址:

ChinaAET:http://blog.chinaaet.com/cuter521

EDN China: http://bbs.ednchina.com/BLOG_cuter521_356737.HTM

轉載:http://blog.chinaaet.com/cuter521/p/35978


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM