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