資料介紹
描述
在第一部分中,我通過 GPIO 控制器啟用了對(duì)板載按鈕、開關(guān)和 LED 的控制。在這一部分中,我將實(shí)現(xiàn)一個(gè)自定義 IP 核來控制 Zybo Z7-20 (Z7-10) 上兩個(gè)(一個(gè))RGB LED 的顏色和亮度。
在這個(gè)故事的結(jié)尾,您會(huì)找到快速設(shè)置說明,以從源代碼存儲(chǔ)庫(kù)中復(fù)制完整的演示。
概念
RGB LED 實(shí)際上由三個(gè)單獨(dú)的 LED 組成:紅色、綠色和藍(lán)色。每種顏色都可以通過不同的引腳打開/關(guān)閉。因此,通過改變每個(gè) LED 的亮度,我們基本上可以混合任何顏色。但是,如果我們只有一個(gè)開/關(guān)開關(guān),我們?nèi)绾螌?shí)際調(diào)整亮度呢?答案稱為 PWM(脈寬調(diào)制)。當(dāng)以快于大約 50Hz 的速度打開和關(guān)閉 LED 時(shí),人眼無法檢測(cè)到任何閃爍。因此,通過改變開啟時(shí)間和關(guān)閉時(shí)間之間的比率,我們能夠欺騙人眼感知不同的亮度級(jí)別。
盡管現(xiàn)代 CPU 的速度肯定足以單獨(dú)執(zhí)行這項(xiàng)工作,但要確保在高 CPU 負(fù)載下的正確時(shí)序可能會(huì)變得棘手。即使我們?cè)O(shè)法滿足 PWM 的嚴(yán)格時(shí)序要求,其他應(yīng)用程序也需要頻繁搶占。幸運(yùn)的是,我們還有可編程邏輯 (PL),我們可以為其配備定制 IP 核,以完美無缺地執(zhí)行 PWM,從而將所有 CPU 資源留給更有趣的計(jì)算。
在開始實(shí)際實(shí)施之前,讓我說明一下我想要實(shí)現(xiàn)的目標(biāo):

