資料介紹
描述
Zybo Z7 帶有一組用戶控制的 LED、按鈕和開(kāi)關(guān)。所有這些都可以通過(guò) Zynq 的 GPIO 控制器訪問(wèn)。然而,只有一個(gè) LED 和兩個(gè)按鈕直接連接到處理系統(tǒng) (PS),其余連接到可編程邏輯 (PL)。因此,在這個(gè)項(xiàng)目中,我不僅會(huì)展示如何控制 Zynq 的 GPIO,還會(huì)展示如何使用 GPIO 和 MMIO 與 PL 交互。
請(qǐng)注意,我假設(shè)您知道如何在 Zybo Z7 上運(yùn)行 Genode。如果沒(méi)有,請(qǐng)查看我的Zybo Z7 項(xiàng)目入門(mén)。
建筑學(xué)
下圖說(shuō)明了 Genode 中用于引腳級(jí)訪問(wèn)的一般架構(gòu)。最底層是Core / Init組件,它擁有最終權(quán)限并且不受訪問(wèn)策略限制。它只是通過(guò) IRQ 和 MMIO 服務(wù)向平臺(tái)驅(qū)動(dòng)程序提供所有設(shè)備資源的權(quán)限。后者提供平臺(tái)服務(wù),特定組件可以通過(guò)該服務(wù)獲得對(duì)單個(gè)設(shè)備的授權(quán)。在這種情況下,引腳驅(qū)動(dòng)程序獲得對(duì) GPIO 控制器的權(quán)限。同樣,它提供了Pin control 、Pin state和IRQ服務(wù),用于將各個(gè)引腳的寫(xiě)入、讀取和通知權(quán)限傳遞給特定組件。在此示例中,我將實(shí)現(xiàn)一個(gè) MIO 演示組件,該組件控制 Zybo Z7 板的按鈕 4、按鈕 5 和 LED 4 的 PS 可訪問(wèn) GPIO 引腳。

