1. 程式人生 > >SDSoc學習(二):搭建平臺,使用EMIO點亮LED

SDSoc學習(二):搭建平臺,使用EMIO點亮LED

簡介
    這是學習SDSoc的第二個入門實驗,通過EMIO點亮連線在PL上的8個LED。與上一個實驗不一樣,在這一個實驗中,由於ZedBoard平臺中沒有使能EMIO,因此想直接通過SDSoc編寫程式驅動MIO是不行的,所以這一個實驗需要自己搭建包含EMIO的平臺。
    我用的是ZedBoard開發板,SDSoc2017.4。
第一步:搭建平臺
    通過對官方資料的學習,平臺分為軟體平臺和硬體平臺兩部分,官方就如何搭建平臺提供了較為詳細的說明,可以在XILINX官網中搜索ug1146ug1236 兩篇文件並下載。其中ug1146 理論講解比較詳細,ug1236 重在敘述操作實踐,本實驗需要搭建的平臺就是參照這兩篇文件,同時增加了一點點東西完成的。
1、新建VIVADO工程,點選Next;
這裡寫圖片描述


2、設定工程名和路徑,這裡設定為zedemio,點選Next;
這裡寫圖片描述
3、選擇RTL工程,點選Next;
這裡寫圖片描述
4、原始檔和約束檔案設定,直接Next;
這裡寫圖片描述
這裡寫圖片描述
5、因為用的是ZedBoard開發板,所以在Boards中選擇ZedBoard即可,點選Next,然後Finish。
這裡寫圖片描述
6、點選紅圈所示的Create Block Design,在彈出的介面中設定Design name,注意這裡設定的名字一定要和工程名一樣,否則搭建的平臺在執行時會報錯(親自試驗過),這個要求在ug1146 中也有說明。
這裡寫圖片描述
    ug1146 第28頁
ug1146第28頁
7、點選‘+’,搜尋zynq,雙擊ZYNQ7 Processing System
這裡寫圖片描述

8、點選Run Block Automation->OK
這裡寫圖片描述
這裡寫圖片描述
9、然後繼續新增IP,如圖所示
這裡寫圖片描述
10、雙擊ZYNQ7 Processing System進行如下配置,然後點選OK
這裡寫圖片描述
    新增8個EMIO,因為有開發板上有8個LED。
這裡寫圖片描述
    新增PL到PS中斷。
這裡寫圖片描述
11、雙擊Concat進行如下配置,然後點選OK
這裡寫圖片描述
12、雙擊Clocking Wizard進行如下配置,然後點選OK
這裡寫圖片描述
這裡寫圖片描述
13、配置結束後就將框圖連線成如下圖
這裡寫圖片描述
14、點選Validate Design,直到出現正確彈框,點選OK,然後Ctrl+s儲存。
這裡寫圖片描述
15、接下來就需要在箭頭所指位置輸入Tcl命令了
這裡寫圖片描述

set_property PFM_NAME "xilinx.com:zedemio:zedemio:1.0" [get_files  E:/sdsoc20174/projects/myplatform/zedemio/zedemio/zedemio.srcs/sources_1/bd/zedemio/zedemio.bd]

    回車,E:/xxxxxx/zedemio.bd路徑是這個工程產生bd檔案的路徑,在這個路徑下可以找到這個工程的bd檔案。

