ZYNQ的優點在於經過高效的接口總線組成了ARM+FPGA的架構。我認爲二者是互爲底層的,當進行算法驗證時,ARM端現有的硬件控制器和庫函數能夠很方便地鏈接外設,而不像FPGA設計那樣徹底寫出接口時序和控制狀態機。這樣ARM會被PL端抽象成「接口資源」;當進行多任務處理時,各個PL端IP核又做爲ARM的底層被調用,此時CPU僅做爲「決策者」,爲各個IP核分配任務;當實現複雜算法時,底層算法結構規整可並行,數據量大,實時性要求高,而上層算法則徹底相反,而且控制流程複雜,靈活性高。所以PL實現底層算法後將運算結果交給PS端軟件後續處理是很是高效的。算法
所以PS與PL端數據交互是相當重要的,在傳輸數據量小的控制 配置初始化等應用場合下無疑會選擇簡單的AXI-Lite總線,如下對總線接口 自定義IP操做及使用注意事項加以說明。打開Vivado新建工程,選擇主菜單欄Tools選項下的Create and package new IP...架構
選擇建立新的AXI4外設能夠自動生成總線接口邏輯app
採用AXI-Lite總線的Slave模式,只有寄存器數量是可修改的。注意數據位寬固定32bit,計算機中數據以字節(8bit)爲單位存儲,所以各個寄存器地址的偏移量爲4.這一點在寫軟件時會有所體現。函數
選擇編輯IP,打開的工程由頂層Wrapper和AXI-Lite總線接口邏輯組成。關閉自動彈出的IP封裝嚮導,當添加好用戶自定義邏輯後再從新封裝,不然封裝的僅僅是軟件生成的接口邏輯。接口比較多,分爲寫通道和通道,而每一個通道基本邏輯又由地址通道和數據通道組成。除了以上四個通道外,寫通道包含應答通道以返回CPU確認信息。每一個接口以S_AXI_開頭,以後AW表明地址寫,W表明數據寫,AR表明地址讀,R表明數據讀,B表明響應。關於AXI總線的基本特性在以前的博文中已有闡述,無非就是READY和VLD信號的「握手」。所以這五個核心信號包括VALID DATA和READY。 spa
從上述代碼能夠看出,只有在寫地址通道和寫數據通道均握手成功時纔能有效寫入寄存器。設計
根據參數聲明和寄存器選擇與寫操做邏輯可知,是根據地址[5:2]這四位來判斷寫入哪個寄存器。如:3d
地址0,即6'b0000_00 blog
地址4,即6'b0001_00 接口
地址8,即6'b0010_00資源
地址12,即6'b0011_00
所以[5:2]部分依次是0 1 2 3,從而驗證了以前地址偏移量是4的觀點。這裏的slv_regx信號就是咱們須要送入自定義邏輯的控制信號了。
上面是讀操做核心邏輯,當從機收到有效的讀操做地址且準備好後,會將寄存器數據送回到主機。換句話說讀操做讀到的數據僅是單純寫入的控制數據,並非自定義邏輯的處理結果。因此讀操做要將489行開始的右側數據源更換成自定義邏輯處理後有效數據。如:reg_data_out <= user_module_dout;
內部添加的自定義邏輯能夠直接寫在該模塊內,也能夠例化自定義模塊或IP核。最後封裝當前工程獲得支持AXI-Lite總線的自定義IP核。
打開須要例化剛纔產生IP核的工程,選擇Project Setting -> IP -> Respository Manger添加IP核路徑或,在block design或 IP Catalog中調用。