測(cè)試引腳驅(qū)動(dòng)器
Genode 21.11 引入了Pin I/O 會(huì)話接口,該接口首先由A64 SoC 的引腳驅(qū)動(dòng)程序實(shí)現(xiàn)。使用 A64 引腳驅(qū)動(dòng)程序作為藍(lán)圖,我效仿并為 Zynq SoC 實(shí)現(xiàn)了引腳驅(qū)動(dòng)程序。由于出色的基礎(chǔ)工作,我能夠重用大部分代碼并專(zhuān)注于特定于 SoC 的部分。
有了手邊的引腳驅(qū)動(dòng)器,我已經(jīng)能夠控制 PS 可訪問(wèn)的 LED 和按鈕。因此,我編寫(xiě)了一個(gè)微型 MIO 演示組件。按下按鈕 4 時(shí)組件應(yīng)打開(kāi) LED,按下按鈕 5 時(shí)關(guān)閉 LED。它還會(huì)生成反映 LED 狀態(tài)的狀態(tài)報(bào)告。
編寫(xiě)組件的第一步是創(chuàng)建一個(gè)target.mk文件。慣例是根據(jù)組件的類(lèi)型將組件的源代碼放在src/app、src/server、src/drivers或src/test 的子目錄中。在我的genode-zynq 存儲(chǔ)庫(kù)的克隆中,我因此創(chuàng)建了包含以下內(nèi)容的文件src/app/zynq_gpio_demo/mio/target.mk 。請(qǐng)注意,因?yàn)槲乙獙?shí)現(xiàn)多個(gè)相關(guān)組件,所以我將所有組件捆綁在一個(gè)公共子目錄zynq_gpio_demo 中。
TARGET := zybo_gpio_demo_mio
SRC_CC := main.cc
LIBS := base
target.mk包含一些聲明,這些聲明將在編譯組件時(shí)由Genode的構(gòu)建系統(tǒng)解釋。第一行指定目標(biāo)二進(jìn)制文件的名稱(chēng)。第二行說(shuō)明應(yīng)將哪些源文件傳遞給 C++ 編譯器。在第三行中,我定義了庫(kù)依賴(lài)項(xiàng)(表示 Genode 的基礎(chǔ) API)。base
接下來(lái),我創(chuàng)建了main.cc文件。讓我們從前幾行開(kāi)始。
/* Genode includes */
#include
#include
#include
#include
#include
namespace Demo {
using namespace Genode;
struct Main;
}
/* [...] see below */
void Component::construct(Genode::Env &env)
{
static Demo::Main main(env);
}
我們必須包含一些頭文件:base/component.h
頭文件是實(shí)現(xiàn)本機(jī) Genode 組件所必需的。接下來(lái)的三個(gè)包含是前面提到的由引腳驅(qū)動(dòng)程序?qū)崿F(xiàn)的引腳 I/O 會(huì)話接口所必需的。最后,os/reporter.h
需要生成上述狀態(tài)報(bào)告。
我進(jìn)一步Main
在單獨(dú)的Demo
名稱(chēng)空間中聲明了一個(gè)對(duì)象。本地 Genode 組件沒(méi)有作為main()
我們?cè)?POSIX 程序中使用的入口點(diǎn)的功能。相反,入口點(diǎn)是Component::construct()
我簡(jiǎn)單地按Demo::Main
對(duì)象實(shí)例化的方法。現(xiàn)在,讓我們看一下它的實(shí)現(xiàn)。
struct Demo::Main { /* members */ Env &_env; Pin_state::Connection _btn4 { _env, "Btn4" }; Pin_state::Connection _btn5 { _env, "Btn5" }; Pin_control::Connection _led4 { _env, "Led4" }; Irq_connection _irq4 { _env, "Btn4" }; Irq_connection _irq5 { _env, "Btn5" }; Signal_handler
_irq_handler { _env.ep(), *this, &Main::_handle_irq }; Expanding_reporter _reporter { _env, "state", "state" }; /* methods */ void _update_state(bool on) { _reporter.generate([&] (Genode::Xml_generator & xml) { xml.attribute("value", on ? "yes" : "no"); }); _led4.state(on); } void _handle_irq() { _irq4.ack_irq(); _irq5.ack_irq(); if (_btn4.state()) _update_state(true); else if (_btn5.state()) _update_state(false); } /* constructor */ Main(Env &env) : _env(env) { _update_state(false); _irq4.sigh(_irq_handler); _irq5.sigh(_irq_handler); _irq4.ack_irq(); _irq5.ack_irq(); } };
成員:首先,該Main
對(duì)象持有一個(gè)引用,Genode::Env
因?yàn)檫@是構(gòu)建其他成員所必需的。為了訪問(wèn)按鈕的輸入引腳,我使用了Pin_state::Connection
對(duì)象。傳遞給其構(gòu)造函數(shù)的字符串稱(chēng)為會(huì)話標(biāo)簽,由 pin 驅(qū)動(dòng)程序評(píng)估以應(yīng)用匹配的訪問(wèn)控制策略(詳情如下)。同樣,為了訪問(wèn) LED 的輸出引腳,我使用了一個(gè)Pin_control::Connection
對(duì)象。此外,因?yàn)槲蚁胧盏桨粹o狀態(tài)更改的通知,所以我Irq_connection
為每個(gè)按鈕添加了一個(gè)對(duì)象。這些伴隨著一個(gè)Signal_handler
將注冊(cè)到 IRQ 連接的對(duì)象。此信號(hào)處理程序?qū)⒄{(diào)用該方法。最后,我正在使用狀態(tài)報(bào)告。這_handle_irq()
Expanding_reporter
Expanding_reporter
將兩個(gè)字符串作為構(gòu)造函數(shù)參數(shù)。第一個(gè)字符串指定頂級(jí) XML 節(jié)點(diǎn)的名稱(chēng)(Genode 中的報(bào)告通常是 XML 格式的),而第二個(gè)字符串定義會(huì)話標(biāo)簽,可以將其視為報(bào)告的名稱(chēng)。
方法:該_update_state()
方法有助于設(shè)置 LED 的狀態(tài)和更新組件的狀態(tài)報(bào)告。只要任一按鈕出現(xiàn) IRQ,信號(hào)處理程序就會(huì)調(diào)用該方法。_handle_irq()
此方法確認(rèn) IRQ 并評(píng)估按鈕狀態(tài)以相應(yīng)地更新 LED 狀態(tài)。
構(gòu)造函數(shù):構(gòu)造函數(shù)非常簡(jiǎn)單。它設(shè)置初始 LED 狀態(tài),在兩個(gè) IRQ 連接上注冊(cè)信號(hào)處理程序并確認(rèn)任何掛起的 IRQ。
我們需要的下一個(gè)要素是運(yùn)行腳本。在 Genode 中,運(yùn)行腳本是對(duì)某個(gè)要執(zhí)行的場(chǎng)景的定義。更準(zhǔn)確地說(shuō),它包含有關(guān)要構(gòu)建的組件以及如何組合它們以創(chuàng)建特定場(chǎng)景的信息。運(yùn)行腳本還可以評(píng)估正在運(yùn)行的系統(tǒng)的(串行)輸出以檢查錯(cuò)誤。由于運(yùn)行腳本位于run/目錄中,因此我在 genode-zynq 存儲(chǔ)庫(kù)的克隆中創(chuàng)建了包含以下內(nèi)容的文件run/zynq_gpio_demo.run 。
create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/init \
[depot_user]/src/report_rom \
[depot_user]/src/zynq_platform_drv \
[depot_user]/src/zynq_pin_drv \
[depot_user]/raw/[board]-devices
build { app/zybo_gpio_demo }
install_config {
<config>
<parent-provides>
<service name="LOG"/>
<service name="PD"/>
<service name="CPU"/>
<service name="ROM"/>
<service name="IO_MEM"/>
<service name="IRQ"/>
parent-provides>
<default caps="200"/>
<start name="report_rom">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="Report"/>
<service name="ROM"/>
provides>
<route>
<service name="ROM"> <parent/> service>
<service name="CPU"> <parent/> service>
<service name="PD"> <parent/> service>
<service name="LOG"> <parent/> service>
route>
<config verbose="yes"/>
start>
<start name="platform_drv" managing_system="yes">
<binary name="zynq_platform_drv"/>
<resource name="RAM" quantum="1M"/>
<provides><service name="Platform"/>provides>
<config>
<policy label="zynq_pin_drv -> ">
<device name="gpio0"/>
policy>
config>
<route>
<any-service> <parent/> any-service>
route>
start>
<start name="zynq_pin_drv">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="Pin_state"/>
<service name="Pin_control"/>
<service name="IRQ"/>
provides>
<route>
<service name="ROM"> <parent/> service>
<service name="CPU"> <parent/> service>
<service name="PD"> <parent/> service>
<service name="LOG"> <parent/> service>
<service name="Platform">
<child name="platform_drv"/>
service>
route>
<config>
<in name="Btn4" bank="1" index="18" irq="rising"/>
<in name="Btn5" bank="1" index="19" irq="rising"/>
<out name="Led4" bank="0" index="7" default="on"/>
<policy label_prefix="zybo_gpio_demo_mio -> Btn4" pin="Btn4"/>
<policy label_prefix="zybo_gpio_demo_mio -> Btn5" pin="Btn5"/>
<policy label_prefix="zybo_gpio_demo_mio -> Led4" pin="Led4"/>
config>
start>
<start name="zybo_gpio_demo_mio">
<resource name="RAM" quantum="1M"/>
<route>
<service name="Pin_control">
<child name="zynq_pin_drv"/>
service>
<service name="Pin_state">
<child name="zynq_pin_drv"/>
service>
<service name="IRQ">
<child name="zynq_pin_drv"/>
service>
<service name="report">
<child name="report_rom"/>
service>
<service name="ROM"> <parent/> service>
<service name="CPU"> <parent/> service>
<service name="PD"> <parent/> service>
<service name="LOG"> <parent/> service>
route>
<config/>
start>
config>
}
build_boot_image { zybo_gpio_demo_mio }
run_genode_until forever
我不想在這里詳述所有細(xì)節(jié)。運(yùn)行腳本指定要從倉(cāng)庫(kù)(Genode 的包管理)導(dǎo)入哪些檔案,以及要從源代碼樹(shù)構(gòu)建哪些組件。它還為頂級(jí) init 組件安裝配置。關(guān)于init的配置的詳細(xì)解釋請(qǐng)參考Genode手冊(cè)的系統(tǒng)配置章節(jié)。但是,我們可以在沒(méi)有深入了解的情況下確定該場(chǎng)景由四個(gè)部分組成:report_rom
、platform_drv
和。zynq_pin_drv
zybo_gpio_demo_mio
report_rom
:該組件提供一個(gè)ROM和一個(gè)Report服務(wù)。它允許組件發(fā)布它們的報(bào)告,這些報(bào)告可以通過(guò) ROM 連接訪問(wèn)。因此,它實(shí)現(xiàn)了單寫(xiě)入器、多讀取器方案。
platform_drv
:這是一個(gè)驅(qū)動(dòng)程序組件,可以最終控制硬件外圍設(shè)備(例如 MMIO 設(shè)備)。根據(jù)其配置,它通過(guò)提供的平臺(tái)服務(wù)將對(duì)各個(gè)設(shè)備的控制權(quán)傳遞給其他組件。平臺(tái)驅(qū)動(dòng)程序需要訪問(wèn)我從軟件倉(cāng)庫(kù)導(dǎo)入的板特定設(shè)備ROM。它的配置包含基于標(biāo)簽的策略,這些策略將設(shè)備(由設(shè)備ROM定義)分配給相應(yīng)的平臺(tái)會(huì)話。在這里,被授予對(duì)設(shè)備的訪問(wèn)權(quán)限。zynq_pin_drv
gpio0
zynq_pin_drv
:這是引腳驅(qū)動(dòng)程序。其配置為按鈕指定了兩個(gè)輸入引腳,為 LED 指定了一個(gè)輸出引腳。查看Zybo Z7 手冊(cè),我發(fā)現(xiàn) LED 4 連接到 MIO 引腳 7,按鈕 4 和 5 分別連接到 MIO 引腳 50 和 51。知道 GPIO bank 0 覆蓋 MIO 引腳 0 到 31 而 bank 1 覆蓋引腳 32 到 53,我最終得到了發(fā)布的配置。與平臺(tái)驅(qū)動(dòng)程序類(lèi)似,對(duì)單個(gè)引腳的訪問(wèn)由基于標(biāo)簽的策略定義。
zybo_gpio_demo_mio
:這是我上面實(shí)現(xiàn)的演示組件。請(qǐng)注意,我將它的和Pin_state
會(huì)話請(qǐng)求路由到 pin 驅(qū)動(dòng)程序。會(huì)話請(qǐng)求被路由到組件。Pin_control
Irq
report
report_rom
該場(chǎng)景的構(gòu)建和運(yùn)行如下:
build/arm_v7a$ make run/zybo_gpio_demo BOARD=zynq_zybo_z7 KERNEL=hw
通過(guò)此設(shè)置,我可以使用兩個(gè)按鈕打開(kāi)/關(guān)閉 LED。在串行控制臺(tái)上,我可以進(jìn)一步看到以下輸出:
[init -> report_rom] report 'zybo_gpio_demo_mio -> state'
[init -> report_rom]
[init -> report_rom] report 'zybo_gpio_demo_mio -> state'
[init -> report_rom] "yes"/>
并不壯觀,但看到引腳驅(qū)動(dòng)器工作時(shí)仍然令人滿意。在下一步中,我為 FPGA 創(chuàng)建了一個(gè)自定義比特流來(lái)控制連接到 PL 的開(kāi)關(guān)、按鈕和 LED。
創(chuàng)建自定義比特流
為可編程邏輯實(shí)施復(fù)雜的定制設(shè)計(jì)可能會(huì)很繁瑣,尤其是如果您是 FPGA 領(lǐng)域的新手。我最后一次使用賽靈思 FPGA 是在大約十年前,當(dāng)時(shí)工具發(fā)生了很大變化。因此,我從一個(gè)非常簡(jiǎn)單的設(shè)計(jì)開(kāi)始,以檢查我的基本設(shè)置是否正確。
作為先決條件,我必須在單獨(dú)的 Ubuntu VM 中安裝 Vivado ML Standard。我對(duì)它占用的磁盤(pán)空間量 (~60GB) 感到震驚,因此不得不相應(yīng)地增加 VM 大小。
作為起點(diǎn),我遵循了本教程。由于它已經(jīng)包含了 Vivado 的詳細(xì)分步說(shuō)明,因此我寧愿堅(jiān)持對(duì)本文中的各個(gè)步驟進(jìn)行簡(jiǎn)要總結(jié)。
在 Vivado 中,我打開(kāi)了一個(gè)新項(xiàng)目并使用左側(cè)的 Flow Navigator 創(chuàng)建了一個(gè)模塊設(shè)計(jì)。在block design中,我添加了Zynq處理系統(tǒng)作為IP(intellectual property)核。添加 IP 核后,Vivado 通常會(huì)提供運(yùn)行連接自動(dòng)化以連接所有明顯信號(hào)的選項(xiàng)。運(yùn)行自動(dòng)化將IP 核的接口DDR
和接口連接到相應(yīng)的(自動(dòng)創(chuàng)建的)外部端口。FIXED_IO
在這一點(diǎn)上,我很好奇我的最低限度但無(wú)用的設(shè)計(jì)是否基本上是完整和正確的,因此點(diǎn)擊了“驗(yàn)證設(shè)計(jì)”按鈕。

哎呀!顯然,因?yàn)槲覜](méi)有按照上述教程的建議添加 AXI IP 核,連接自動(dòng)化無(wú)法決定如何連接 AXI 時(shí)鐘信號(hào)。通過(guò)鎖定教程中的其他步驟,我能夠決定 AXI 時(shí)鐘信號(hào)應(yīng)該連接到FCLK_CLK0
IP 內(nèi)核的接口。
修復(fù)此問(wèn)題后,我生成了 HD??L 包裝器(右鍵單擊模塊設(shè)計(jì))。不幸的是,我的 Vivado 安裝在此過(guò)程中總是卡住,就像“初始化語(yǔ)言服務(wù)器”時(shí)一樣。在工具→設(shè)置→工具設(shè)置→文本編輯器→語(yǔ)法檢查中將語(yǔ)法檢查從“Sigasi”更改為“Vivado”,在重新啟動(dòng) Vivado 后為我解決了這個(gè)問(wèn)題。
在這一點(diǎn)上,我開(kāi)始偏離上述教程。我不想實(shí)例化 AXI_GPIO IP 內(nèi)核(這需要引腳驅(qū)動(dòng)程序的支持),而是想使用 SoC 的 GPIO 控制器與 PL 交互。這是可能的,因?yàn)?GPIO 控制器的 bank 2 和 3 通過(guò) EMIO 接口連接到 PL。EMIO 信號(hào)只需要路由到 FPGA 的正確引腳。
通過(guò)雙擊 Zynq PS IP 內(nèi)核,我在外設(shè) I/O 引腳卡上啟用了 GPIO EMIO。此外,在MIO 配置卡上,我將 EMIO GPIO 寬度設(shè)置為 12(用于 4 個(gè)開(kāi)關(guān)、4 個(gè) LED、4 個(gè)按鈕)。通過(guò)這樣做,IP 內(nèi)核獲得了一個(gè)GPIO_0
接口。為了使它成為一個(gè)外部信號(hào),我選擇了名稱(chēng)并右擊以從上下文菜單中選擇Make external 。這創(chuàng)建了一個(gè)名為連接到 IP 內(nèi)核的外部接口。GPIO_0_0
由于 GPIO 信號(hào)是三態(tài)的,外部信號(hào)將由gpio_0_0_tri_io
Vivado 命名。我通過(guò)查看 HDL 包裝器(在重新生成它之后)仔細(xì)檢查了這個(gè)命名方案。
最后,我添加了一個(gè) Xilinx 設(shè)計(jì)約束 (XDC) 文件以將信號(hào)綁定gpio_0_0_tri_io
到那些實(shí)際連接到開(kāi)關(guān)/LED/按鈕的設(shè)備引腳。幸運(yùn)的是,Digilent為其電路板提供了主文件。使用主文件,只需取消注釋個(gè)別行并插入相應(yīng)的信號(hào)名稱(chēng)。我通過(guò)添加源對(duì)話框添加了 Zybo-Z7-Master 文件,取消了 LED、按鈕和開(kāi)關(guān)行的注釋?zhuān)⑿盘?hào)名稱(chēng)插入gpio_0_0_tri_io[0]
到gpio_0_0_tri_io[11]
. 您可以在上述教程中找到更詳細(xì)的說(shuō)明。
生成比特流時(shí),我注意到 Vivado 占用了大量 RAM。由于我在單獨(dú)的 Ubuntu VM 中運(yùn)行該工具,這有時(shí)會(huì)導(dǎo)致無(wú)法解釋的構(gòu)建錯(cuò)誤。向 VM 添加另一個(gè) GB 的 RAM 并將作業(yè)數(shù)量減少到 1 對(duì)我來(lái)說(shuō)是個(gè)竅門(mén)。最終,我能夠通過(guò)File → Export → Export Bitstream File導(dǎo)出生成的比特流文件。
在啟動(dòng)時(shí)加載比特流
由于 FPGA 使用易失性存儲(chǔ)器來(lái)存儲(chǔ)其編程,因此必須在每次通電后重新編程。比特流文件包含必要的(特定于設(shè)備的)信息。最簡(jiǎn)單的方法是讓引導(dǎo)加載程序負(fù)責(zé)加載比特流。Xilinx 的 FSBL 和 u-boot 對(duì)此提供支持。當(dāng)使用相應(yīng)的配置選項(xiàng)編譯時(shí),您可以使用 u-boot 的fpga
命令加載比特流。有兩個(gè)子命令:load
和loadb
。前者需要原始比特流 (.bin),例如通過(guò)回讀獲取的比特流。后者需要 Vivado 導(dǎo)出的 a.bit 文件。與原始比特流相比,此文件具有不同的字節(jié)順序并包含文件頭。
為了簡(jiǎn)化啟動(dòng)時(shí)的比特流加載,我在 u-boot 的默認(rèn)環(huán)境中添加了兩個(gè)命令,分別檢查fpga.bin 。fpga.bit文件,如果存在,fpga
在啟動(dòng)到 Genode 之前執(zhí)行相應(yīng)的命令。此外,您可以通過(guò)將以下行添加到您的etc/build.conf來(lái)使用比特流填充 SD 卡映像。
RUN_OPT_zybo += --image-uboot-bitstream "/path/to/bitstream.bit"
測(cè)試比特流
為了測(cè)試比特流,我實(shí)現(xiàn)了一個(gè)zybo_gpio_demo_sw組件,它控制開(kāi)關(guān)和每個(gè)開(kāi)關(guān)旁邊的 LED。代碼非常簡(jiǎn)單。您可以在genode-zynq 存儲(chǔ)庫(kù)中找到它。
我還在run/zybo_gpio_demo.run腳本中添加了以下啟動(dòng)節(jié)點(diǎn):
<start name="zybo_gpio_demo_sw">
<resource name="RAM" quantum="1M"/>
<route>
<service name="Pin_control"><child name="zynq_pin_drv"/> service>
<service name="Pin_state"> <child name="zynq_pin_drv"/> service>
<service name="IRQ"> <child name="zynq_pin_drv"/> service>
<service name="ROM"> <parent/> service>
<service name="CPU"> <parent/> service>
<service name="PD"> <parent/> service>
<service name="LOG"> <parent/> service>
route>
<config/>
start>
此外,更有趣的是,我修改了 pin-driver 配置以添加相應(yīng)的策略:
<config>
<in name="Btn4" bank="1" index="18" irq="rising"/>
<in name="Btn5" bank="1" index="19" irq="rising"/>
<out name="Led4" bank="0" index="7" default="on"/>
<policy label="zybo_gpio_demo_mio -> Btn4" pin="Btn4"/>
<policy label="zybo_gpio_demo_mio -> Btn5" pin="Btn5"/>
<policy label="zybo_gpio_demo_mio -> Led4" pin="Led4"/>
<in name="Sw0" bank="2" index="0" irq="edges"/>
<in name="Sw1" bank="2" index="1" irq="edges"/>
<in name="Sw2" bank="2" index="2" irq="edges"/>
<in name="Sw3" bank="2" index="3" irq="edges"/>
<out name="Led0" bank="2" index="8" default="off"/>
<out name="Led1" bank="2" index="9" default="off"/>
<out name="Led2" bank="2" index="10" default="off"/>
<out name="Led3" bank="2" index="11" default="off"/>
<policy label="zybo_gpio_demo_sw -> Sw0" pin="Sw0"/>
<policy label="zybo_gpio_demo_sw -> Sw1" pin="Sw1"/>
<policy label="zybo_gpio_demo_sw -> Sw2" pin="Sw2"/>
<policy label="zybo_gpio_demo_sw -> Sw3" pin="Sw3"/>
<policy label="zybo_gpio_demo_sw -> Led0" pin="Led0"/>
<policy label="zybo_gpio_demo_sw -> Led1" pin="Led1"/>
<policy label="zybo_gpio_demo_sw -> Led2" pin="Led2"/>
<policy label="zybo_gpio_demo_sw -> Led3" pin="Led3"/>
config>
因?yàn)槲蚁朐谏仙睾拖陆笛赜|發(fā)中斷,所以我使用了開(kāi)關(guān)輸入引腳。irq="edges"
啟用 RGB LED
到目前為止,我故意忽略了 Zybo Z7-20 (Z7-10) 上兩個(gè)(一個(gè))RGB LED 的存在。其中每一個(gè)實(shí)際上都由一個(gè)綠色、一個(gè)藍(lán)色和一個(gè)紅色 LED 組成。原則上,這些 LED 可以像其他 LED 一樣進(jìn)行控制。然而,由于它們的亮度需要通過(guò)脈寬調(diào)制 (PWM) 進(jìn)行調(diào)節(jié),因此為這項(xiàng)工作實(shí)施定制 IP 內(nèi)核更為明智。這在本故事的第 2 部分中有所介紹,其中還包括使用我的預(yù)構(gòu)建比特流再現(xiàn)完整 GPIO 演示的說(shuō)明。
- 使用Genode控制Zybo Z7 GPIO - 第2/2部分
- Zybo Z7-20上的汽車(chē)檢測(cè)系統(tǒng)
- 使用 Zybo Z7的Genode 操作系統(tǒng)框架實(shí)現(xiàn)
- 在Vivado 2020.2中開(kāi)始使用Arty Z7
- Eclypse Z7上的Zmod ADC和DAC:正弦波環(huán)回
- AM6254-gpio接口-gpio復(fù)用及M核引腳的使用
- LINUX GPIO如何驅(qū)動(dòng)源碼移植
- MYC-C7Z010和MYC-C7Z020開(kāi)發(fā)板的CPU模塊資料免費(fèi)下載 113次下載
- MYD-C7Z010和MYD-C7Z020 Linux開(kāi)發(fā)手冊(cè)的詳細(xì)資料說(shuō)明 21次下載
- xc7z020和xc7z010 FPGA芯片的電路原理圖免費(fèi)下載 501次下載
- CC2530 GPIO輸出控制-控制Led亮滅實(shí)驗(yàn)資料下載 1次下載
- CC2530的GPIO輸出控制-Led閃爍、流水燈實(shí)驗(yàn)資料下載 5次下載
- 雙向Z源逆變器電容電壓紋波分析 8次下載
- ZYBO入門(mén)指導(dǎo)手冊(cè)(一)v1.0——Vivado 21次下載
- ZYBO入門(mén)指導(dǎo)手冊(cè) (二)—建立硬件平臺(tái)和用戶軟件 1次下載
- 如何移植FPGA的例程 1951次閱讀
- digilentPcam 5C開(kāi)發(fā)板的成像模塊介紹 2689次閱讀
- Firefly-RK3399--GPIO簡(jiǎn)介 1.4w次閱讀
- digilent Zynq-7000 ARM/FPGA SoC開(kāi)發(fā)板介紹 2269次閱讀
- digilent APSoC Zynq-7000開(kāi)源創(chuàng)客開(kāi)發(fā)板介紹 2797次閱讀
- digilentAPSoC Zynq-7000開(kāi)源創(chuàng)客開(kāi)發(fā)板介紹 2500次閱讀
- digilentZynq-7000 ARM/FPGA SoC開(kāi)發(fā)板介紹 2866次閱讀
- digilent Cora Z7-10: Zynq-7000 概述 2584次閱讀
- digilent Cora Z7-07S: Zynq-7000 概述 2275次閱讀
- Zybo Board開(kāi)發(fā)Digilent升級(jí)和項(xiàng)目設(shè)計(jì) 1255次閱讀
- 基于STM32單片機(jī)流水燈控制中的GPIO_Init()函數(shù)解析 7209次閱讀
- Zybo Z7上OpenCV和SDSoC的結(jié)合 1933次閱讀
- Zybo全棧開(kāi)發(fā)入門(mén)教程(基于Linux嵌入式系統(tǒng)):10個(gè)步驟自定義IP模塊 3872次閱讀
- arm7單片機(jī)編程實(shí)例,ARM7之輸入/輸出端口GPIO編程教程 2708次閱讀
- Zybo board 開(kāi)發(fā)經(jīng)驗(yàn)分享第一季: 詳解硬件構(gòu)架 1.1w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論