如何使用自定義RTL模塊并向其添加一個axis4 - lite接口包裝器,以便在Vivado塊設計中使用
從2022年開始,我決定瀏覽我積壓的項目想法的無窮無盡的列表,并決定打破這些很酷的老式QDSP-6061 5位氣泡顯示從惠普和創(chuàng)建一個驅(qū)動程序在Verilog。
我從Digilent公司拿出了我的Arty Z7板,并在Vivado/Vitis 2021.2中創(chuàng)建了一個項目來讓它工作,你可以在我的上一個項目帖子中閱讀,我在QDSP-6061的5位數(shù)上顯示滾動文本,上面寫著“Hello 2022”。
我最終創(chuàng)建的Verilog驅(qū)動程序非常簡單,因為它在FPGA上電復位后立即開始運行,并且永遠運行。所以我想添加幾個功能1)控制,當驅(qū)動程序開始從arm內(nèi)核上的C應用程序運行時,Zynq和2)能夠發(fā)送驅(qū)動程序數(shù)據(jù)字符串,從C應用程序在顯示器上滾動,而不是將其硬編碼為“你好2022”。這兩個功能都需要在arm內(nèi)核上運行的C應用程序和在Zynq SoC FPGA的可編程邏輯中運行的Verilog驅(qū)動程序之間建立通信通道。
最簡單和最直接的方法是將AMBA®AXI4(高級可擴展接口4)協(xié)議接口添加到QDSP-6061氣泡顯示的Verilog驅(qū)動程序中?,F(xiàn)在,AXI接口是一組非常簡單的握手信號,可以用簡單的狀態(tài)機在Verilog或VHDL的RTL端復制,但是從應用程序端編寫相應的C驅(qū)動程序并不簡單。
然而,Vivado/Vitis有一個方便的特性,它可以自動生成RTL和C代碼與所需的AXI參數(shù)。我將演示如何在本項目中使用它。
值得注意的是,有三種主要的AXI4接口實現(xiàn):
?Full AXI4
?AXI4-Lite
?AXI4-Stream
每種類型更適合不同的用例。在QDSP-6061氣泡顯示驅(qū)動程序的這種情況下,所有需要的是寫一些值到一對寄存器,這不是大量的數(shù)據(jù)正在傳輸,沒有任何嚴格的時序要求。因此,ax4 - lite是我選擇為此實現(xiàn)的AXI接口的版本。
創(chuàng)建新的AXI4外設
從我上一篇文章中為Arty Z7創(chuàng)建的Vivado項目開始,你會看到我剛剛用Add模塊直接將QDSP-6061驅(qū)動程序Verilog模塊添加到塊設計中…在編輯塊設計時,右鍵菜單中可用的功能。
現(xiàn)在的目標是使用Vivado內(nèi)置的包IP特性,用新的AXI4-Lite自定義IP版本替換它。因此,第一步是為QDSP-6061冒泡顯示驅(qū)動程序創(chuàng)建一個新的AXI4外設IP塊。
要在Vivado中創(chuàng)建一個新的axis4外設IP,請選擇Tools b> create and Package new IP…
將在當前的Vivado項目中彈出一個窗口,該窗口打開后顯示可用選項的簡要摘要,包括創(chuàng)建新AXI4外設的選項。單擊Next繼續(xù)。
在第二頁上,選擇Create a new AXI4外設選項,然后在下面的頁面上為外設提供所需的名稱、版本和描述信息。
注意:不要在name字段中使用破折號或其他非法字符。因為在Name字段中傳遞的任何內(nèi)容都被用作IP的Verilog模塊名稱。
下一頁允許您設置自定義外設所需的主和從AXI接口的數(shù)量。這包括每個接口的AXI類型。在這種情況下,只需要一個從AXI4-Lite接口,因為我們只需要C應用程序能夠?qū)懭隦TL中的寄存器。
此外,在這個頁面上,還有一些需要配置的設置,比如AXI接口的數(shù)據(jù)總線的寬度和可用的寄存器的數(shù)量。默認的數(shù)據(jù)寬度是32位,這就是我堅持的。最小寄存器數(shù)為4,這對于C應用程序?qū)?shù)據(jù)傳遞給QDSP-6061驅(qū)動程序來說已經(jīng)足夠了。
最后的摘要頁面為下一步提供了一個新選項。在這種情況下,仍然需要添加氣泡顯示驅(qū)動程序的Verilog,因此我們選擇Edit IP選項。
點擊Finish并選擇Edit IP選項后,將打開第二個Vivado項目:
對于一個AXI4-Lite IP項目,生成了兩個Verilog文件:
頂層文件是外設實際功能的邏輯直接編碼或?qū)嵗牡胤?。第二個在名稱后面加上S00_AXI的是實現(xiàn)AXI握手信令邏輯的地方。這也是為外設添加自定義邏輯的地方,以便將數(shù)據(jù)拉入并發(fā)送到AXI總線,然后將其傳遞回頂級文件,以供外設的代碼功能RTL使用。
自動生成的代碼有很好的注釋,并且清楚地標記了何時添加自定義RTL(包括在哪里添加端口和信號聲明),并帶有“在這里添加用戶邏輯”注釋部分。
AXI4-Lite自定義IP Verilog
我建議首先為自定義IP的核心功能添加邏輯,然后關注它將如何與AXI接口交互。因此,我從生成的頂級Verilog文件axi_qdsp_6061_controller_v1_0開始。v添加我寫的Verilog來驅(qū)動QDSP-6061。
您可以像在普通的Vivado項目中一樣導入現(xiàn)有的Verilog源文件,并在axis4外設項目的頂級源文件中實例化它,也可以直接編寫自己的邏輯。
由于我需要對QDSP-6061驅(qū)動程序的Verilog代碼進行一些更改,所以我選擇直接將其復制+粘貼到頂級Verilog模塊axi_qdsp_6061_controller_v1_0.v中
在復制粘貼我以前的Verilog之后,我添加了一個使能信號,只要使能信號是低邏輯電平(零),它就會使驅(qū)動程序處于復位狀態(tài)。為了讓這個項目的帖子寫,它不會比它已經(jīng)是更長,我決定離開可加載字符串配置另一天的滾動文本。
將核心功能添加到頂級文件后,很明顯,需要與AXI接口交互的唯一信號是啟用信號。因此,我將它作為一個端口添加到ax_qdsp_6061_controller_v1_0_s00_axis .v描述的AXI接口模塊
同樣,在文件的末尾是添加任何自定義邏輯的地方,而在頂部的端口聲明是聲明從頂級文件中的邏輯輸入的任何信號的地方。
回想一下,我將axis4 - lite從接口配置為有四個寄存器用于寫/讀。我決定,為主驅(qū)動程序邏輯生成啟用信號的最簡單方法是,當C應用程序?qū)⒅?xFFFFFFFF寫入偏移量0x0的第一個寄存器時,將啟用設置為高。
注意:寄存器彼此的偏移量為4,因此寄存器0的偏移量為0x0,寄存器1的偏移量為0x4,寄存器2的偏移量為0x8,寄存器3的偏移量為0x12。
基于在偏移量0x0處寫入AXI從接口控制寄存器的0xFFFFFFFF值設置使能信號高的邏輯:
至此,已經(jīng)添加了axis4 QDSP-6061驅(qū)動程序IP的所有自定義邏輯,我們可以繼續(xù)進行最終配置。
切換到Package IP選項卡,有一系列的打包步驟。第一個參數(shù)只是前面設置的名稱、描述和版本信息。在這里,您可以返回并根據(jù)需要編輯信息。
默認情況下,當調(diào)用選項Create and Package New IP時,IP僅與Vivado項目所針對的FPGA芯片兼容。由于我從我為Arty板創(chuàng)建的Vivado項目中選擇了創(chuàng)建和封裝新IP選項,因此默認情況下,AXI4 QDSP-6061驅(qū)動程序IP僅與Zynq-7000芯片兼容。這可以在打包步驟的Compatibility步驟中更改。
要使AXI4 IP與所有Xilinx fpga兼容,請單擊Compatibility步驟中的+按鈕,并選擇Add Family explicit…
在“添加家族”彈出窗口中,選擇您希望與AXI4 IP兼容的所有FPGA芯片。我剛剛檢查了所有家庭和部件選項,但如果你擔心這一點,這會使IP占用更多的硬盤空間。我還建議為生命周期選擇生產(chǎn)選項,因為您很可能會使用生產(chǎn)級FPGA芯片。
通過其余的選項卡,不需要為axis4 QDSP-6061驅(qū)動程序IP編輯任何內(nèi)容。但是,您可以看到這個創(chuàng)建和打包新IP工具將生成的所有文件,包括C應用程序源文件。你也可以做一些很酷的事情,比如在Vivado塊設計中使用IP塊時,在其上添加一個自定義徽標。
最后一步是打包IP(我的截圖只說重新打包IP,因為我忘記在第一次打包之前抓取截圖)。
在最后的打包步驟中單擊Package IP按鈕后,將出現(xiàn)一個彈出窗口,詢問是否要關閉AXI外設的Vivado項目。您可以隨時重新打開這個Vivado項目來修改/更新IP,方法是從包含自定義IP的存儲庫已添加到的任何Vivado項目中打開IP Catalog,并在IP Packager中選擇Edit。
創(chuàng)建和打包新IP工具將在Settings > IP > Repository中自動添加自定義IP的原始Vivado項目。但是您需要將其手動添加到將來想要使用該IP的任何新Vivado項目中。
將AXI QDSP-6061 IP添加到Vivado框圖中
隨著AXI4 QDSP-6061驅(qū)動程序IP本身的完成,我回到原來的Vivado項目,用新的支持AXI的模塊IP替換塊設計中的RTL模塊。
刪除RTL模塊后,在模塊設計中使用+鍵或右鍵單擊,選擇“Add IP…”查找ax4 QDSP-6061驅(qū)動IP。在列表中雙擊它,將其添加到塊設計中。
幾分鐘后,Vivado將在塊設計中檢測到新的AXI接口,并且連接自動化將彈出在塊設計窗口的頂部。單擊綠色橫幅中的Run Connection Automation超鏈接,將出現(xiàn)一個彈出窗口,顯示Vivado將如何將axis4 QDSP-6061驅(qū)動程序IP連接到帶有Zynq處理系統(tǒng)IP的AXI總線。單擊OK以運行連接。
我還選擇將ila添加到axis4 QDSP-6061 Driver IP的AXI接口及其輸出信號中,最初是為了進行故障排除,方法是右鍵單擊每條線路并選擇Debug,然后運行似乎生成ila的連接自動化。
新的積木設計是這樣的:
驗證設計(塊設計窗口頂部帶有復選框的按鈕),然后保存并關閉塊設計。
生成比特流和出口硬件平臺
現(xiàn)在,塊設計已經(jīng)更新,運行合成,實現(xiàn),并生成一個新的比特流。如果你沒有讀過我以前的任何Vivado 2021.2項目帖子,你需要點擊生成比特流按鈕,它將自動運行合成和實現(xiàn),以避免無法找到板定義文件的關鍵警告(但這個警告是完全良性的,可以忽略,它只是激怒了我,所以我避免它)。
生成新的比特流后導出硬件平臺,選擇“File > Export > Export hardware…”
在彈出窗口中,確保選擇包含比特流的選項。我選擇導出硬件平臺來覆蓋之前的硬件平臺。
最后,通過選擇Tools > launch Vitis IDE啟動Vitis
更新Vitis平臺硬件規(guī)格
因為我已經(jīng)為這個項目有了一個現(xiàn)有的Vitis工作空間,所以我重新打開了它,并用從Vivado導出的新硬件平臺更新了平臺項目(因為即使我重寫了它,Vitis也不會自動檢測和更新它的修改)。
右鍵單擊Vitis項目的Explorer窗口中的平臺項目(記得我在上一篇文章中將平臺項目命名為arty_z7),然后選擇Update Hardware Specification。
從Vivado導出的XSA硬件文件的目錄路徑可以保持不變,因為我只是覆蓋了舊的路徑。然后單擊“確定”。
一旦平臺項目顯示過時,就清理它。一旦完成,立即運行一個清理應用程序項目。
清理完平臺和應用程序項目后,構(gòu)建平臺項目,然后構(gòu)建應用程序項目。
始終在應用程序項目之前清理/構(gòu)建平臺項目是很重要的,因為應用程序項目依賴于平臺項目。
重要的是要注意,在Vitis工作空間中更新硬件平臺的方法通??偸遣煌诿總€版本的Vitis。我發(fā)現(xiàn)這種方法在2021.2有效,但在2019.2,如果不關閉并重新啟動Vitis,就無法更新硬件平臺。
Vitis應用程序C代碼
最后是編寫C應用程序來控制ax4 QDSP-6061驅(qū)動程序IP的時候了。這段代碼將通過寫入0xFFFFFFFF來在IP塊中注冊零來斷言/取消斷言RTL中的啟用信號。
正如我前面提到的,有四個寄存器被寫入偏移量0x0、0x4、0x8和0x12。由于我對Verilog進行了編碼,以便在偏移量0x0的寄存器的所有32位設置為0xFFFFFFFF時將啟用信號設置為氣泡顯示驅(qū)動程序高,因此C代碼需要將0xFFFFFFFF寫入偏移量0x0的寄存器。
為自定義AXI4外設自動生成的源文件出現(xiàn)在Vitis平臺項目中的幾個不同位置,但是您需要在以下位置編輯源文件,以便全局更新它們,并可用于應用程序項目中的主函數(shù)://ps7_cortexa9_0/standalone_domain/bsp/ps7_cortexa9_0/libsrc//src
一定要在頭文件中包含函數(shù)聲明(在本例中為axi_qdsp_6061_controller.h),然后在相應的C文件中編寫函數(shù)體(axi_qdsp_6061_controller.c)。
還生成了一個自測源文件,您可以將其用作模板。但是您需要記住,它自動生成的代碼是盡可能一般化的。因此,它可能會為您的自定義應用程序拋出警告和信息消息(基本上,我警告任何新手不要將自測中的自動生成代碼視為黃金,這可能對您的應用程序是錯誤的)。例如,將axis4 QDSP-6061驅(qū)動程序IP的基址作為空類型指針傳遞,會導致各種問題。因此,我將其更改為在實際寫寄存器函數(shù)中作為簡單的整數(shù)值類型轉(zhuǎn)換為u32傳遞:
我的主函數(shù)變得非常簡單,因為所有需要發(fā)生的是一次寫0xFFFFFFFF以在偏移量0x0處注冊零:
保存所有文件并構(gòu)建應用程序項目。
調(diào)試應用程序
啟動調(diào)試運行應用程序來測試它。將Arty板插入主機PC,然后從資源管理器窗口右鍵單擊應用程序,并選擇Debug As b>在硬件上啟動(單個應用程序調(diào)試)。這將打開Vitis中的調(diào)試視圖,并在main函數(shù)的入口處設置一個斷點,以允許您逐行執(zhí)行應用程序。
如果您將ila添加到塊設計中,請切換回Vivado并在硬件管理器中打開它們,然后在Vitis中逐步執(zhí)行應用程序。在Vivado的Flow Navigator窗口中,選擇Open Hardware Manager > Open Target > Auto Connect, Vivado將為您打開ILA窗口。
我為AXI ILA窗口設置了寫地址通道有效(AWVALID)、寫數(shù)據(jù)通道有效(WVALID)和寫響應通道有效(BVALID)信號上的觸發(fā)器,以便在執(zhí)行寄存器寫函數(shù)時捕獲來自C應用程序的實際寫事務。
我還在AXI4 QDSP-6061驅(qū)動IP的輸出線上設置觸發(fā)器,以查看何時/是否開始驅(qū)動陰極和陽極線,以驗證寫入值0xFFFFFFFF以注冊零確實設置了邏輯高的使能信號。
本文編譯自hackster.io