張秀清,王金曉,王曉君
(河北科技大學 信息科學與工程學院,河北石家莊,050000)
在數據通信過程中,LocalLink 和AXI4-S 是兩種不同的協議標準,LocalLink 主要應用在Xilinx 的FPGA 芯片內部,AXI4-S 是一種外部系統總線標準,兩者之間無法直接進行通信。與此同時,數字信號常常因為時序問題需要進行打拍處理,由于AXI4-S 協議太復雜,有很多通道和信號,而且valid 信號和ready 信號的傳遞方向還是相反的,直接打拍會陷入時序混亂的漩渦。本文設計了一種基于register slice 配合邏輯電路的模塊,能夠實現兩協議之間相互轉換的功能,運用register slice 實現AXI4-S 信號在master和slave 之間傳遞時打拍并解決時序問題。LocalLink 和AXI4-S 總線之間數據穩(wěn)定且高效傳輸,提高設備之間的兼容性,占用FPGA 資源較少,效率更高,降低系統成本和復雜度的同時還具備了很好的移植性[1]。
LocalLink[2]協議是Xilinx FPGA 內部使用的一種片內通信協議,用于芯片內可配置邏輯之間的數據傳輸和通信。該協議是一種高性能的點對點同步傳輸協議,它能在傳輸時采用流水線方式。LocalLink 協議具有以下特征:任意字節(jié)寬度的用戶接口、任意長度的數據幀、同步點對點通信、上下游流量控制、渠道支持、高效的帶寬利用率、支持奇偶校驗和錯誤報告[3]。LocalLink 通信方式保證了芯片內各模塊間的同步性和互操作性。本協議設計簡單、硬件結構清晰且易于實現,能夠滿足高性能、低時延以及可靠性等多方面需求,成為Xilinx FPGA 內部通信的主要標準方案。
每一個LocalLink 接口由一個源接口和一個目的接口組成,可實現兩臺設備之間的全雙工操作以及數據的單向傳輸。LocalLink 接口框圖如圖1 所示。
圖1 LocalLink 接口框圖
在LocalLink 傳輸協議中,數據以幀為單位進行傳輸,一幀數據包括負載數據,幀頭和幀尾。在實際工程應用中,LocalLink 接口信號有很多,并且都是成對出現的。本設計中,采用的接口信號見表1。
表1 LocalLink接口信號表
LocalLink 接口的傳輸機制如下,當源接口檢測到目的準備好信號時,產生幀開始信號和源準備好信號,數據傳輸開始。當源接口產生幀結束信號時,目的接口驅動目的準備好信號無效,傳輸過程結束。LocalLink 接口信號時序圖如圖2 所示。
圖2 LocalLink 接口信號時序圖
AXI4-S[4]是基于流模式傳輸的高性能片內總線協議,主要用于大量流式數據的傳輸,支持多數據流使用同一數據通路,并且可以支持數據位寬的轉換[5]。使用AXI4-S 總線協議進行數據傳輸時,不需要提供數據流地址以及其他控制信息,因此AXI4-S 總線協議經常在高帶寬、低消耗以及低延遲的單向數據傳輸場景中使用。本協議設計簡單,易于實現,已成為業(yè)界廣泛采用的標準之一[6]。
在AXI4-S 總線協議中,每個數據流由一組可配置的信號描述。本設計中,采用的AXI4-S 接口信號見表2。
表2 AXI4-S接口信號表
AXI4-S 總線協議是一種雙向流控傳輸機制,收發(fā)雙方通過VALID/READY 信號控制傳輸速率。為確保數據能夠進行正確傳輸,在數據發(fā)送之前,需要確認收發(fā)雙方已經完成握手操作。當主模塊tvalid 信號和從模塊的tready 信號都有效時,表示握手操作完成,開始數據傳輸過程。AXI4-S接口信號時序如圖3 所示。
圖3 AXI4-S 傳輸時序圖
模塊采用Xilinx 公司K7 系列的FPGA 芯片作為核心芯片,通過對LocalLink/AXI4-Stream 總線協議各接口信號進行邏輯處理和時序調整,完成了兩協議轉換功能。根據模塊功能需求模塊分為LocalLink 轉AXI4-S 模塊和AXI4-S 轉LocalLink 模塊兩部分。
LocalLink 轉AXI4-S 模塊負責將LocalLink 協議數據轉換成AXI4-S 總線協議格式,并將數據發(fā)送到AXI4-S 總線上。在其結構上可以分為以下兩個部分:一個邏輯電路和一個register slice,其結構框圖,如圖4 所示。
圖4 LocalLink 轉AXI4-S 模塊結構框圖
由圖4 可知,邏輯電路將LocalLink 數據流轉換為AXI4-S數據流,register slice 完成對AXI4-S 數據流打拍實現時序處理。邏輯電路與register slice 功能具體詳述如下:邏輯電路中,對于輸入的LocalLink 信號,在源準備好和目的準備好置起時,收發(fā)雙方成功握手,數據傳輸開始。數據線在整個傳輸過程中均為直連,不對其進行邏輯操作;EOF 信號對應LAST 信號;SRC_RDY 信號對應VALID 信號;REM 信號分全字節(jié)有效/部分字節(jié)有效情況輸出對應的KEEP 信號,READY 信號對應輸出給上級的準備好信號。此時信號轉換為AXI4-S 數據流形式。Slice 包括四部分:邏輯功能產生器,存儲單元,多路復用器以及進位邏輯。使用register slice 的數據切片以及隔離主從之間時鐘路徑功能,將AXI4-S 總線數據流中的數據切片并存儲到寄存器內,高效且穩(wěn)定輸出符合預期頻率的AXI4-S 總線數據流。因register slice 中信號均為低電平有效,在邏輯電路中進行相應的取反操作。
部分信號賦值語句如下:
AXI4-S 轉LocalLink 模塊將從AXI4-S 總線上接收到的數據轉換成LocalLink 協議形式的數據發(fā)送出去。在其結構上可以分為以下四個部分:兩個邏輯電路和兩個register slice,其結構框圖,如圖5 所示。
圖5 AXI 轉LocalLink 模塊結構框圖
由圖5 可知,AXI4-S 轉LocalLink 模塊實現方式與LocalLink 轉AXI4-S 模塊有所區(qū)別,其通過兩個邏輯電路和兩個register slice 實現。邏輯電路與register slice 功能具體詳述如下:對于輸入的AXI4-S 總線數據流,在tready信號和tvalid 信號同時置起時,收發(fā)雙方成功握手,數據傳輸開始。輸入的AXI4-S 總線數據流,輸入至register slice 進行切片處理并緩存在寄存器中,輸出至邏輯電路,模塊中主要的時序邏輯轉換由此模塊完成。其中,tdata、tready、tvalid 均為直連;tuser 信號為s_rem、s_sof 和s_tlast 的一個組合信號,在輸入信號m_axi_tkeep 中搜索第一個零值,循環(huán)遍歷信號的位,檢查每位是否為0,當找到第一個零值時,循環(huán)停止,輸出對應的s_rem,如果沒有找到零值,則s_rem 設置為全零。Tkeep、tlast、tvalid 信號是否同時為真決定s_sof 為0 或1。因此電路為時序邏輯電路,存在時序問題,將輸出的AXI4-S總線數據流再次輸入至register slice 切片緩存實現對時序的處理,輸出穩(wěn)定的AXI4-S 總線數據流;最后進入邏輯電路,進行取反與邏輯與等組合邏輯操作后,輸出符合預期頻率的LocalLink信號。
部分信號賦值語句如下:
使用Xilinx 的集成開發(fā)環(huán)境Vivado 2017.4 進行邏輯功能實現以及相應的仿真測試。本次模塊設計采用層次化設計思想,將復雜的設計簡化為模塊化設計。由于FPGA 的縱隔實現周期較長,設計使用Testbench 模型提供系統激勵來進行功能仿真測試。使用自定義的數據源,在上行輸出處與下行輸入處做自環(huán)連接,根據SOF 信號與EOF 信號同時/不同時置起兩種情況,對回路中各個模塊進行仿真實驗。系統時鐘設置為100M,復位時間為3250ns,一幀數據為64Byte。Testbench 給入LocalLink 格式數據流。
當SOF 信號與EOF 信號同時置起時,上行仿真圖如圖6 所示。其中,CLK 是時鐘信號,RESET 是系統復位信號,O_LK_SOF、O_LK_EOF、O_LK_DATA、O_SDL_REM、O_LK_SRC_RDY、I_LK_DST_RDY 為輸入的LocalLink 信號。LocalLink 信號經過處理后輸出一組AXI4-S 信號。下行仿真圖如圖7 所示,從上行來的AXI4-S 信號經過處理后輸出一組LocalLink 信號。
圖6 上行仿真結果
圖7 下行仿真結果
當SOF 信號與EOF 信號不同時置起時,上行仿真圖如圖8 所示。LocalLink 信號經過處理后輸出一組AXI4-S 信號。下行仿真圖如圖9 所示,從上行來的AXI4-S 信號經過處理后輸出一組LocalLink 信號。
圖8 上行仿真結果
圖9 下行仿真結果
由圖可以看出,兩種情況下上行和下行接口信號的時序完全正確,上行模塊輸入的數據與經過本模塊行輸出的數據流完全相同,可充分驗證本模塊數據傳輸的正確性。
本模塊設計在基于FPGA 的環(huán)境下,采用VHDL 和Verilog 硬件描述語言進行編程設計。對LocalLink 協議和AXI4-S 總線協議的概念、特性以及接口信號等進行了詳細介紹,將register slice 運用到系統中,給出模塊設計方案。對模塊功能進行仿真驗證,實現LocalLink/AXI4-S 總線協議轉換,具有很實用的參考和工程價值。