【注】該項目是我們團隊參加2019屆全國大學生FPGA大賽的作品,系統主要實作視訊任意角度旋轉。該項目最終晉級決賽,并獲得紫光同創企業特别獎。該系列文章介紹我們團隊的作品。關注公衆号“數字積木”對話框回複 FPGA2019 ,即可獲得該項目的工程源代碼,詳細的文檔說明,MATLAB仿真代碼。
AXI總線資料傳輸方案
4.2.1總體設計
經過攝像頭擷取到圖像資料後,經過圖像資料的預處理後,将圖像資料緩存到ddr中。顯示子產品再從DDR中讀取圖像資料,顯示到顯示屏上。
圖像資料通過AXI接口寫入到DDR中,通過AXI總線從DDR中讀取。這期間要跨三個時鐘域。分别是 攝像頭資料輸出時鐘,AXI讀寫時鐘,顯示屏驅動時鐘。在跨時鐘域傳輸資料時,資料都要經過fifo緩存。
分别設定兩個fifo子產品,用于跨時鐘域的資料緩存。一個設定在攝像頭資料子產品和DDR中,用于緩存向DDR中寫入的資料。一個設定在 DDR和顯示屏驅動子產品之間,用于緩存從DDR中讀取出的資料。
在将資料從攝像頭傳輸到DDR中時,當fifo中的資料數量大于預設值,啟動一次突發寫傳輸,将緩存在fifo中的資料緩存到DDR的預設的位址中。
在将資料從DDR傳輸到顯示控制子產品中時,當fifo中的資料數量小于預設值,啟動一次突發讀傳輸,從DDR的預設的位址中讀取出圖像資料,緩存到fifo中,共顯示子產品讀取。
4.2.2資料的寫入方案
AXI的寫傳輸由fifo中緩存的資料數量觸發,當儲存在fifo中的資料大于預設值時,進行一次突發傳輸,将緩存在fifo中的資料寫入到DDR中。
當開始啟動一次突發傳輸時,先發送突發傳輸的起始位址,位址信号通過axi_awaddr端口傳輸。同時将 axi_awvalid 信号置高,用與通知主機位址通道有有效的位址資訊。從機通過 AXI_AWREADY 信号來标志接收到該位址資訊。主機接收到 AXI_AWREADY 有效信号後,将 axi_awvalid 置低,直到下一次突發傳輸,再重複該過程。
啟動一次突發傳輸時,便将 axi_wvalid 置為有效,同時将第一個要發送的資料放置在 axi_wdata 總線上。AXI寫通道的資料(axi_wdata)要和axi_wvalid 對齊,從機通過 AXI_WREADY 來辨別從機開始接收資料,待從機的AXI_WREADY 有效時,表示從機已準備好接受資料,在 AXI_WREADY 有效的後,從機在下一個時鐘寄存接收該資料。此時主機便可将 AXI_WREADY 作為讀使能信号,在下一個時鐘輸出突發傳輸的下一個資料。重複該步驟,直到一次突發傳輸完成。即在 AXI_WREADY 有效時,主機在下一個時鐘發送新資料,從機在下一時鐘寄存該時鐘接收到的資料。
主機通過 axi_wlast 信号來标記一次突發傳輸的最後一個資料。該信号由主機産生,通過設定一個計數器來記錄突發傳輸的資料的數量。axi_wlast 信号要提前一個時鐘判斷使能,和要發送的最後一個資料對齊。當計數值到倒數第二個資料時,使能 axi_wlast 信号,使之在下一個時鐘有效,這樣便可以将 axi_wlast 信号和最後一個發送的資料對齊。
在紫光的官方fifo中,資料輸出段不會直接輸出目前讀指針指向的資料,需要提供一個讀使能信号後,資料才會在下一時鐘在讀資料端口輸出。故在啟動突發傳輸時,也要提供一個時鐘的讀fifo使能信号,将第一個要寫入的資料從fifo中讀出。在從機的 AXI_WREADY 有效後,從機開始接受資料,主機也要從fifo中讀出新的資料送給從機。
Fifo的資料是在該時鐘使能,下一個時鐘輸出。讀使能信号和資料輸出有一個時鐘的延遲。
主機的讀fifo使能信号設定為
rd_fifo_en = rd_first_data || ( axi_wvalid && M_AXI_WREADY && ( !axi_wlast ) );
rd_first_data:啟動突發傳輸時的讀使能信号,一個時鐘有效。
axi_wvalid && M_AXI_WREADY : 在主機發送有效且從機接受資料時,讀取fifo中的資料。
!axi_wlast : 發送最後一個資料時,該資料通過上一個時鐘的讀使能信号已經讀出,在該周期,不再讀取新的資料。
4.2.3資料的讀出方案
圖像資料儲存在fifo中,顯示驅動子產品用于控制圖像的顯示,通過從DDR中讀出圖像資料,送給顯示屏進行顯示。資料從DDR中讀出,送給顯示驅動子產品時,也要經過fifo緩存。
主機先發送讀位址(aw_araddr) 以及位址有效信号( aw_arvalid )。從機接收到 aw_arvalid 有效信号後,在接收位址信号的同時 ,傳回 AW_ARREADY 有效信号,标志位址已經接收完成。
在主機接收到 AXI_ARREADY 有效信号後,便可以開始進行讀資料的接收,主機等待從機發送的 AXI_ARVALID 有效信号,此信号有效時,表明讀資料總線 AXI_RDATA 上此時有有效的輸出資料。此時主機發送 axi_rready 信号,通知從機主機已經開始接收資料,此時從機便可以發送新的資料。
從機在接收到有效資料後,需要将讀出的資料在fifo中進行緩存。該fifo的使能信号 設定為如下:
rd_fifo_en = ( axi_rready && AXI_RVALID );
AXI_RVALID : 該信号表示讀資料總線上有有效的資料。
axi_rready:該信号有效後,從機在下一個周期才發送新的資料。在該信号無效時,從機發送的資料保持不變。故隻有在該信号有效時,将輸出資料端口的資料寫入到fifo中即可。
Fifo端的寫資料,寫使能和寫資料對齊,資料在下一個時鐘寫入到fifo中去。