【SoC FPGA學習】八、從零開始體驗一把為 HPS 添加外設,以 UART 外設為例

      網友投稿 1469 2025-03-31

      在本系列教程中 《【SoC FPGA學習】二、SoC FPGA硬件初探,基礎掃盲 》一節中的2.5小結簡單介紹了一下 SOC FPGA添加timer外設的方法,但是此外設并沒有實際的引出腳,并且在那篇文章的介紹中也并沒有實際的跑進來timer,這一節我們就拿UART外設為例,從來開始了解添加 SOC FPGA 外設并使用起來的全部流程!


      本節將通過完全手把手的形式介紹如何修改AC501_SoC_GHRD工程文件,通過在 Platform Designer(原 Qsys)加一個 Altera UART 外設到 HPS 的輕量級FPGA 到 HPS 橋(fpga2hps_lw_bridge),然后更新到 Quartus 工程中, 再重新編譯生成 HPS 啟動的 U-Boot 鏡像文件和 Preloader 鏡像文件并更新到 AC501_SoC的啟動 SD 卡中。 接下來,針對重新生成的包含了有 Altera UART 外設的 HPS系統,編譯得到新的 dts 文件和 dtb 文件, 最后將 dtb 文件拷貝到 AC501_SoC開發板的 Linux 系統 SD 卡中, 以使 Linux 系統能夠獲取新增加的 Altera UART外設。

      注:上述的“重新編譯生成 HPS 啟動的 U-Boot 鏡像文件和 Preloader 鏡像文件并更新到 AC501_SoC的啟動 SD 卡中”這一步可以不做,因為我們不需要在u-boot啟動的時候就加載我們添加的外設IP,所以這一步我們可以不做。【只要我們不改Platform Designer中HPS組件的參數,我們就需要重新編譯U-Boot和Preloader,使用之前的即可!】

      本節雖是以 AC501-SoC 開發板為例進行介紹,但是由于該例子十分通用,對于其他 Cyclone V SoC 開發板的操作也都是一樣的, 讀者根據此例子講解的方法,針對其他的硬件板卡所提供的 GHRD 工程,進行類似的實驗。

      一、修改 GHRD 工程

      本小節講述如何在提供的 AC501-SoC 開發板黃金硬件參考設計工程中添加一個 UART IP 并最終在 Quartus 中編譯得到 sof 格式的 FPGA 編程文件。

      1.1、打開 GHRD 工程

      AC501-SoC 開發板的配套光盤中提供了一個名為 AC501_SoC 的工程, 該工程為廠家設計的一個包含了開發板上各種外設的參考工程,我們可以使用該工程進行修改,以滿足客戶定制需求。在光盤AC501_SoC_CD_Files\Demos\SOC_FPGA\Quartus 中,包含了該設計文件, 拷貝該文件到磁盤中,例如 D:\fpga\soc_system\examples, 然后雙擊AC501_SoC_GHRD.qpf, 使用高于 Quartus 14.0 的版本打開,本文使用 QuartusPrime 17.1 版本,單擊圖標打開 Platform Designer 工具。然后在彈出的文件打開窗口中選擇 soc_system.qsys 文件并打開。 這里需要說明的是,從Quartus Prime 17.1 開始, Intel 使用 Platform Designer 一名代替之前版本軟件中的 Qsys 名稱。 而實際從廠家的說法可知,兩者并未有實質性的更改,只是改個名而已,因此無需介意。

      1.2、添加 UART IP

      從 Platform Designer 左側的 IP_Catalog 中搜索到 UART(RS-232 Serial Port)并雙擊添加, 各項參數默認即可,如下圖所示。

      UART(RS-232 Serial Port)屬于性能比較低的IP核,而Altera 16550 Compatible UART 是性能比較高的UART IP核,但是它需要License證書,要想使用性能較高到Opencore網站搜索兼容16550的 UART IP核,這樣既可以繞過證書,也可以使用到性能比較高的IP核。

      注意,這里我勾選了Fixed baud rate,表示使用的是固定的115200的波特率進行通信,這里可以不勾選,就可以通過修改寄存器的方式切換波特率。

      重點在于 UART IP 核的各個信號在 Platform Designer 中的連接。由于在 AC501_SoC_GHRD 工程中原本已經添加好了一個 UART IP 并命名為了 uart_0, 所以這里添加新的 UART IP 時軟件會自動將其命名為 uart_1。

      UART IP 提供一個 Avalon Memory Mapped Slave(以下簡稱 Avalon MM Slave)總線與主機相連。要想能夠對其寄存器進行讀寫操作,則需要一個帶Avalon Memory Mapped Master(以下簡稱 Avalon MM Master) 總線的外設實現。 在以 NIOS II 為核心的 SOPC 技術中, NIOS II CPU 是一個標準的 Avalon Memory Mapped 主機, 能夠實現對各種 Avalon Memory Mapped Slave 的外設的讀寫操作。因此使用時一般直接將 UART IP 的 Avalon MM Slave 端口連接到NIOS II 的 Avalon MM Master 端口上。

      1.3、關于 HPS 與 FPGA 數據交互

      在含有 HPS 的 SOC 系統中,由于 HPS 中的 ARM Cortex-A9 使用的是 AXI 總線協議, 其提供的與 FPGA 通信總線也是 AXI 總線, AXI 總線和 Avalon Memory Mapped 總線在信號類型和時序上都有一定的差別,無法直接連接。HPS 針對和 FPGA 的互聯通信,總共提供了 3 種形式的 AXI 總線:

      用于FPGA 主動向 HPS 發起高效數據傳輸操作的 F2H_AXI_Slave 總線

      用于 HPS主動向 FPGA 發起高效數據傳輸操作的 H2F_AXI_Master 總線

      用于 HPS主動向 FPGA 發起一些控制或小容量數據傳輸操作的 H2F_LW_AXI_Master 總線

      H2F 和 F2H 兩個高速橋,每個橋最高支持 128-bit 位寬。在 HPS 側邏輯中, 每個橋最高可運行在 200M 的時鐘頻率下, 數據位寬為固定的 64bit,因此在不考慮輕量級橋的情況下, FPGA 和 HPS 的總通信帶寬為642200MHz=25600Mbps ,另外, Intel Cyclone V SoC FPGA 還提供了一個FPGA 到 SDRAM 的橋, 該橋最高可提供 4 個獨立的讀寫端口和 6 個控制端口, 支持可配置的 32 位、 64 位、 128 位和 256 位的數據位寬, 適合于 FPGA 共享使用 HPS 側的高性能存儲器的應用。

      為了支持 Platform Designer 中提供的所有使用 Avalon Memory Mapped 總線的 IP 能夠方便的連接到 HPS 上, Platform Designer 具有 Avalon 和 AXI 總線間的自動轉換功能,我們在設計時,只需要將 Avalon Memory Mapped 總線信號連接到 AXI 信號總線上即可。至于如何完成兩者間的信號功能和時序的轉換,用戶無需關心, Platform Designer 會自動生成相應的轉換邏輯。 這對于一些已經使用 NIOS II CPU 開發了相應的系統和自定義 IP 的用戶來說,是一件非常方便的事情,用戶可以直接在 HPS 中按照原本 NIOS II 中的系統架構添加 IP 并連接好總線,就能實現相同的功能,同時,對于用戶自己開發的自定義 IP,無需做任何修改就能直接用于 SOC 系統中,大大降低了系統移植的工作量。連接效果,如下圖所示。

      1.4、連接 UART IP 信號端口

      這樣一來我們將 UART IP 連接到 HPS 上就方便多了,我們只需要將 UART IP 的 Avalon MM Slave 總線端口連接到 HPS 的 H2F_LW_AXI_Master 總線上即可。

      那么為什么選擇將 UART 的 Avalon MM Slave 端 口連接到H2F_LW_AXI_Master 總線,而不是 H2F_AXI_Master 總線上呢? 這是因為 UART IP 是一個數據吞吐量非常小的設備,其最高通信波特率為 115200bps, 如此低的波特率,自然沒有必要連接到專為數據高速高效傳輸設計的 H2F_AXI_Master 總線上。另外, 使 UART IP 連接到 H2F_LW_AXI_Master 總線,并使用較低的時鐘頻率進行通信, 也更利于軟件在對 FPGA 邏輯進行布局布線時進行合理時序優化, 使其他需要運行在較高時鐘頻率的邏輯能夠獲得更好的時序優化,從而提高系統性能。

      同時,為了保證 UART IP 和 H2F_LW_AXI_Master 處于相同的時鐘域,將UART IP 的 clk 端口連接到和 HPS 的 H2F_LW_AXI_Clock 端口相同的時鐘源上,在 Platform Designer 中可以看到, H2F_LW_AXI_Clock 端口是連接到了clk_0 這個時鐘輸入模塊的 clk 信號上, 因此 UART IP 的 clk 端口也連接到時鐘輸入模塊的 clk 信號上,如下圖所示。

      uart IP核的clk信號要與h2f_lw_axi_master的clk信號一致。(復位也一樣?。?/p>

      接著連接復位信號,這里直接連到了clk_0這個IP核的clk_reset,如下圖

      UART IP 的 external_connection 端口是需要分配到芯片的物理管腳上與其他的 UART 控制器進行通信的,包含了 uart_tx 和 uart_rx 兩個信號, 因此這個端口需要直接導出。 在 export 一欄直接雙擊該信號即可導出,為了便于識別,將導出名修改為 uart_1,如下圖所示。

      UART IP 的 irq 端口可以向中斷接收器發出中斷請求信號, HPS 中每個ARM 核支持一個最高可支持 32 個外部中斷數量的中斷控制器,中斷控制器的外部中斷端口名為 f2h_irq, 雙核的 HPS 支持 f2h_irq0 和 f2h_irq1,本例中只需要連接到 f2h_irq0 即可,如下圖所示

      上面說了這么多,只是為了讓讀者能夠更加明白每個端口或網絡連接的原理,以便于能夠舉一反三,掌握其他類似 IP 核的添加和使用方式。實際上, 如果是初次接觸的話,只需要參考這個工程中提供的 uart_0 核的所有信號連接方式即可。 因為兩個 IP 的端口基本相同,因此將兩個核相同屬性的端口連接到同一個信號網絡上, 即可完成 UART IP 的添加。 在后續的使用中,如果讀者希望自己添加 PIO 核、 SPI 核、 IIC 核等,都可以參照本節的方式進行。

      1.5、分配組件基地址

      完成了 UART 的添加之后, 可以看到在 Platform Designer 下方的信息窗口中有報錯信息, 提示 UART IP 的地址范圍和其他設備沖突, 如下圖所示。

      這里我們可以手動調整 UART 的地址范圍,也可以直接使用 Platform Designer 提供的自動分配基地址的方式來解決這個問題。如果使用自動分配基地址的方式,需要注意的是,有可能會更改之前已經添加好的 IP 的基地址,而基地址改變之后,會影響已有的軟件程序的正常運行,因此,為了保證添加新的外設之后, 為之前的系統設計的軟件程序還能夠正常運行,建議在自動分配基地址之前先將所有原有 IP 的基地址鎖定。鎖定的方式非常簡單, 在每個 IP 的基地址一欄的具體地址前面,都有一個“鎖”型的標志,默認是打開的,點擊下即可鎖閉, 如下圖所示。一旦鎖閉,當執行自動分配基地址操作時,這些設備的基地址會保持原值不變。

      而后,只需要在 Platform Designer 菜單欄中點擊 System —> Assign Base Addresses即可自動分配基地址, 如下圖所示。

      再看qsys界面的下方或者Messages一欄,就顯示 0 Error了,最后ctrl + s進行保存。

      至此, 在 Platform Designer 中完成了給 HPS 添加 UART IP 的操作,接下來,我們將進行新系統的 HDL 代碼的生成。

      1.6、生成Qsys系統的HDL文件

      在 Platform Designer 菜單欄中點擊 Generate -> Generate HDL…, 然后在彈出的窗口中點擊 generate 按鈕即可開始 HDL 代碼的生成, 如下圖所示。 如果系統沒有保存,軟件會先進行系統的存檔,系統存檔完成后, 點擊信息框中的close 即可開始真正的 HDL 代碼的生成過程。該過程耗時大概 1~3 分鐘, 具體耗時長度根據使用者的 PC 性能會有所差異。

      生成HDL文件中…

      生成完畢后,點擊Close即可。

      1.7、添加uart_1的端口到Quartus工程中

      完成 HDL 代碼的生成之后,我們暫時還不能關閉 Platform Designer,還有最后一個步驟,就是從 Platform Designer 的系統例化模板中復制出新增加的端口信號,添加到 Quartus 工程中的例化部分。 同樣是在 Platform Designer 菜單欄中點擊 Generate -> Show Instantiation Template, 打開系統例化模板, 如下圖所示。

      在模板中可以看到,最下方有我們新添加的 UART IP 的兩個信號uart_1_txd 和 uart_1_rxd, 使用鼠標左鍵拖動以選中這兩個信號,右擊復制這兩個信號內容, 如下圖所示。

      打開 Quartus 工程的頂層文件 AC501_SoC_GHRD.v文件,附加到 soc_system 模塊例化的尾部,并修改這兩個信號的例化名為uart_1_txd 和 uart_1_rxd。如下圖所示。

      這里補充一個 quartus的一個小技巧,將.v文件獨立出來(回去):

      注意, Verilog 例化一個模塊時, 該模塊的最后一個信號末尾是不帶”,”的。上圖中,最后一個信號為 i2c_0_sda_pad_io, 其末尾是不帶有”,”的,在添加新的模塊的信號到模塊末尾時,記得先對原本模塊的最后一個信號的模塊補上”,”, 否則編譯會報錯。

      另外,需要將更改為fpga_uart_1_rxd,將更改為fpga_uart_1_txd,最后效果圖,如下圖所示。

      最后ctrl+s進行保存。至此, Platform Designer 的任務就完成了, 可以關閉 Platform Designer, 然后回到 Quartus 軟件中,完成 uart 功能的引腳添加和分配。關閉Platform Designer會彈出如下窗口,點擊close即可。

      在 AC501_SoC_GHRD.v 文件的端口列表中, 添加兩個端口描述

      input wire fpga_uart_1_rxd, output wire fpga_uart_1_txd,

      1

      2

      修改好的端口列表如下圖所示:

      最后ctrl+s進行保存!

      1.8、分配 FPGA 管腳

      保存 AC501_SoC_GHRD.v 文件,使用快捷鍵ctrl+k或者單擊工具欄的

      就可以對工程進行分析和綜合 了,如果分析和綜合的過程中檢查出有語法錯誤,需要自行檢查改正, 然后重新分析和綜合。 下圖是分析綜合成功后的樣子。

      注意,分析綜合所用時間可以在quartus的右下角看到。

      分析和綜合完成以后, 單擊工具欄的

      就可以打開Pin Planner,然后可以看到 fpga_uart_1_txd 和 fpga_uart_1_rxd 兩個端口了,如下圖所示。

      修改電平標準(I/OStandard)為 3.3-V TTL, 再將這兩個信號分別映射到 FPGA 的 PIN_W18 和PIN_AB19 引腳上, 即實際對應到 GPIO0 接口上的 FPGA_GPIO0_D8 和FPGA_GPIO0_D9。 如下圖所示:

      我是怎么知道對應到 GPIO0 哪個接口的呢?在《用戶手冊》中,查找GPIO管腳分配表:

      如何確定對應的電平是什么?

      在管腳分配界面中,一種顏色代表了一種IO BANK。一種IO BANK 里面的電平需要設置成一樣的,不然編譯會報錯。

      電平的賦值支持 ctrl+c ctrl+v的快捷操作

      引腳分配完畢后,進行全編譯,生成 .sof編程文件,具體操作點擊工具欄如下圖所示按鈕。

      全編譯完成后…

      至此,我們就完成了在 Platform Designer(原 Qsys)加一個 Altera UART外設到 HPS 的輕量級 FPGA 到 HPS 橋(fpga2hps_lw_bridge),然后更新到Quartus 工程的工作。

      一種節約時間的方法:

      在上述步驟中,我們要完成引腳分配,必須要先對設計進行分析和綜合。由于 Quartus 軟件對該工程的綜合大概需要耗費 2~5 分鐘左右的樣子, 而分配完引腳后,還需要再全編譯一次才能生成 sof 編程文件。 全編譯又會重新執行分析和綜合的過程, 因此會導致實際執行了兩次分析和綜合的過程, 浪費時間。 為了節約時間,在對工程改動不大,或者添加的信號不多的情況下, 我們可以跳過分析和綜合這一步, 手動添加引腳和對應的管腳信息,添加完成后再全編譯, 這樣可以節約較多的時間。

      由于沒有經過分析和綜合, 軟件無法分析出系統中有那些端口, 所以在 PinPlanner 中是不會展示這些信號的,此時設計者可以手動輸入信號名來完成信號的添加。 同樣還是打開 Pin Planner, 拖動右側的滑動條到最下方, 雙擊<>進入編輯狀態,手動輸入需要增加的信號名稱 fpga_uart_1_txd 和fpga_uart_1_rxd, 然后再修改 I/O Standard 為 3.3-V TTL,在 Location 一欄輸入正確的管腳信息。 如下圖所示:

      1.9、生成配置數據二進制文件(rbf)

      rbf 文件是 Quartus 編譯生成的 fpga 配置文件的二進制數據量格式的文件,主要用于使用外部主機通過 PS 方式配置 FPGA。在含 ARM 硬核的 SoC FPGA 中,可以使用 HPS 配置 FPGA,配置時分為兩種情況:

      1、在 HPS 處于 uboot 啟動階段時通過 u-boot 配置

      2、Linux 啟動之后通過應用程序配置

      這兩種配置方式都需要用到 rbf 格式的配置文件,但是兩種方式所需的 rbf 格式的配置文件卻又存在著差異,其中 uboot 階段配置 fpga 需要使用未經壓縮的 rbf 格式文件,而在 Linux 應用程序中配置fpga 時,需要使用經過壓縮了的 rbf 文件。默認情況下, Quartus 軟件不能自動生成 rbf 文件,需要在設置種開啟生成 rbf (經過壓縮)文件選項。另外,也可以直接通過命令行的方式,從 quartus 編譯得到的 sof 文件轉換得到 rbf (未經壓縮)文件。本節我們將使用命令行的方式生成未經壓縮的rbf文件!

      【SoC FPGA學習】八、從零開始體驗一把為 HPS 添加外設,以 UART 外設為例

      Quartus 工程編譯好之后,要想能夠將對應的編程信息配置到 FPGA 中,有3 種方法

      1、使用 JTAG 直接下載 sof 文件

      2、將 sof 文件轉換為 jic 文件,燒寫到 EPCS 中,然后設置 FPGA 從 EPCS 中啟動

      3、將編程文件(.sof)轉換為二進制數據流文件(.rbf), 然后放置在 SoC 的啟動鏡像 SD 卡中,在 Uboot 啟動階段將其配置到 FPGA 中。

      關于使用 JTAG 下載 sof 文件和 jic 文件的操作方法,可以參考本系列《SoC FPGA 開發板的 FPGA 配置數據下載和固化》章節的內容。這里我們選擇第三種:

      在 AC501_SoC_GHRD 工程中,提供了一個名為“sof_to_rbf.bat”的腳本文件,存放于 AC501_SoC_GHRD\output_files 目錄下。 使用時,僅需雙擊該文件,即可自動運行并生成名為 soc_system.rbf 的文件,雙擊后如下圖所示。生成的soc_system.rbf 在后續啟動 FPGA 時會用到。

      二、制作 Preloader Image(可選)

      再次提醒:只要我們不改Platform Designer中HPS組件的參數,這一步可以不做,因為我們不需要在u-boot啟動的時候就加載我們添加的外設IP。

      按照正常的流程,接下來我們需要先對 Quartus 工程進行一次全編譯, 在全編譯完成后,軟件會生成 .sof 編程文件以及用于產生 U-Boot 和 Preloader 的配置文件 hps_isw_handoff, 在進行軟件設計時,這些文件可以通過 BSP Editor轉換成 Preloader 需要的輸入文件, 以進一步生成 Image 文件。 下圖所示的是 PreloaderImage 制作流程。

      2.1、打開 SoC EDS 工具

      從 Windows 的開始菜單,程序列表中找到 SoC EDS Command Shell, 點擊打開。 如下圖所示:

      這是一個命令行形式的工具, 該工具非常類似于 Windows 系統的 cmd 命令行窗口和 Linux 系統的終端窗口, 在這個窗口中,我們通過輸入不同的命令就可以使用不同的工具完成相應的操作。 由于該工具中的命令與 Linux 系統中的命令基本一致,因此這里不再贅述。

      2.2、生成 bsp 文件

      要編譯 U-Boot 和 Preloader,需要先使用 bsp-editer 工具創建相關的源碼檔案, 在打開的 SoC EDS Command Shell 中,輸入命令 bsp-editor 即可打開 BSP編輯工具, 如下圖所示:

      正在打開 bsp-editor 界面

      打開完成后,選擇菜單 File --> New HPS BSP 來創建新的 BSP , 如下圖所示:

      然后設定 Preloader Setting Directory 的路徑。 在 New BSP 的窗口下選擇Preloader Setting Directory 的路徑,把路徑指向 Quartus 工程下的hps_isw_handoff\soc_system_hps_0 目錄, 即C:\Users\wangxubo\Desktop\AC501_SoC_GHRD\hps_isw_handoff\soc_system_hps_0, 如下圖所示:

      打開之后,其他設置不用更改,直接點擊 OK 來生成 BSP setting 文檔以及文件夾,系統將在工程內產生一個 software 的文件夾,并生成一個 settings.bsp文檔,如下圖所示:

      若中途出現下圖所示的是否要覆蓋存在的BSP目標目錄,選擇OK即可。

      接下來在BSP Editor窗口點擊 Generate 生成 preloader 的原始檔以及 Makefile。當生成檔案完成后,按下 Exit 按鈕完成任務離開窗口。如下圖所示:

      進入C:\Users\wangxubo\Desktop\AC501_SoC_GHRD\software\spl_bsp\generated 文件夾并查看產生的文檔。可以看到之前在 Platform Designer 中有關 HPS 的相關設定已經轉換成.h 頭文件以配置preloader source code 對應設置。如下圖所示:

      以 pinmux_config.h 為例,可以看到 HPS 的外設的配置使用情況,其中“ (1) ”代表該外設被使用,如下圖所示:

      2.3、編譯 preloader 和 uboot

      有了這些,就可以編譯 U-Boot 和 Preloader 了。 回到 SoC EDS CommandShell 中, 使用 cd 命令將路徑切換到 Quartus 工程目錄下,例如本例的工程目錄為 C:\Users\wangxubo\Desktop\AC501_SoC_GHRD, 只需要輸入命令(注意路徑的斜線方向變了):

      cd c:/users/wangxubo/Desktop/AC501_SoC_GHRD

      1

      然后使用 make uboot 命令, 就可以把 preloader 和 uboot 文件都編譯出來。如果只需要編譯 preloader,就使用 make prelaoder 好了。由于會重新編譯一遍硬件工程,整個過程會比較漫長, 視用戶的 PC 機性能,可能為 5~20 分鐘左右。

      編譯完成后在 software\preloader\uboot-socfpga 目錄下會找到 u-boot.img 文件,在 software\preloader\uboot-socfpga\spl 下會找到 u-boot-spl.bin。 如下圖所示。

      將 u-boot- spl.bin 文件復制,粘貼到向上兩層的 preloader 目錄中,替換原來的文件

      然后在SoC EDS Command Shell 中, 使用 cd 命令將目錄定位到此路徑, 可以直接使用以下命令實現:

      cd software/preloader

      1

      u-boot-spl.bin 為 binary 格式的文件,按照 Altera 的要求要按照特定格式添加文件頭!需要使用到的工具為 mkpimage 工具。在 software/preloader 目錄下, 使用 mkpimage 命令即可完成該操作,具體命令內容如下所示:

      mkpimage –hv 0 -o preloader.img u-boot-spl.bin

      1

      執行很快就完成,完成之后文件夾下會產生一個 preloader.img 文件, 如下圖所示。 該文件即可以用于更新 SD image 中的 preloader。

      2.4、更新 preloader 和 uboot

      我們也可以同時更新 u-boot.img 文件和 preloader.img 文件 。 將software\preloader\uboot-socfpga 目錄下生成的 u-boot.img 文件也拷貝到software\preloader 中(直接替換舊的), 如下圖所示。

      然后使用 SoC EDS 中的工具 alt-boot-diskutil.exe 來完成 preloader 和 u-boot 鏡像到 SD 卡的更新。請首先將 AC501-SoC 開發板的啟動 SD 卡使用讀卡器插接到 PC 機上,并確定其在電腦中的盤符,例如筆者的電腦上 SD 卡被識別為了 I 盤, 下圖所示。

      然后輸入下列命令以完成 preloader 和 u-boot 鏡像的更新(命令中最后一個表示盤符)

      【注意這一步要重新開一個SOC EDS COMMAND SHELL,以管理員方式運行,不然會出現device open failed的情況】

      alt-boot-disk-util -p preloader.img -b u-boot.img -a write -d I

      1

      執行成功后, 可以看到 Altera Boot Disk Utility was successful 的字樣, 如下圖所示,表明更新成功。

      2.5、使用新的 Uboot 啟動 SoC

      更新成功后, 將 SD 卡從電腦彈出,然后插入到 AC501-SoC 開發板上, 給開發板上電,在串口終端上可以看到系統啟動并打印一系列的信息。其中第一行就是 U-Boot 的相關信息,可以看到,使用的 U-Boot 版本為 2013.01.01 版本,編譯時間為 Aug 27 2020 - 15:36:46。 與我們的操作時間一致,因此可以判定 U-Boot 更新成功。

      之前的uboot啟動,如下圖

      三、制作設備樹

      本小節介紹如何針對修改后的 Qsys 系統制作支持 Linux 系統啟動并自動識別硬件的設備樹文件。

      3.1、設備樹制作流程

      設備樹(Device Tree) 是一種有關硬件系統描述的數據結構,它可以描述整個系統上掛載了多少種類的硬件。通過 device tree 系統上的硬件信息都可以傳遞給 OS (linux)。如此便可以不用在 Kernel 內放置大量的冗長的代碼。這樣的特性對于硬件里面有 FPGA 的情況下提供了很大的彈性與靈活性。 IntelSoC FPGA Design 產生 Device Tree 的流程如下圖所示。

      當 Platform Designer 產生出 FPGA 的設計后 (.sopcinfo),可以使用 IntelSoC EDS 工具里的 Device Tree Generator 來產生 Device Tree 的源文檔(dts)。它描述了有關 HPS 的外設還有選擇使用到的 FPGA Soft IP 以及用戶自定義的外設等信息。 .dtb 文件是.dts 文件被 Device Tree Compiler 編譯后生成的二進制格式的 Device Tree 描述,可被 Linux 內核解析。通常在我們為開發板制作 NAND、 Sdcard 啟動 image 時,會為.dtb 文件預留一個很小的存放區域(FAT 分區)。之后 bootloader 在引導 kernel 的過程中,會先讀取該.dtb 到內存。更多關于 Device Tree 的介紹可以參考下面的鏈接:

      https://rocketboards.org/foswiki/Documentation/GSRDDeviceTreeGenerator

      3.2、準備所需文件

      生產 dts 和 dtb 的操作很簡單, Intel SoC EDS 工具里提供有完整的工具鏈,我們在生成時,只需要執行“make dts”和“make dtb”命令即可實現。 需要注意的是,生成 dts 文件需要有另外兩個描述芯片和板級硬件的文件支持,在早期的 Quartus13.1 版本中,使用的是 hps_clock_info.xml 和 soc_system_board_info.xml 兩個文件 , 不過到了 Quartus 14.0 版本 , 這兩個文件就改變了, 不再使用 hps_clock_info.xml 文件, 而是以 hps_common_board_info.xml 文件代替。 在從Quartus 軟件安裝目錄下的\embedded\examples\hardware\cv_soc_devkit_ghrd 目錄下, 提供了這兩個文件,不過這兩個文件的內容是針對 Intel 官方出品的 SoC 板卡編寫的, 里面包含了眾多的硬件信息,并不完全適用于其他的板卡, 為此,AC501-SoC 開發板同樣也提供了這兩個文件。 AC501_SoC 開發板提供的這兩個文件是通過修改官方板卡提供的文件的內容得到的,一些廠家板卡中有的內容,而 AC501-SoC 開發板上沒有的資源,修改時選擇了保留,方便用戶根據該文件學習 xml 文件的編寫方法, 理解 xml 文件和 dts 文件內容的對應關系。 由于這些資源在 AC501-SoC 板卡上沒有實際的硬件支撐,所以操作系統啟動時這些資源也不會得到有效的使用, 對系統的運行沒有任何影響。

      檢查工程目錄下是否有 Platform Designer 生成的 soc_system.sopcinfo 文件。 Device Tree Generate 將使用這 3 個文件來產生出.dts 文件。如下圖所示:

      3.3、生成 dts 文件

      回到 SoC EDS Command Shell 窗口中, 將路徑切換到 Quartus工程根目錄下。 如果是接著上述更新 U-Boot.img 文件到 SD 卡的操作的,只需要執行“cd …/…/”即可回到工程目錄下,如下圖所示。

      輸入以下命令以產生.dts 文件

      make dts

      1

      編譯會報 8 個信息:

      第一個是提示 alt_vip_itc 模塊類型未知,由于 alt_vip_itc 核是一個單純的將framereader 讀取到的數據打包成 VGA 時序的 IP 核,其本身并不需要受 HPS 控制,因此其 dts 信息是否正確并不影響 HPS 上操作系統的啟動和運行。

      第 2、 3、 4個信息是提示 oc_iic 核的類型未知,而 oc_iic 核是我們添加的一個第三方 I2C 控制器,雖然該控制器在 Linux 系統中也已經有了驅動支持,但是由于該 IP 核的腳本信息中沒有提供相應的匹配Linux 驅動的信息, 因此使用此種方式生成的 dts 文件也并不包含該 I2C 控制器的信息。 此種情況的直接影響就是 Linux 系統在啟動時無法識別該控制器(在 /dev 目錄下沒有我們添加的i2c設備),也就無法自動添加其驅動程序, 并不影響系統的正常啟動和運行。 如果希望Linux 系統在啟動時能夠自動加載該控制器的驅動,需要手動修改生成的 dts 文件,該部分內容將在講解 dts 文件時候講解。

      后四個信息是xml 文件不對(hps_common_board_info.xml、soc_system_board_info.xml),在hps_common_board_info.xml中搜索第5個信息對應的height,會看到如下圖所示信息,也就剛好對應了第5、6、7、8信息,描述了官方開發板上的LCD顯示屏的相關信息。當然還需要知道小梅哥的這個也是在官方原版的xml文件上修改的,我們可以查看官方原版的xml文件,其路徑在quartus的安裝目錄下,我的路徑為:D:\intelFPGA\17.1\embedded\examples\hardware\cv_soc_devkit_ghrd\hps_common_board_info.xml。這里既然沒用,我們可以直接刪除!

      再次make dts,效果如下圖

      多了幾個無用的信息而已,對于我們初學者不懂的話沒必要管,不影響下一步。

      在 Windows 中打開工程文件夾,可以看到.dts 文件已經被生成,如下圖所示:

      這里我們簡單的介紹下,soc_system.dts文件,也可直接跳過,繼續下面操作:

      重點關注其中的 sopc0 節點,這是一個大節點,包括了利用Platform Designer添加的軟IP,也包括了HPS本身的硬IP。

      其下的子節點:hps_0_bridges,是我們在FPGA側添加的外設。

      3.4、生成 dtb 文件

      接著輸入下述命令產生 .dtb 文件:

      make dtb

      1

      注:拷貝到SD卡的時候,需要將soc_system.dtb名字更改為socfpga.dtb

      由于 dtb 文件中包含的信息是與一個具體的 Quartus 工程對應的, 在啟動時, Linux 操作系統會根據 dtb 文件中的硬件描述去初始化 FPGA 側添加的各種IP,因此 Linux 能夠正常初始化 FPGA 側外設的前提是 FPGA 中已經正常配置了這些 IP。 FPGA 在上電時,根據加載設置引腳的狀態,可以從外部 EPCS 存儲器或者由 HPS 的 FPGA 管理器加載配置文件。當使用 HPS 的 FPGA 管理器加載配置文件時,默認使用的是名為 soc_system.rbf 的二進制文件。

      3.5、運行修改后的工程

      生成好 dtb 文件之后,就可以將其更新到開發板的啟動 SD 卡中了。 將開發板的 SD 卡使用讀卡器連接到 PC 機上, 打開 SD 卡盤符,可以看到里面已經有4 個文件, 如下圖所示。 其中, zImage 是 Linux 內核文件, soc_system.rbf 為FPGA 的配置文件,以支持 HPS 配置 FPGA。 socfpga.dtb 則是設備樹文件,系統啟動的時候,默認識別的設備樹名稱就為 socfpga.dtb, 因此,我們將上面生成的 socfpga.dtb 拷貝到 SD 卡中替換原本存在的 socfpga.dtb。 同時,將修改GHRD 工程后生成得到的 soc_system.rbf 文件也拷貝到 SD 卡中替換原本存在的soc_system.rbf 文件。

      提醒一下:soc_system.rbf 存放于 AC501_SoC_GHRD\output_files 目錄

      替換完成后,如下圖所示:

      而后將 SD 卡安全彈出。插入開發板中, 給開發板上電,在串口終端中可以看到,系統開始啟動。 在打印的眾多啟動信息中,可以看到如下圖所示兩條內容:

      由于我們 AC501_SoC 提供的 SD 卡鏡像中包含的 Linux 內核已經開啟了對Altera UART 的驅動支持,因此 Linux 系統啟動時,通過讀取 dtb 文件中的信息, 已經自動識別到了 FPGA 側添加的兩個 UART 控制器, 并將其分別命名為了 ttyAL0 和 ttyAL1。

      在系統啟動完畢之后,輸入 root 用戶名以登錄系統,然后輸入 ls /dev 命令,可以查看系統中已有的設備, 同樣可以看到名為 ttyAL0 和 ttyAL1 的兩個設備。

      小知識點:這里的AL的含義就指的是ALTER

      之前的/dev目錄如下圖

      至此,我們在 Platform Designer 中為 HPS 添加的 UART 串口就已經成為了Linux 系統中的標準 tty 外設,用戶就可以編寫簡單的 tty 應用程序來使用該串口了。

      下一節,我們來編寫uart_1的應用程序,這一節太長了,結束了結束了。哈哈…

      FPGA Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:IF函數使用技巧大全
      下一篇:excel考勤表(excel考勤表制作教程詳細)
      相關文章
      亚洲av无码电影网| 亚洲色图视频在线观看| 亚洲色欲色欲www| 亚洲日本va午夜中文字幕一区| 亚洲福利中文字幕在线网址| 337P日本欧洲亚洲大胆精品| 亚洲av无码成人精品区一本二本| 亚洲欧美日韩中文无线码| 亚洲国产高清国产拍精品| 亚洲欧美日韩中文无线码 | 久久久久亚洲AV成人无码网站| 亚洲午夜国产精品无码老牛影视 | 亚洲国产综合第一精品小说| 亚洲熟妇av一区| 亚洲免费人成视频观看| 久久精品亚洲AV久久久无码| 亚洲av无码一区二区三区观看| ww亚洲ww在线观看国产| 亚洲欧洲无码一区二区三区| 亚洲a无码综合a国产av中文| 亚洲av无码乱码在线观看野外| 亚洲精品无码成人片在线观看 | 亚洲区小说区图片区QVOD| 亚洲男同帅GAY片在线观看| 久久亚洲精品成人| 91亚洲va在线天线va天堂va国产| 亚洲视频一区网站| 亚洲依依成人精品| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲av无码一区二区三区人妖| 小说区亚洲自拍另类| 亚洲精品国产精品国自产观看 | 亚洲人成网网址在线看| 亚洲色精品三区二区一区| 色偷偷亚洲男人天堂| 2022中文字字幕久亚洲| 亚洲色欲久久久综合网| 亚洲国产精品线在线观看| 亚洲性色成人av天堂| 亚洲日韩看片无码电影| 国产亚洲精彩视频|