set_property PFM.CLOCK { \
clk_out1 {id "0" is_default "true" proc_sys_reset "proc_sys_reset_0" } \
clk_out2 {id "1" is_default "false" proc_sys_reset "proc_sys_reset_1" } \
clk_out3 {id "2" is_default "false" proc_sys_reset "proc_sys_reset_2" } \
clk_out4 {id "3" is_default "false" proc_sys_reset "proc_sys_reset_3" } \
} [get_bd_cells /clk_wiz_0]
set_property PFM.AXI_PORT { \
M_AXI_GP0 {memport "M_AXI_GP"} \
M_AXI_GP1 {memport "M_AXI_GP"} \
S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory "processing_system7_0 
ACP_DDR_LOWOCM"} \
S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" memory "processing_system7_0 
HP0_DDR_LOWOCM"} \
S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" memory "processing_system7_0 
HP1_DDR_LOWOCM"} \
S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory "processing_system7_0 
HP2_DDR_LOWOCM"} \
S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory "processing_system7_0 
HP3_DDR_LOWOCM"} \
} [get_bd_cells /processing_system7_0]
set intVar []
for {set i 0} {$i < 16} {incr i} {
lappend intVar In$i {}
}
set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]

    回車,這些語句在ug1236 中都有詳細的說明。
16、右擊zedemio->Generate Output Products->選擇Global->點選Generate
這裡寫圖片描述
    完成後點選OK
這裡寫圖片描述
17、右擊zedemio->Generate HDL Wrapper->選擇auto-updata->點選OK
這裡寫圖片描述
18、由於我們這裡要點亮連線在PL上8個LED,所有需要對這些LED進行約束。
    1、8個LED連線在PL上的引腳位置,如圖,這8個LED分別是LD0~LD7,引腳位置分別為:T22、T21、U22、U21、V22、W22、U19、U14。
這裡寫圖片描述
    2、建立約束檔案,右擊Constrains->Add Sources
這裡寫圖片描述
    點選Next;
這裡寫圖片描述
    點選Create File,File name設定為zedemio,點選OK->點選Finish。
這裡寫圖片描述
    3、新增約束檔案
這裡寫圖片描述
    約束檔案要參照頂層檔案中的介面名字進行新增
這裡寫圖片描述
這裡寫圖片描述
19、匯出硬體,點選OK
這裡寫圖片描述
20、輸入Tcl語句,生成.dsa檔案

write_dsa -force E:/sdsoc20174/projects/myplatform/zedemio/zedemio/zedemio.srcs/sources_1/bd/zedemio/zedemio.dsa

    將zedemio.dsa檔案生成在Tcl語句中指定的路徑下

validate_dsa E:/sdsoc20174/projects/myplatform/zedemio/zedemio/zedemio.srcs/sources_1/bd/zedemio/zedemio.dsa

這樣,硬體平臺就搭建完成了,接著就是搭建軟體平臺。
21、在當前VIVADO工程中載入SDK(方便一些),點選OK
這裡寫圖片描述
    新建一個fsbl檔案,點選Next;
這裡寫圖片描述
    選擇Zynq FSBL,然後點選Finish,等待建立完成。
這裡寫圖片描述
這裡寫圖片描述
右擊fsbl資料夾->Create Boot Image;修改.bif檔名,點選Create Image;
這裡寫圖片描述
    因為在SDx中,平臺建立過程需要一個新的連結器指令碼。這個連結器指令碼基本上確保了針對自定義平臺的任何應用程式程式碼,駐留並執行在執行板上的DDR記憶體中。要建立一個新的連結器指令碼,我們將建立一個空應用程式。
這裡寫圖片描述
    點選Finish,等待建立完成;
這裡寫圖片描述
完成後右擊empty_application資料夾->Generate Linker Script,在Heap Size中輸入402653184(384M);在Stack Size中輸入262144(256K);點選Generate。
這裡寫圖片描述
    點選Yes即可,之後就可以關閉SDK了。
這裡寫圖片描述
    然後在工程資料夾的位置新建一個名為boot的資料夾
這裡寫圖片描述
    將

