了解Zynq PS / PL接口之后;到目前為止,我們已經(jīng)分析了Zynq All Programmable SoC芯片中的PS (處理器系統(tǒng))與PL(可編程邏輯)之間的接口。我們已經(jīng)使用Vivado設(shè)計(jì)套件創(chuàng)建了簡(jiǎn)單的外設(shè),使用SDK與新外設(shè)連接,并且可以在外設(shè)上運(yùn)行自檢程序。但我們創(chuàng)建的外設(shè)功能不超過(guò)四個(gè)可讀取和寫入的寄存器。實(shí)際上,我們需要外設(shè)執(zhí)行一些有效的功能。
我們將再次使用Vivado為這個(gè)外設(shè)添加實(shí)際的功能。
首先需要打開Vivado項(xiàng)目和框圖,其中包含我們已創(chuàng)建的外設(shè)。右鍵點(diǎn)擊“Peripheral”,選擇“Edit IP Packager ”選項(xiàng)。隨后IP Packager窗口將打開,可編輯和更新外設(shè)。
除Package IP 外設(shè)窗口外,這個(gè)窗口與標(biāo)準(zhǔn)項(xiàng)目流窗口相似。在設(shè)計(jì)源窗口下方有兩個(gè)在外設(shè)創(chuàng)建過(guò)程中創(chuàng)建的文件。
?
這些文件被命名為:
Adams_Peripheral_v1_0.vhd - 頂級(jí)架構(gòu)文件,利用該文件可定義退出該模塊的用戶I/O。
Adams_Peripheral_V1_0_S00_AXI.vhd - RTL文件,其中包含函數(shù)AXI接口,包括初始創(chuàng)建的四個(gè)寄存器。
這兩個(gè)文件中包括用戶代碼將插入地址的注解:
?
在這個(gè)例子中,我將介紹使用第一個(gè)寄存器作為控制寄存器。這個(gè)寄存器當(dāng)中的特定位定義是否將寄存器2和3的目錄進(jìn)行相加、相減或相乘運(yùn)算。運(yùn)算結(jié)果將存儲(chǔ)在第四個(gè)寄存器中。我們將設(shè)置與微處理器相關(guān)的第四個(gè)寄存器為只讀狀態(tài),以確保微處理器不會(huì)影響運(yùn)算結(jié)果。此外,如果激活控制寄存器,外圍將生成一個(gè)中斷。
定義中的第一步是聲明四個(gè)寄存器,第3個(gè)寄存器為輸出寄存器,最后1個(gè)寄存器為輸入寄存器。(在這個(gè)步驟時(shí)我們可實(shí)現(xiàn)這一功能,但目前我正在頂層操作演示實(shí)現(xiàn)更復(fù)雜功能所需要的步驟) 。
同時(shí),我也編輯這個(gè)文件為只讀文件,以防止處理器寫入第四個(gè)寄存器。
在頂層文件我在該架構(gòu)創(chuàng)建一個(gè)中斷輸出并添加簡(jiǎn)單功能代碼以執(zhí)行我們所要的操作。
?
在所有必要的用戶VHDL語(yǔ)言完成添加后,我處理該項(xiàng)目以確保在Vivado內(nèi)打包IP并返回至項(xiàng)目前不會(huì)出現(xiàn)錯(cuò)誤。但在打包器打包IP前,我增加IP版本號(hào)以表示代碼變更。點(diǎn)擊“re-package”將運(yùn)行打包器,并關(guān)閉項(xiàng)目,返回至初始Vivado項(xiàng)目。
返回使用該外設(shè)的項(xiàng)目中,可以運(yùn)行IP狀態(tài)報(bào)告(Tools - >Reports - >Report IP status),顯示在設(shè)計(jì)中所使用的更新版本。
?
在將項(xiàng)目導(dǎo)出至SDK前,需要重新構(gòu)建項(xiàng)目。在SDK內(nèi),可使用之前使用的同一功能對(duì)這個(gè)外設(shè)進(jìn)行寫入和讀取。但測(cè)試過(guò)程中最后一個(gè)寄存器不能寫入時(shí),自檢程序?qū)⑹ ?/p>
?
第一個(gè)測(cè)試是使用寄存器0中的命令1相加寄存器2和3內(nèi)的目錄:
?
在第二次測(cè)試中,我們使用寄存器0中的命令2將寄存器2和3內(nèi)的目錄相乘:
?
在最后的測(cè)試中,我們使用寄存器0中的命令3將寄存器2內(nèi)的目錄減去寄存器3的目錄:
?
所有這些測(cè)試都使用輪詢的方法。由于這些運(yùn)算屬于簡(jiǎn)單的加、減、乘函數(shù),可在一個(gè)時(shí)鐘周期內(nèi)完成。但更復(fù)雜的多周期函數(shù)運(yùn)算需要使用中斷,我們將在另外的文章中說(shuō)明。
評(píng)論