電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Genode控制Zybo Z7 GPIO - 第2/2部分

使用Genode控制Zybo Z7 GPIO - 第2/2部分

2023-07-13 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

第一部分中,我通過(guò) GPIO 控制器啟用了對(duì)板載按鈕、開(kāi)關(guān)和 LED 的控制。在這一部分中,我將實(shí)現(xiàn)一個(gè)自定義 IP 核來(lái)控制 Zybo Z7-20 (Z7-10) 上兩個(gè)(一個(gè))RGB LED 的顏色和亮度。

在這個(gè)故事的結(jié)尾,您會(huì)找到快速設(shè)置說(shuō)明,以從源代碼存儲(chǔ)庫(kù)中復(fù)制完整的演示。

概念

RGB LED 實(shí)際上由三個(gè)單獨(dú)的 LED 組成:紅色、綠色和藍(lán)色。每種顏色都可以通過(guò)不同的引腳打開(kāi)/關(guān)閉。因此,通過(guò)改變每個(gè) LED 的亮度,我們基本上可以混合任何顏色。但是,如果我們只有一個(gè)開(kāi)/關(guān)開(kāi)關(guān),我們?nèi)绾螌?shí)際調(diào)整亮度呢?答案稱為 PWM(脈寬調(diào)制)。當(dāng)以快于大約 50Hz 的速度打開(kāi)和關(guān)閉 LED 時(shí),人眼無(wú)法檢測(cè)到任何閃爍。因此,通過(guò)改變開(kāi)啟時(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 核,以完美無(wú)缺地執(zhí)行 PWM,從而將所有 CPU 資源留給更有趣的計(jì)算。

在開(kāi)始實(shí)際實(shí)施之前,讓我說(shuō)明一下我想要實(shí)現(xiàn)的目標(biāo):

poYBAGPXaoWAfHBPAAAsxLozWl4583.png
?

該圖顯示了用于控制單個(gè) RGB LED 的 my IP 核的基本思想。Xilinx 在ug1118方面提供了更詳細(xì)的指南。

有了這些背景信息,我就能夠通過(guò)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 源文件并開(kāi)始實(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)開(kāi)/關(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 的合并更改建議解決了此問(wèn)題。端口和接口部分提供了一個(gè)類似的合并向?qū)А?/font>Vivado 自動(dòng)檢測(cè)到我之前添加的led0led1端口。本節(jié)不需要手動(dòng)調(diào)整,但我了解到我能夠定義某些類型的接口并將端口映射到這些接口。因此,人們可以將信號(hào)分組到一個(gè)共同的分組中,并協(xié)助 Vivado 的自動(dòng)連接魔法。

我跳過(guò)了接口定義,進(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)參見(jiàn)第 1 部分)。MMIO 設(shè)備的地址由 Vivado 自動(dòng)分配,但可以在打開(kāi)塊設(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組件來(lái)測(cè)試 MMIO 接口。該組件使用按鈕 0 到 3 循環(huán)顯示兩個(gè) RGB LED 的某些顏色和亮度值。您可以在genode-zynq 存儲(chǔ)庫(kù)中找到代碼。如果您遵循了第 1 部分,那么其中的大部分內(nèi)容是不言自明的。然而,讓我簡(jiǎn)要說(shuō)明如何訪問(wè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 中,可以通過(guò)寄存器框架輕松訪問(wèn) MMIO 接口。我們只需要繼承Platform::Device::Mmio(或Genode::Mmio)并定義幾個(gè)寄存器。Platform::Device::Mmio從平臺(tái)驅(qū)動(dòng)程序獲取映射的設(shè)備地址,而Genode::Mmio期望地址作為構(gòu)造函數(shù)參數(shù)。在這里,我使用后者來(lái)定義Led包含單個(gè) LED的Color和寄存器的結(jié)構(gòu)。Brightness該類的模板參數(shù)Register指定其偏移量和訪問(wèn)寬度(以位為單位)。可以輕松讀取寄存器。用模板方法編寫,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)行,我通過(guò)(臨時(shí))將以下行添加到board/zynq_zybo_z7/devices文件來(lái)讓平臺(tái)驅(qū)動(dòng)程序了解新的 MMIO 設(shè)備:

<device name="rgbleds" type="my_rgbleds">
     <io_mem address="0x43c00000" size="0x1000"/>;
 device>

為了能夠訪問(wèn)這個(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í)行比特流加載過(guò)程,以便我可以在比特流加載后自動(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 。

pYYBAGPXaoeABiuRAACUcGoY4Ks637.png
?

如上圖所示,pkg/drivers_fpga-zynq子系統(tǒng)需要兩個(gè) ROM 會(huì)話(devices_manager.configpolicy )以及一個(gè)文件系統(tǒng)會(huì)話。作為回報(bào),它通過(guò)提供平臺(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)告來(lái)確定特定設(shè)備何時(shí)可用。因此,Zynq Driver Manager 可能會(huì)生成一個(gè)新的init.config來(lái)啟動(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.configpolicy )打包到一個(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>

通過(guò)簡(jiǎn)單地更改此文件的內(nèi)容,我們可以在比特流之間切換。至此,zybo_gpio_demo_mio組件為什么要生成狀態(tài)報(bào)告就清楚了。通過(guò)在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開(kāi)始:

<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>

接下來(lái),我添加了 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 組件通過(guò)文件系統(tǒng)會(huì)話傳送由 ROM 過(guò)濾器組件生成的比特流和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"

我還沒(méi)有提供比特流文件。對(duì)于一個(gè)簡(jiǎn)短的測(cè)試,我可以簡(jiǎn)單地將文件復(fù)制到build/arm_v7a/bin并將它們添加到該build_boot_image行。然而,我想到了另一個(gè)解決方案,它使用Goa ,一個(gè)基于命令行的工作流工具,用于為 Genode OS 框架開(kāi)發(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/子目錄中。通過(guò)檢查 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ò)程提供了關(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 / 目錄中。

通過(guò)向我的 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通過(guò)添加具有以下內(nèi)容的.goarc來(lái)設(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 中尚無(wú)對(duì)arm_v7a的內(nèi)置支持。因此,我通過(guò)將以下行添加到.goarc文件來(lái)手動(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ù)此問(wèn)題后,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過(guò)程。

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)建目錄。

作為先決條件,您需要下載比特流檔案。這是通過(guò)必須從基因節(jié)點(diǎn)工作樹(shù)中運(yùn)行的以下兩個(gè)命令來(lái)實(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)按照說(shuō)明進(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è)開(kāi)關(guān)來(lái)控制它們旁邊的 LED。然而,只有在加載zybo_z720_rgb-bitstream時(shí)才能控制 RGB LED 按鈕 0 到 3 用于循環(huán)顯示不同的顏色和亮度設(shè)置。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)