◆趙航 錢博
(沈陽理工大學信息科學與工程學院遼寧 110159)
FPGA設計靈活,接口眾多,可以實現多種接口的功能。串口是一種最常見的接口,其設計簡單,應用廣泛。由于串口輸入數據率可能存在與后繼處理電路數據率不匹配的問題,確保不同處理過程間數據完整性變得尤為重要。乒乓操作是數字電路設計中一種常用的技巧,通過切換緩沖模塊可有效地實現高速數據流的緩存[1,2]。
為了解決串口輸入數據率與后繼 FPGA處理模塊處理數據率不匹配的問題,本文基于FPGA平臺,選用雙FIFO模塊作為緩沖模塊,利用乒乓操作作為數據流的處理技術,設計了基于雙FIFO乒乓操作的數據緩沖電路。
如圖1所示,乒乓操作的數據處理過程為:首先,數據流的輸入模塊將輸入的數據流發送到選擇模塊。選擇模塊將輸入數據等數據量的分配到兩個FIFO模塊中,將整個數據處理流程分為3個分配區間。在第一個分配區間,輸入數據被選擇模塊分配到FIFO模塊1中。在第二個分配區間,將FIFO模塊1切換至FIFO模塊2,輸入數據被選擇模塊分配至FIFO模塊2中,并且選擇模塊將分配到FIFO模塊1中的數據送到后續數據流處理模塊。在第三個分配區間,將 FIFO模塊2切換至FIFO模塊1,輸入數據被選擇模塊分配至FIFO模塊1中,并且將選擇模塊分配到FIFO模塊2中的數據經過輸出選擇模塊后,送到運算處理模塊進行運算處理。經過以上三個分配區間的不間斷循環,就可以實現對數據流的高速無縫傳輸與緩沖。

圖1 乒乓操作原理圖
在整個乒乓操作過程中,輸入數據流連續不斷通過輸入數據模塊,輸出數據流連續不斷的被送到數據處理模塊,達到了沒有間隔處理數據的效果,同時節省時間,提高了數據處理速率[3]。
如圖 2所示,該設計主要由數據輸入模塊、乒乓操作模塊以及FPGA處理模塊三部分構成。

圖2 總體設計框圖
首先,在數據輸入模塊中,通過上位機利用串口助手工具輸入一串數據,串口rx接收到數據后將其發送至乒乓操作模塊,用作乒乓操作模塊的輸入數據。其次,在乒乓操作模塊中,兩個FIFO模塊作為數據緩存模塊,將輸入的數據緩存到兩個FIFO模塊中,通過兩個計數器不斷對FIFO的輸入輸出進行控制,將緩存到兩個FIFO模塊中的緩存數據不間斷的送至FPGA處理模塊。
在數據輸入模塊中,包括上位機、串口以及時鐘管理三部分。在該設計中,將串口的波特率設置為38400Bd,有1位起始位,8位信息位以及1位停止位,因此可得到串口數據率為38400bps,由于串口有8位信息位,所以將8bit數據視為一幀數據,一次發送144bit數據,即18幀數據。
在上位機上,利用串口助手發送數據,通過串口的rx接收上位機發來的數據。在串口部分,由于串口的數據率為38400bps,因此rx的時鐘為 38.4KHz。rx將從上位機上接收到的數據發送至乒乓操作模塊。在時鐘管理部分,通過選用差分時鐘IP核產生各模塊所需要的時鐘。由于串口時鐘和FPGA處理模塊的時鐘分別為38.4KHz和15KHz,因此通過輸入200MHz的差分時鐘產生38.4KHz和15KHz兩種時鐘,38.4KHz的時鐘用于串口模塊,FIFO模塊以及計數器1模塊,15KHz的時鐘用于FPGA處理模塊,FIFO模塊以及計數器2模塊。
在乒乓操作模塊中,主要包括兩個FIFO模塊,兩個計數器模塊以及一個二選一模塊。由于串口模塊的時鐘和 FPGA處理模塊的時鐘分別為為 38.4KHz和15KHz,所以兩個FIFO的寫時鐘和讀時鐘分別為38.4KHz和15KHz,由于讀寫時鐘不同,所以為異步FIFO。首先,第一個計數器在 38.4KHz的寫時鐘驅動下通過計數控制兩個FIFO的寫使能,通過控制寫使能有效將串口發來的數據寫入FIFO。然后,第二個計數器在 15KHz的讀時鐘驅動下通過計數控制兩個FIFO的讀使能,通過控制讀使能有效,將寫入FIFO中的數據讀出。最后,通過二選一模塊將兩個FIFO模塊中緩存的數據發送至FPGA處理模塊。
設計的具體參數如下:兩個FIFO模塊的深度設計為256位,進行一次讀寫的數據為144位,所以完全滿足其深度要求。由于串口和FPGA處理模塊的數據率分別為38.4KHz和15KHz,所以通過差分時鐘模塊產生的寫時鐘和讀時鐘分別為38.4KHz和15KHz。因此一次寫入144bit數據由于讀寫時鐘不同,且寫時鐘大于讀時鐘,則寫入144bit數據所用的時間小于讀出144bit數據所用的時間。為了保證數據在寫入和讀出過程不丟失,需要準確設計數據寫入和讀出的時間。
已知FIFO模塊的讀寫時鐘和一次讀寫的數據位數,可得數據寫入和讀出時間為t=N/B。
式中t為時間,N為數據位數,B為數據率。該設計中,寫時鐘為38.4Khz,則數據率為38.4Kbps,數據位數為144bit,則一次寫入144位數據需要的時間為 3.75ms。讀時鐘為 15Khz,則數據率為15Kbps,數據位數為 144bit,則一次讀出 144位數據需要的時間為9.6ms。由于寫入數據的時間小于讀取數據的時間,因此若同時不間斷進行讀取數據,則 FIFO中的數據未完全讀取就被寫入新的數據,會造成數據溢出。因此一次寫入144bit數據后不能立馬寫入數據,需要等待一段時間,這段時間內數據是空閑狀態,不寫入FIFO。讀出數據時間從等待時間開始直到第二次寫入數據完成結束,由于數據寫入時間和數據讀取時間已知,因此等待時間可求得為5.85ms。
如圖3所示,對數據時隙進行分析,首先通過計數器1控制寫使能1有效向FIFO1模塊中寫入144bit數據,時間為3.75ms,然后開始等待5.85ms,在等待過程中不寫入數據,而是通過計數器 2控制讀使能1有效開始讀取緩存在FIFO1模塊中的數據。等待時間結束后,通過計數器1控制寫使能2有效向FIFO2模塊中寫入144bit數據,時間為3.75ms,在寫入數據期間繼續讀取FIFO1中的數據,寫入完成后,FIFO1中的數據也讀取完成。之后繼續等待5.85ms,此時通過計數器2控制讀使能2有效開始讀取緩存在FIFO2模塊中的數據,其過程和讀取FIFO1模塊中的數據相同。