該圖顯示了用于控制單個(gè) RGB LED 的 my IP 核的基本思想。Xilinx 在ug1118方面提供了更詳細(xì)的指南。
有了這些背景信息,我就能夠通過Tool → Create and Package New IP創(chuàng)建我的自定義 IP 核。在對(duì)話框中,我選擇了 Create a new AXI4 peripheral因?yàn)槲蚁雽?shí)現(xiàn)一個(gè) MMIO 接口。在最后的對(duì)話中,我選擇了編輯 IP作為下一步。
Vivado 的 IP 打包工具已經(jīng)負(fù)責(zé)生成所有樣板代碼。默認(rèn)情況下,它實(shí)現(xiàn)了一個(gè)帶有四個(gè) 32 位寄存器的 MMIO 接口,這正是我控制兩個(gè) RGB LED 的顏色和亮度所需要的。
為了實(shí)現(xiàn) RGB 模塊,我添加了一個(gè) Verilog 源文件并開始實(shí)現(xiàn)一個(gè)用于驅(qū)動(dòng)單個(gè) RGB LED 引腳的模塊:
module rgbled(
output reg [2:0] rgb,
input wire [6:0] brightness,
input wire [7:0] red,
input wire [7:0] green,
input wire [7:0] blue,
input wire clk
);
// [...] see below
endmodule
該rgbled
模塊得到一個(gè)三位輸出信號(hào)rgb
(每種顏色一位)。此外,它還有四個(gè)用于亮度、紅色、綠色和藍(lán)色值的輸入信號(hào)以及一個(gè)時(shí)鐘輸入。如果您是 Verilog 的新手并且想知道 和 之間的區(qū)別reg
,wire
我可以向您推薦本教程。簡(jiǎn)而言之,一個(gè)reg
信號(hào)能夠存儲(chǔ)一些狀態(tài),而一個(gè)wire
僅僅是一個(gè)連接。
作為模塊實(shí)現(xiàn)的第一部分,我添加了一個(gè)循環(huán)計(jì)數(shù)器,當(dāng)它達(dá)到某個(gè)最大值時(shí),它會(huì)將自身重置為 0:
module rgbled(
// [...] see above
reg [14:0] counter;
wire [14:0] max_cycles;
always @(posedge clk) begin
if (counter < max_cycles) begin
counter <= counter + 1;
end
else begin
counter = 0;
end
end
// [...] see below
endmodule
我決定采用 0 到 100 之間的亮度值,以便max_cycles
在 255(亮度 100)和 25500(亮度 1)之間線性縮放,亮度為 0 的特殊情況:
module rgbled(
// [...] see above
assign max_cycles =
brightness > 100 ? 255
: (brightness == 0 ? 0
: 255 * 100 / brightness);
// [...] see below
endmodule
這使得實(shí)現(xiàn)開/關(guān)切換邏輯變得非常簡(jiǎn)單:
module rgbled(
// [...] see above
always @(posedge clk) begin
if (max_cycles > 0) begin
rgb[0] <= red > counter ? 1 : 0;
rgb[1] <= blue > counter ? 1 : 0;
rgb[2] <= green > counter ? 1 : 0;
end
else begin
rgb <= 3'b000;
end
end
endmodule
這就完成了rgbled
模塊,但是,它仍然需要在自定義 IP 內(nèi)核中實(shí)例化。創(chuàng)建 IP 核時(shí),Vivado 生成了兩個(gè) Verilog 文件。我確定后綴為S00_AXI.v的文件是 MMIO 模塊,另一個(gè)文件是頂層模塊。查看 MMIO 模塊,我注意到文件頂部有一條注釋“用戶在此處添加端口”,我在其中為輸出信號(hào)添加了這兩行:
// Users to add ports here
output wire [2:0] led0,
output wire [2:0] led1,
// User ports ends
// Do not modify the ports beyond this line
在文件的底部,我找到了注釋“在此處添加用戶邏輯”并插入了我的rgbled
模塊的兩個(gè)實(shí)例。查看自動(dòng)生成的實(shí)現(xiàn),我發(fā)現(xiàn) MMIO 寄存器被命名為slv_reg0
, slv_reg1
,slv_reg2
以及slv_reg3
. 因此,我只需要決定哪個(gè)寄存器中的哪些位。用于 RGB 和亮度值。我最終得到了這些實(shí)例化:
// Add user logic here
rgbled led0_control (
.clk (S_AXI_ACLK),
.red (slv_reg0[23:16]),
.blue (slv_reg0[15:8]),
.green (slv_reg0[7:0]),
.brightness (slv_reg1[6:0]),
.rgb (led0)
);
rgbled led1_control (
.clk (S_AXI_ACLK),
.red (slv_reg2[23:16]),
.blue (slv_reg2[15:8]),
.green (slv_reg2[7:0]),
.brightness (slv_reg3[6:0]),
.rgb (led1)
);
// User logic ends
由于我修改了 MMIO 模塊的端口,我還在頂層文件中添加了兩個(gè)類似的輸出端口,并將它們傳遞給 MMIO 模塊的實(shí)例化。
完成這些更改后,我注意到Package IP視圖發(fā)生了一些變化。首先,文件組部分不再有綠色勾號(hào)。查看此部分并遵循 Vivado 的合并更改建議解決了此問題。端口和接口部分提供了一個(gè)類似的合并向?qū)А?/font>Vivado 自動(dòng)檢測(cè)到我之前添加的led0
和led1
端口。本節(jié)不需要手動(dòng)調(diào)整,但我了解到我能夠定義某些類型的接口并將端口映射到這些接口。因此,人們可以將信號(hào)分組到一個(gè)共同的分組中,并協(xié)助 Vivado 的自動(dòng)連接魔法。
我跳過了接口定義,進(jìn)入了Review and Package部分并打包了我的 IP 核。我回到我的塊設(shè)計(jì)并將新封裝的 IP 內(nèi)核添加到設(shè)計(jì)中,運(yùn)行自動(dòng)連接向?qū)Р?/font>led0
端口設(shè)置led1
為外部(與之前對(duì)GPIO_0
接口所做的一樣,請(qǐng)參見第 1 部分)。MMIO 設(shè)備的地址由 Vivado 自動(dòng)分配,但可以在打開塊設(shè)計(jì)后在地址編輯器中更改。在重新生成比特流之前,我取消了約束文件中 RGB LED 行的注釋,并插入了相應(yīng)的信號(hào)名稱(led0_0[0]
toled0_0[2]
和led1_0[0]
to led1_0[2]
)。
請(qǐng)注意,如果您想稍后編輯 IP 核,您可以右鍵單擊模塊設(shè)計(jì)中的核并選擇Edit in IP Packager 。
最終,我為這個(gè)新設(shè)計(jì)生成了比特流,并使用File → Export → Export Bitstream File導(dǎo)出結(jié)果。
使用自定義 IP 內(nèi)核
有了新的比特流,我實(shí)現(xiàn)了一個(gè)zybo_gpio_demo_rgb組件來測(cè)試 MMIO 接口。該組件使用按鈕 0 到 3 循環(huán)顯示兩個(gè) RGB LED 的某些顏色和亮度值。您可以在genode-zynq 存儲(chǔ)庫(kù)中找到代碼。如果您遵循了第 1 部分,那么其中的大部分內(nèi)容是不言自明的。然而,讓我簡(jiǎn)要說明如何訪問 MMIO 接口:
#include
/* [...] */
class Demo::Rgb_leds : public Platform::Device::Mmio
{
private:
struct Led : Genode::Mmio {
struct Color : Register<0x0, 32> { };
struct Brightness : Register<0x4, 32> { };
void color(uint32_t c) {
write(c); }
void brightness(uint32_t b) {
write(b); }
};
Led led0 { (addr_t)local_addr<void>() };
Led led1 { (addr_t)local_addr<void>() + 0x8 };
public:
Rgb_leds(Platform::Device &device)
: Platform::Device::Mmio(device)
{ }
void led0_color(uint32_t c) {
led0.color(c); }
void led0_brightness(uint32_t b) {
led0.brightness(b); }
void led1_color(uint32_t c) {
led1.color(c); }
void led1_brightness(uint32_t b) {
led1.brightness(b); }
};
在 Genode 中,可以通過寄存器框架輕松訪問 MMIO 接口。我們只需要繼承Platform::Device::Mmio
(或Genode::Mmio
)并定義幾個(gè)寄存器。Platform::Device::Mmio
從平臺(tái)驅(qū)動(dòng)程序獲取映射的設(shè)備地址,而Genode::Mmio
期望地址作為構(gòu)造函數(shù)參數(shù)。在這里,我使用后者來定義Led
包含單個(gè) LED的Color
和寄存器的結(jié)構(gòu)。Brightness
該類的模板參數(shù)Register
指定其偏移量和訪問寬度(以位為單位)。可以輕松讀取寄存器。用模板方法編寫,read()
如write()
和 中Led::color()
所示Led::brightness()
。然后,我使用 的方法實(shí)例化該Led
結(jié)構(gòu)兩次,以獲取映射的設(shè)備地址。local_address()
Platform::Device::Mmio
為了將新實(shí)現(xiàn)的組件添加到 GPIO 演示中,我在run/zybo_gpio_demo.run腳本中添加了以下啟動(dòng)節(jié)點(diǎn):
<start name="zybo_gpio_demo_rgb">
<resource name="RAM" quantum="2M"/>
<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="Platform"> <child name="platform_drv"/> service>
<service name="ROM"> <parent/> service>
<service name="CPU"> <parent/> service>
<service name="PD"> <parent/> service>
<service name="LOG"> <parent/> service>
route>
start>
此外,我修改了引腳驅(qū)動(dò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"/>
<in name="Btn0" bank="2" index="4" irq="edges"/>
<in name="Btn1" bank="2" index="5" irq="edges"/>
<in name="Btn2" bank="2" index="6" irq="edges"/>
<in name="Btn3" bank="2" index="7" irq="edges"/>
<policy label_suffix="zybo_gpio_demo_rgb -> Btn0" pin="Btn0"/>
<policy label_suffix="zybo_gpio_demo_rgb -> Btn1" pin="Btn1"/>
<policy label_suffix="zybo_gpio_demo_rgb -> Btn2" pin="Btn2"/>
<policy label_suffix="zybo_gpio_demo_rgb -> Btn3" pin="Btn3"/>
config>
為了進(jìn)行簡(jiǎn)短的測(cè)試運(yùn)行,我通過(臨時(shí))將以下行添加到board/zynq_zybo_z7/devices文件來讓平臺(tái)驅(qū)動(dòng)程序了解新的 MMIO 設(shè)備:
<device name="rgbleds" type="my_rgbleds">
<io_mem address="0x43c00000" size="0x1000"/>;
device>
為了能夠訪問這個(gè) MMIO 設(shè)備,我還在 platform-driver 配置中添加了相應(yīng)的策略:
<policy label="zybo_gpio_demo_rgb -> ">
<device name="rgbleds"/>
policy>
將比特流文件復(fù)制到我的 SD 卡后,我可以使用 LED 下方的四個(gè)按鈕更改兩個(gè) RGB LED 的顏色和亮度。但是,由于zybo_gpio_demo_rgb使用的 MMIO 設(shè)備只有在我的自定義比特流被加載時(shí)才可用,所以我更愿意在運(yùn)行時(shí)使用 Genode 執(zhí)行比特流加載過程,以便我可以在比特流加載后自動(dòng)啟動(dòng)相應(yīng)的軟件組件.
在運(yùn)行時(shí)切換比特流
在本節(jié)中,讓我們看看如何在運(yùn)行時(shí)在 Genode 中加載比特流。僅僅對(duì) FPGA 進(jìn)行重新配置非常簡(jiǎn)單,但它對(duì)定制平臺(tái)設(shè)備的可用性也有影響。為了適應(yīng)這個(gè)用例,我創(chuàng)建了倉(cāng)庫(kù)存檔pkg/drivers_fpga-zynq 。

如上圖所示,pkg/drivers_fpga-zynq子系統(tǒng)需要兩個(gè) ROM 會(huì)話(devices_manager.config和policy )以及一個(gè)文件系統(tǒng)會(huì)話。作為回報(bào),它通過提供平臺(tái)服務(wù)充當(dāng)平臺(tái)驅(qū)動(dòng)程序。策略ROM 包含此 GPIO 演示的平臺(tái)驅(qū)動(dòng)程序配置:
<report devices="yes"/>
<policy label_suffix="zynq_pin_driver -> ">
<device name="gpio0"/>
policy>
<policy label_suffix="zybo_gpio_demo_rgb -> ">
<device name="rgbleds"/>
policy>
節(jié)點(diǎn)指示內(nèi)部平臺(tái)驅(qū)動(dòng)程序在其狀態(tài)發(fā)生變化時(shí)生成設(shè)備報(bào)告。Zynq 驅(qū)動(dòng)程序管理器使用此報(bào)告來確定特定設(shè)備何時(shí)可用。因此,Zynq Driver Manager 可能會(huì)生成一個(gè)新的init.config來啟動(dòng)相應(yīng)的驅(qū)動(dòng)程序組件。驅(qū)動(dòng)程序組件和相應(yīng)的設(shè)備依賴項(xiàng)在管理器的配置中指定。為了在my_rgbleds設(shè)備可用后啟動(dòng)zybo_gpio_demo_rgb ,我使用以下配置:
<config>
<driver name="zybo_gpio_demo_rgb" device="my_rgbleds">
<binary name="zybo_gpio_demo_rgb"/>
<resource name="RAM" quantum="2M"/>
driver>
config>
devices_manager.config提供比特流及其實(shí)現(xiàn)的設(shè)備的規(guī)范。我們可以讓pkg/drivers_fpga-zynq子系統(tǒng)知道什么比特流可以使用什么設(shè)備,而不是像我在上一節(jié)中那樣將rgbleds設(shè)備添加到靜態(tài)設(shè)備 ROM。對(duì)于我之前生成的兩個(gè)比特流,我使用以下devices_manager.config 。
<config>
<bitstream name="zybo_z720_rgb-bitstream.bit">
<devices>
<device name="rgbleds" type="my_rgbleds">
<io_mem address="0x43c00000" size="0x1000"/>;
device>
devices>
bitstream>
<bitstream name="zybo_z720_gpio-bitstream.bit"/>
config>
請(qǐng)注意,我將兩個(gè) ROM(devices_manager.config和policy )打包到一個(gè)raw/zybo_gpio_demo存檔中。
pkg/drivers_fpga-zynq子系統(tǒng)最終從其文件系統(tǒng)會(huì)話中讀取用戶提供的比特流。此外,負(fù)責(zé)比特流加載的內(nèi)部fpga_drv組件從/config文件獲取其配置。因此,該文件指定應(yīng)將哪些比特流加載到 FPGA 中,例如:
<config>
<bitstream name="zybo_z720_rgb-bitstream.bit"/>
config>
通過簡(jiǎn)單地更改此文件的內(nèi)容,我們可以在比特流之間切換。至此,zybo_gpio_demo_mio組件為什么要生成狀態(tài)報(bào)告就清楚了。通過在run/zybo_gpio_demo.run腳本中添加一個(gè)ROM filter組件,我可以輕松實(shí)現(xiàn)碼流切換:
<start name="rom_filter">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="ROM"/>
provides>
<route>
<service name="ROM" label="state"> <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>
<input name="state">
<attribute name="value"/>
input>
<output node="config">
<node type="bitstream">
<if>
<has_value input="state" value="yes"/>
<then>
<attribute name="name"
value="zybo_z720_rgb-bitstream.bit"/>
then>
<else>
<attribute name="name"
value="zybo_z720_gpio-bitstream.bit"/>
else>
if>
node>
output>
config>
start>
當(dāng)然,我還需要實(shí)例化上圖中所示的所有組件。讓我們從用pkg /drivers_fpga-zynq子系統(tǒng)替換platform_drv開始:
<start name="platform_drv" caps="1000" managing_system="yes">
<binary name="init"/>
<resource name="RAM" quantum="24M"/>
<provides> <service name="Platform"/> provides>
<route>
<service name="ROM" label="config">
<parent label="drivers.config"/>
service>
<any-service> <parent/> <any-child/> any-service>
route>
start>
接下來,我添加了 Zynq 驅(qū)動(dòng)程序管理器、動(dòng)態(tài)驅(qū)動(dòng)程序子系統(tǒng)和 VFS 服務(wù)器:
<start name="zynq_driver_manager">
<resource name="RAM" quantum="2M"/>
<route>
<service name="ROM" label="devices">
<child name="report_rom"/>
service>
<any-service> <parent/> <any-child/> any-service>
route>
<config>
<driver name="zybo_gpio_demo_rgb" device="my_rgbleds">
<binary name="zybo_gpio_demo_rgb"/>
<resource name="RAM" quantum="2M"/>
driver>
config>
start>
<start name="dynamic_drivers" caps="500">
<binary name="init"/>
<resource name="RAM" quantum="5M"/>
<route>
<service name="ROM" label="config">
<child name="report_rom"/>
service>
<service name="IRQ"> <child name="zynq_pin_drv"/> service>
<any-service> <parent/> <any-child/> any-service>
route>
start>
<start name="vfs">
<resource name="RAM" quantum="8M"/>
<provides><service name="File_system"/>provides>
<route>
<service name="ROM" label="fpga.config">
<child name="rom_filter"/>
service>
<any-service> <parent/> any-service>
route>
<config>
<vfs>
<rom name="config" label="fpga.config"/>
<rom name="zybo_z720_gpio-bitstream.bit"/>
<rom name="zybo_z720_rgb-bitstream.bit"/>
vfs>
<default-policy root="/" writeable="no"/>
config>
start>
VFS 組件通過文件系統(tǒng)會(huì)話傳送由 ROM 過濾器組件生成的比特流和fpga.config ROM。
最后,我將import_from_depot
行更新如下:
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/init \
[depot_user]/pkg/drivers_fpga-zynq \
[depot_user]/src/driver_manager-zynq \
[depot_user]/src/report_rom \
[depot_user]/src/rom_filter \
[depot_user]/src/vfs \
[depot_user]/raw/zybo_gpio_demo \
[depot_user]/src/zynq_pin_drv \
[depot_user]/raw/[board]-devices
試一下修改后的運(yùn)行腳本,我得到了這個(gè)輸出:
build/arm_v7a #> make run/zybo_gpio_demo BOARD=zynq_zybo_z7 KERNEL=hw
...
[init -> report_rom] Warning: no policy defined for
label 'zynq_driver_manager -> devices'
[init -> report_rom] Warning: no valid policy for ROM request
'zynq_driver_manager -> devices'
[init -> report_rom] Warning: no policy defined for
label 'dynamic_drivers -> config'
[init -> report_rom] Warning: no valid policy for ROM request
'dynamic_drivers -> config'
[init -> report_rom] Warning: no policy defined for
label 'rom_filter -> state'
[init -> report_rom] Warning: no valid policy for ROM request
'rom_filter -> state'
...
當(dāng)然,我忘記了將策略定義添加到report_rom
配置中,因此我為每個(gè)記錄的標(biāo)簽添加了一個(gè)策略節(jié)點(diǎn):
report="zybo_gpio_demo_mio -> state"/>
label="zynq_driver_manager -> devices"/>
label="dynamic_drivers -> config"/>
運(yùn)行腳本的另一個(gè)旋轉(zhuǎn)產(chǎn)生以下輸出:
[init -> vfs] Error: ROM-session creation failed (ram_quota=6144,
cap_quota=3, label="zybo_z720_gpio-bitstream.bit")
[init -> vfs] Error: Could not open ROM session for
"zybo_z720_gpio-bitstream.bit"
[init -> vfs] Error: failed to create VFS node
[init -> vfs] Error: name="zybo_z720_gpio-bitstream.bit"
[init -> vfs] Error: ROM-session creation failed (ram_quota=6144,
cap_quota=3, label="zybo_z720_rgb-bitstream.bit")
[init -> vfs] Error: Could not open ROM session for
"zybo_z720_rgb-bitstream.bit"
[init -> vfs] Error: failed to create VFS node
[init -> vfs] Error: name="zybo_z720_rgb-bitstream.bit"
我還沒有提供比特流文件。對(duì)于一個(gè)簡(jiǎn)短的測(cè)試,我可以簡(jiǎn)單地將文件復(fù)制到build/arm_v7a/bin并將它們添加到該build_boot_image
行。然而,我想到了另一個(gè)解決方案,它使用Goa ,一個(gè)基于命令行的工作流工具,用于為 Genode OS 框架開發(fā)應(yīng)用程序。
為 Genode 構(gòu)建和打包比特流
為了以倉(cāng)庫(kù)檔案的形式提供比特流,我添加了對(duì) Goa 的 Vivado 支持。幸運(yùn)的是,Vivado 提供了以 tcl 腳本形式導(dǎo)出項(xiàng)目的命令,允許重新創(chuàng)建項(xiàng)目。在本節(jié)中,我將重點(diǎn)介紹如何使用 Goa 的 Vivado 支持。
首先,我需要導(dǎo)出要打包的 Vivado 項(xiàng)目。因此,在 Vivado 的 TCL 控制臺(tái)中,我輸入了以下命令:
write_project_tcl -paths_relative_to /home/johannes/vivado_workspace /tmp/vivado.tcl
該-paths_relative_to
參數(shù)是必不可少的,因?yàn)樗鼘⒃次募穆窂睫D(zhuǎn)換為相對(duì)路徑。在我的goa-pkgs 存儲(chǔ)庫(kù)中,我創(chuàng)建了子目錄zynq/zybo_z720_rgb-bitstream/以創(chuàng)建一個(gè)新的 Goa 項(xiàng)目并將vivado.tcl復(fù)制到新的 Goa 項(xiàng)目的src/子目錄中。通過檢查 tcl 文件,我們可以獲得所需源文件的列表。在我的 tcl 文件中,以下幾行引起了我的注意:
proc checkRequiredFiles { origin_dir} {
set status true
set files [list \
"[file normalize "$origin_dir/xilinx/project_2/project_2.srcs/constrs_1/imports/Downloads/Zybo-Z7-Master.xdc"]"\
]
foreach ifile $files {
if { ![file isfile $ifile] } {
puts " Could not find local file $ifile "
set status false
}
}
set paths [list \
"[file normalize "$origin_dir/../../[file normalize "$origin_dir/xilinx/ip_repo/rgbled_1.0"]"]"\
]
foreach ipath $paths {
if { ![file isdirectory $ipath] } {
puts " Could not access $ipath "
set status false
}
}
return $status
}
該checkRequiredFiles
過程提供了關(guān)于我必須將哪些源文件復(fù)制到我的 Goa 項(xiàng)目中的第一個(gè)提示。在這種情況下,它列出了約束文件以及我的自定義 IP 內(nèi)核的路徑。
請(qǐng)注意,Goa 會(huì)將src / 目錄中的所有文件鏡像到存檔的構(gòu)建目錄中。$origin_dir
此外,在重新創(chuàng)建 Vivado 項(xiàng)目時(shí),它將使用構(gòu)建目錄。因此,必須將所需文件及其相應(yīng)的相對(duì)路徑復(fù)制到src / 目錄中。
通過向我的 Goa 項(xiàng)目添加一個(gè)工件文件,我進(jìn)一步告訴 Goa 將什么構(gòu)建工件包含到bin//zybo_z720_rgb-bitstream存檔中。由于 Goa 將比特流寫入以模式命名的文件中.bit
,因此工件文件必須具有以下內(nèi)容:
zybo_z720_rgb-bitstream.bit
此外,由于 bin 存檔總是與特定的 CPU 體系結(jié)構(gòu)相關(guān)聯(lián),因此我arm_v7a
通過添加具有以下內(nèi)容的.goarc來設(shè)置目標(biāo)體系結(jié)構(gòu):
set arch arm_v7a
set jobs 1
請(qǐng)注意,我還將作業(yè)數(shù)限制為 1,以減少 Vivado 的資源消耗。有了這些先決條件,產(chǎn)生了以下錯(cuò)誤:goa build
goa-pkgs/zynq/zybo_z720_rgb-bitstream$ goa build
Error: tool-chain prefix is not defined
此消息暗示在 Goa 中尚無對(duì)arm_v7a的內(nèi)置支持。因此,我通過將以下行添加到.goarc文件來手動(dòng)定義工具鏈前綴:
set cross_dev_prefix "/usr/local/genode/tool/current/bin/genode-arm-"
現(xiàn)在,goa build
抱怨缺少 vivado 二進(jìn)制文件:
goa-pkgs/zynq/zybo_z720_rgb-bitstream$ goa build
...
Error: build-directory creation via vivado failed:
couldn't execute "vivado": no such file or directory
當(dāng)然,我忘記了Vivado環(huán)境的源碼。如下修復(fù)此問題后,Goa 能夠在幾分鐘內(nèi)構(gòu)建比特流:
goa-pkgs/zynq/zybo_z720_rgb-bitstream$ source /tools/Xilinx/Vivado/2021.1/settings64.sh
goa-pkgs/zynq/zybo_z720_rgb-bitstream$ goa build
...
[zybo_z720_rgb-bitstream:vivado] 10 Infos, 0 Warnings, 0 Critical Warnings and 0 Errors encountered.
[zybo_z720_rgb-bitstream:vivado] write_bitstream completed successfully
[zybo_z720_rgb-bitstream:vivado] write_bitstream: Time (s): cpu = 00:00:11 ; elapsed = 00:00:13 . Memory (MB): peak = 3202.781 ; gain = 451.625 ; free physical = 1133 ; free virtual = 2434
[zybo_z720_rgb-bitstream:vivado] INFO: [Common 17-206] Exiting Vivado at Thu Oct 6 15:35:31 2022...
構(gòu)建成功后,我準(zhǔn)備嘗試goa export –depot-user jschlatow
。輸出提醒我添加許可證和版本文件。添加這些文件后,我準(zhǔn)備導(dǎo)出和發(fā)布 depot 存檔。
使用打包的比特流
最后遺漏的一塊拼圖是將以下參數(shù)添加到run/zybo_gpio_demo.run中的import_from_depot
過程。
import_from_depot ...
jschlatow/src/zybo_z720_rgb-bitstream/2022-09-29 \
jschlatow/src/zybo_z720_gpio-bitstream/2022-09-27 \
...
現(xiàn)在,在運(yùn)行時(shí)make run/zybo_gpio_demo
,我可以使用按鈕 4 和 5 在兩個(gè)比特流之間切換。
從源代碼復(fù)制演示
要重現(xiàn)演示,您可以在 genode-zynq 存儲(chǔ)庫(kù)中找到完整的運(yùn)行腳本和源文件。我假設(shè)您已經(jīng)克隆了主 genode 存儲(chǔ)庫(kù)和 genode-zynq 存儲(chǔ)庫(kù)(請(qǐng)參閱Genode 101:Zybo Z7 入門)。這也意味著您已經(jīng)為arm_v7a創(chuàng)建了一個(gè)構(gòu)建目錄。
作為先決條件,您需要下載比特流檔案。這是通過必須從基因節(jié)點(diǎn)工作樹中運(yùn)行的以下兩個(gè)命令來實(shí)現(xiàn)的。
genode$ ./tool/depot/download jschlatow/bin/arm_v7a/zybo_z720_rgb-bitstream/2022-09-29
genode$ ./tool/depot/download jschlatow/bin/arm_v7a/zybo_z720_gpio-bitstream/2022-09-27
現(xiàn)在,您可以按如下方式執(zhí)行運(yùn)行腳本:
genode$ make -C build/arm_v7a run/zybo_gpio_demo BOARD=zynq_zybo_z7
如果您已經(jīng)按照說明進(jìn)行了 TFTP 引導(dǎo),則只需按下 Zybo 板上的重置按鈕并等待系統(tǒng)引導(dǎo)新建的映像。或者,您將之前準(zhǔn)備的 micro SD 卡的uImage文件替換為build/arm_v7a/var/run/zybo_gpio_demo/uImage。系統(tǒng)啟動(dòng)后,您可以使用按鈕 4 和 5 切換比特流。這兩個(gè)比特流都允許您使用四個(gè)開關(guān)來控制它們旁邊的 LED。然而,只有在加載zybo_z720_rgb-bitstream時(shí)才能控制 RGB LED 。按鈕 0 到 3 用于循環(huán)顯示不同的顏色和亮度設(shè)置。
- 電源設(shè)計(jì)方法-第2部分
- 使用 Zybo Z7的Genode 操作系統(tǒng)框架實(shí)現(xiàn)
- 使用Genode控制Zybo Z7 GPIO
- 使用Zio控制機(jī)械臂(第2部分)
- 電氣過應(yīng)力簡(jiǎn)介-第2部分
- 了解你的電池組:第2部分
- LDO基礎(chǔ)知識(shí):噪聲 - 第2部分
- 實(shí)時(shí)控制技術(shù)滿足實(shí)時(shí)工業(yè)通信發(fā)展的需求 —— 第2部分
- 用電信息采集系統(tǒng)型式規(guī)范第2部分 1次下載
- 用電信息采集系統(tǒng)技術(shù)規(guī)范第2部分 4次下載
- 用電信息采集系統(tǒng)檢驗(yàn)規(guī)范第2部分 0次下載
- 用電信息采集系統(tǒng)通信協(xié)議第2部分 3次下載
- 電壓基準(zhǔn)如何影響ADC性能,第2部分 10次下載
- 了解天線規(guī)格和操作,第2部分 6次下載
- 第2部分-數(shù)據(jù)模塊編碼和信息控制編碼 8次下載
- ADC數(shù)字下變頻器:抽取濾波器和ADC混疊,第2部分 2052次閱讀
- ADC眼中的虛擬評(píng)估,第2部分 822次閱讀
- 邊緣智能第1部分:邊緣節(jié)點(diǎn) 1251次閱讀
- 實(shí)時(shí)控制技術(shù)滿足實(shí)時(shí)工業(yè)通信發(fā)展的需求 —— 第2部分 1074次閱讀
- digilentPcam 5C開發(fā)板的成像模塊介紹 2690次閱讀
- digilent Zynq-7000 ARM/FPGA SoC開發(fā)板介紹 2269次閱讀
- digilentZynq-7000 ARM/FPGA SoC開發(fā)板介紹 2866次閱讀
- JESD204C入門第2部分:新特性及其內(nèi)容 6517次閱讀
- DC/DC轉(zhuǎn)換器傳導(dǎo)EMI - 第2部分,噪聲傳播和濾波 3338次閱讀
- Zybo Z7上OpenCV和SDSoC的結(jié)合 1933次閱讀
- Zybo全棧開發(fā)入門教程(基于Linux嵌入式系統(tǒng)):10個(gè)步驟自定義IP模塊 3872次閱讀
- 《振南電子STM32視頻教程》第七講:STM32的GPIO和AFIO的配置和應(yīng)用 1333次閱讀
- 無源元件并非真的“無源”:第1部分——電容 2519次閱讀
- 驅(qū)動(dòng)LED串的DCM升壓轉(zhuǎn)換器簡(jiǎn)化分析(2):實(shí)際考慮 1518次閱讀
- 混合信號(hào)系統(tǒng)接地揭秘之第二部分 1712次閱讀
下載排行
本周
- 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元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(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開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 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ì)》 溫德爾著
- 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語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論