BOOT.bin(E:\sdsoc20174\projects\myplatform\zedemio\zedemio\zedemio.sdk\fsbl\bootimage);
standalone.bif(E:\sdsoc20174\projects\myplatform\zedemio\zedemio\zedemio.sdk\fsbl\bootimage);
fsbl.elf(E:\sdsoc20174\projects\myplatform\zedemio\zedemio\zedemio.sdk\fsbl\Debug);
lscript.ld(E:\sdsoc20174\projects\myplatform\zedemio\zedemio\zedemio.sdk\empty_application\src

    這4個檔案複製到新建的那個boot資料夾裡。
這裡寫圖片描述
    開啟standalone.bif檔案,將其修改成下圖所示,然後ctrl+s儲存。
這裡寫圖片描述
22、開啟SDSoc,新建一個Platform Project,點選Next;
這裡寫圖片描述
    定位到硬體平臺生成的zedemio.dsa檔案,選擇匯入軟體平臺成分,點選Finish。
這裡寫圖片描述
    點選Define System Configuration;
這裡寫圖片描述
    在接下來的彈框中填入以下資訊,Name和Display Name表示系統的名字,這裡叫standalone(裸機);Description隨便寫吧;Boot Dictionary就是前面新建的boot資料夾;Bif File就是在boot資料夾中的standaalone.bif檔案;點選OK。
這裡寫圖片描述
    點選Add Processor Group/Domain;
這裡寫圖片描述
    在接下來的彈框中填入以下資訊,其中Name和Display Name就是系統的名字,OS選擇standalone(裸機),Linker Script選擇boot資料夾中的lscript.ld;點選OK。
這裡寫圖片描述
    接著點選Generate Platform產生平臺;
這裡寫圖片描述
    彈框表示已經產生一個名為zedemio的平臺,點選OK;
這裡寫圖片描述
    接著點選Add to Custom Repositories,新增這個平臺;
這裡寫圖片描述
    已經新增這個名為zedemio的平臺,點選OK。
這裡寫圖片描述
至此,我們就搭建了一個名為zedemio的平臺了,下面測試一下這個平臺。
第二步:測試平臺
1、新建一個SDSoc Application Project,點選Next;
這裡寫圖片描述
2、命名為zedemio_test,點選Next;
這裡寫圖片描述
3、在接下來的選擇平臺介面,就出現了剛才建立的zedemio這個平臺,選擇這個平臺,點選Next;
這裡寫圖片描述
4、接著選擇系統配置,由於只添加了standalone,所有隻有standalone可選,點選Next;
這裡寫圖片描述
5、由於沒有新增例程,只有選擇建立一個Empty Application;點選Finish。
這裡寫圖片描述
6、之後的操作就SDSoc學習(一) 中一樣了,選擇Debug、Generate SD Image,然後新建一個zedemio_test.c檔案
這裡寫圖片描述
    在zedemio_test.c中寫入如下程式碼

#include "xgpiops.h"
#include "sleep.h"
int main() {
    static XGpioPs psGpioInstancePtr;
    XGpioPs_Config* GpioConfigPtr;
    int xStatus;
//--EMIO的初始化
    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    if (GpioConfigPtr == NULL)
        return XST_FAILURE;
    xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr,
            GpioConfigPtr->BaseAddr);
    if (XST_SUCCESS != xStatus)
        print("PS GPIO INIT FAILED \n\r");
//--EMIO的輸入輸出操作
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54, 1); //配置EMIO輸出方向,0輸入1輸出
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54, 1); //配置EMIO的第54位輸出,0輸入1輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55, 1); //配置EMIO的第55位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 56, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 56, 1); //配置EMIO的第56位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 57, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 57, 1); //配置EMIO的第57位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 58, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 58, 1); //配置EMIO的第57位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 59, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 59, 1); //配置EMIO的第57位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr,60, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 60, 1); //配置EMIO的第57位輸出
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, 61, 1); //配置EMIO輸出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 61, 1); //配置EMIO的第57位輸出
    while (1) {
        XGpioPs_WritePin(&psGpioInstancePtr, 54, 1); //點亮EMIO的第54位輸出1
        usleep(500000); //延時,單位us
        XGpioPs_WritePin(&psGpioInstancePtr, 54, 0); //EMIO的第54位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 55, 1); //EMIO的第55位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 55, 0); //EMIO的第55位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 56, 1); //EMIO的第56位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 56, 0); //EMIO的第56位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 57, 1); //EMIO的第57位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 57, 0); //EMIO的第57位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 58, 1); //點亮EMIO的第54位輸出1
        usleep(500000); //延時,單位us
        XGpioPs_WritePin(&psGpioInstancePtr, 58, 0); //EMIO的第54位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 59, 1); //EMIO的第55位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 59, 0); //EMIO的第55位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 60, 1); //EMIO的第56位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 60, 0); //EMIO的第56位輸出0
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 61, 1); //EMIO的第57位輸出1
        usleep(500000); //延時
        XGpioPs_WritePin(&psGpioInstancePtr, 61, 0); //EMIO的第57位輸出0
        usleep(500000); //延時
    }
    return 0;
}

    然後選擇Build Debug,然後等待完成即可(這個時間有些長);Debug完成之後,將sd_card中的四個檔案拷貝到SD卡中,然後給開發板上電後就可看到流水燈現象了。