圖3 數據時隙圖
本次設計采用Virtex6系列XC6VLX240T芯片,利用ML605開發板進行硬件開發,開發板實物圖如圖4所示。

圖4 開發板實物圖
在設計系統模塊的基礎上,基于 Xilinx軟件及其板上測試平臺對數據流的寫入與讀出進行仿真與平臺測試分析。在ISE Design Suite 14.7開發環境下,使用Verilog硬件描述語言,調用第三方仿真工具Modelsim,對整個數據緩沖系統行仿真綜合分析。調用板上測試工具Chipscope,對整個數據存儲系統行綜合分析與測試。輸入數據仿真圖、測試圖如圖5、圖6所示,FIFO模塊讀寫使能仿真圖如圖7所示,乒乓操作輸出仿真圖、測試圖如圖8、圖9所示。

圖5 輸入數據仿真圖

圖6 輸入數據測試圖
由圖5輸入數據仿真圖可知,串口的rx在38.4KHz的時鐘下,將上位機發送的一串數據位寬為1bit的數據流發送至乒乓操作模塊,為乒乓操作模塊提供數據,圖 6測試圖則驗證了輸入數據與仿真圖中的數據一致。

圖7 FIFO模塊讀寫使能仿真圖
由圖7讀寫使能仿真圖可知,乒乓操作模塊在寫時鐘38.4KHz,讀時鐘15KHz的驅動下,通過計數器對兩個FIFO的讀寫使能進行控制。首先在FIFO1的寫使能3.75ms有效后,開始進入5.85ms的等待時間,之后FIFO2的寫使能持續3.75ms有效,然后進入5.85ms的等待時間,依次循環。而FIFO2的讀使能在FIFO1寫使能有效結束,開始等待時間后有效,持續9.6ms,直到FIFO2的寫使能有效結束,FIFO2的讀使能依此類推。

圖8 乒乓操作輸出仿真圖

圖9 乒乓操作輸出測試圖
由圖8仿真圖可知,兩個FIFO模塊的輸出數據與輸入數據一致,并且兩個FIFO模塊之間的輸出連續,實現了數據的無縫傳輸,圖9測試圖則證明了仿真圖的正確性。
本文基于FPGA,利用其靈活設計、處理速度快的優點,設計了雙FIFO乒乓操作的數據緩沖電路,Modeslim仿真和Chipscope板上測試結果表明,所設計的模塊存儲速度快、可靠性較高,在串口輸入數據率為38.4KHz和處理模塊處理數據率15KHz條件下,實現了數據的連續無縫傳輸,確保了數據傳輸的正確性。