這裡寫圖片描述
這裡寫圖片描述
結束
    這個實驗通過搭建一個簡單的平臺,將搭建平臺的流程走了一遍,爭取下一次搭建一個包含其他IP控制外設的平臺,其實這個流程在官方資料ug1146ug1236 上有更加詳細的解釋和說明,在XILINX官網上很容易搜尋到,這裡就不上傳了。對於這個流程如有疑問,還請查閱官方資料,當然也歡迎留言交流。

相關推薦

SDSoc學習搭建平臺使用EMIOLED

簡介     這是學習SDSoc的第二個入門實驗,通過EMIO點亮連線在PL上的8個LED。與上一個實驗不一樣,在這一個實驗中,由於ZedBoard平臺中沒有使能EMIO,因此想直接通過SDSoc編寫程式驅動MIO是不行的,所以這一個實驗需要自己搭建包含EMI

Python與機器學習Windows下科學計算環境搭建

【注意:安裝numpy和scipy模組時注意與Python版本保持一致】 1.安裝numpy 測試: 沒有報錯,bingo~ 2.安裝scipy 在官網中下載scipy3.4版本:scipy-0

Unity3D學習使用JSON進行對象數據的存儲讀取

進行 存儲路徑 新的 del jpg cati spa 全局變量 .net 前言 前段時間完成了自己的小遊戲Konster的制作,今天重新又看了下代碼。原先對關卡解鎖數據的存儲時用了Unity自帶的PlayerPref(字典式存儲數據)。 讀取關卡數據的代碼: voi

Android NDK學習編譯腳本語法Android.mk和Application.mk

GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義

強化學習馬爾可夫決策過程

最優 最大值 公式 des 版本 ams 強化學習 有獎 RoCE Finite Markov Decision Process 馬爾可夫決策過程(MDP)是對連續決策進行建模,當前的動作不僅對當前產生影響,而且還會對將來的的情況產生影響,如果從獎勵的角度,即MDP不僅影響

linux入門學習linux圖形化界面與命令行界面之間的切換以及一些系統命令

之間 linu 鏡像 pan ctr 安裝 linux -- linux鏡像 一、linux圖形化界面與命令行界面之間的切換 註意:前提是你安裝的 linux鏡像ios 必須具備圖形化功能。 1)  圖形化界面--->命令行界面:       ctrl + alt +

PE檔案格式學習總體結構

1.概述 PE檔案分為幾個部分,分別是: DOS頭 DOS Stub NT頭(PE頭) 檔案頭 可選頭 區段頭(一個數組,每個元素都是一個結構體,稱之為IMAGE_SECTION_HEADER) .text .rdata .data .rs

TensorFlow學習tf.random_normal() 和 tf.random_unform()

1. tf.random_normal() #正態分佈 tf.random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None ) Args:

網頁開發學習表格

一、表格 表格所涉及的標籤有“表格標籤”,“行標籤”和“單元格標籤”。 < table >…< /table >:表格標籤,表示一個表格的開始和結束。 < tr >…< /tr >:行標籤,成對出現,包含在表格標籤之間,有

Scrapy學習Xpath使用與並行化操作

一、xpath介紹 XPath 是一門在 XML 文件中查詢資訊的語言。XPath 用於在 XML 文件中通過元素和屬性進行導航。 XPath 使用路徑表示式在 XML 文件中進行導航 XPath 包含一個標準函式庫 XPath 是 XSLT 中的主要元素 XPat

JAVA學習第二章 基本程式設計

第二章 基本程式設計   (1)變數:變數儘量選擇有描述性的名字; (2)實數用浮點型數表示; (3)加號(+)的意義:加法與字串的連線; (4)從控制檯讀取輸入: import Java.util.*; public class&

MFC學習訊息對映

1. 訊息對映表的組成 巨集DECLARE_MESSAGE_MAP,用在類的宣告中,用來宣告訊息對映表。 巨集BEGIN_MESSAGE_MAP,在使用類宣告外,用來定義連結節點和填寫連結串列節點中的資料,其格式為BEGIN_MESSAGE_MAP(類名稱, 基類名稱)。 巨集ON_XXXX,

rabbitmq學習rabbitmq消息隊列的作用以及rabbitmq之直連交換機

tde pub 假設 代碼 持久化 tor 安裝 live 服務 前言   上篇介紹了AMQP的基本概念,組成及其與rabbitmq的關系。了解了這些東西後,下面我們開始學習rabbitmq(消息隊列)的作用以及用java代碼和rabbitmq通訊進行消息發布和接收。因為消

webpack學習配置載入css, 圖片, 字型, 資料(JSON, XML, CSV)等資原始檔

demo地址: https://github.com/Lkkkkkkg/webpack-demo webpack初步配置參照 https://blog.csdn.net/qq593249106/article/details/84892069 配置載入css檔案 webpack 視所

機器學習logistic迴歸

基礎知識: logistic迴歸其實是一個分類問題,可以定義如下:c為2時是一個兩類分類問題. 當分佈為伯努利分佈時:    logistic迴歸和線性迴歸類似,不同的條件概率是不同的,方程如下: 其中:sigmoid函式定義如下: 使用logist

zookeeper入門學習原理詳解

一 .Zookeeper功能簡介 ZooKeeper 是一個開源的分散式協調服務,由雅虎建立,是 Google Chubby 的開源實現。 分散式應用程式可以基於 ZooKeeper 實現諸如資料釋出/訂閱、負載均衡、命名服務、分散式協 調/通知

機器學習機器學習中的幾個基本概念

前言 對於《統計學習方法》中遇到的一些問題,以及機器學習中的一些自己沒有理解透徹的問題,希望通過梳理總結能夠有更深入的理解。 在上一章最開始我們已經概括了統計學習方法的三要素,即模型、策略、演算法,這裡就不再詳述了。 本文討論總結了如下幾個概念:損失函式與風險

RabbitMq的學習Java建立簡單的生產者消費者

官方文件說的很詳細,但是再詳細也要動手操作一番,畢竟動手操作的時候,才會給自己挖坑。 使用環境: RabbitMq版本:3.7.8 jdk環境:1.8 一、引入maven架包 <dependency> <groupId>com.r

vue學習元件化開發

首先看看vuedemo的入口函式main.js// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.

Maven學習屬性、座標與依賴

前言: 1、pom檔案的配置,主要內容為屬性、座標與依賴、外掛、倉庫以及其他一些配置。 2、理解這些配置的內容,在一定程度上也就理解了Maven 的使用。 一、屬性 (一)Maven內建屬性: 1、${basedir} 專案根目錄,即包含 pom.xml 的目錄。 2、${v