王 佩,徐 進,張愛林
(1.西安工程大學 電子信息學院,陜西 西安 710048;2.國網甘肅省電力公司檢修公司,甘肅 蘭州 737100)
IEEE1394協議是一種高速串行總線標準,該協議規定了事物層、鏈路層和物理層3個協議層[1].1394總線不僅節省空間,而且可替代多種巨大而昂貴的接口[2],因而應用范圍越來越廣,其技術也逐漸趨于完善.基于此,本文設計了一種IEEE1394事務層接口,目的是實現在PLB總線和139鏈路層之間進行數據傳輸.IEEE1394協議最初由Apple公司發布,后來經IEEE采納并進行規范,成為IEEE1394-1995標準,目前在工業應用領域中IEEE1394總線技術應用在航天領域、航空領域、工業測控領域以及軍事領域中,傳輸速度己經達到了每秒幾百兆以上[3].在民用領域中,IEEE1394技術主要集中應用在3個領域:家電行業、個人計算機行業和專業音視頻行業[4].該技術最先在國外發展起來,市場上國外設計的1394總線產品較多,國內近幾年才開始發展,技術還不夠成熟.
目前在PLB總線和1394鏈路層之間進行數據傳輸的設計中,對于數據異常發送和接收的處理方面做的還不夠完善.本文基于IEEE1394b協議[5]研究設計了一種事務層接口, 包括跨時鐘域數據訪問、數據位寬轉換、寄存器狀態控制等,對于數據異常的處理提出了一種解決方法,為1394總線事務層與鏈路層接口之間的數據傳輸提供了一種可行的設計方案,具有一定的實用價值.
1394事務層模塊連接了PLB總線和1394鏈路層模塊,主要完成1394總線事務層的數據發送和數據接收任務.由于事物層和鏈路層控制器采用的時鐘不同,在傳輸過程中需要進行時序的緩沖,所以事務層邏輯向鏈路層提供4組通用FIFO存儲器[6],分別用于異步數據包和等時數據包的收發緩存,實現了1394總線各種數據的收發操作.系統設計框圖如圖1所示.

圖1 事物層接口設計
事物層接口模塊包含PLB從接口、寄存器訪問接口和4個FIFO存儲器.這4個FIFO存儲器分別是異步發送FIFO、等時發送FIFO、異步接收FIFO、等時接收FIFO.異步發送FIFO和等時發送FIFO是一類,統稱為寫FIFO;異步接收FIFO和等時接收FIFO是一類,統稱為讀FIFO.這4種FIFO支持的PLB事務包括128位或64位單拍讀寫操作和四字突發讀寫操作.
PLB總線提供了一個高寬帶、低延遲、高性能的處理器內部總線,該總線接口單元從PLB主設備獨立的訪問連接到PLB總線接口上的從設備.
PLB總線從接口主要支持單拍讀寫和突發讀寫操作,可訪問以下4個地址空間:異步發送數據緩沖區、等時發送數據緩沖區、異步接收數據緩沖區和等時接收數據緩沖區.每片地址空間首地址支持硬件參數化配置.只支持單拍訪問寄存器地址空間,并且該空間首地址支持硬件參數化配置,數據訪問寬度是32位.由于包格式的不同,FIFO接口可支持33或34位寬,而PLB總線從接口的數據位寬是128位,所以每次PLB操作將寫入或讀出2個FIFO深度的數據.異步發送FIFO和等時發送FIFO深度均為4k,異步接收FIFO和等時接收FIFO深度均為8k.FIFO與PLB之間的數據有效位轉換關系如圖2所示.

圖2 FIFO與PLB的數據有效位轉換
通過異步發送FIFO接口,事務層發送邏輯可以控制鏈路層邏輯發送1394異步包.雖然只定義了一個FIFO接口,但是可以連接多個物理FIFO.在正常操作下,鏈路層邏輯會持續監測異步發送FIFO接口,便于發送數據,并在1394總線處于異步階段時,請求物理層去仲裁1394總線.整個異步發送過程如下所述:
當主機控制邏輯準備好一個異步包時,事務層發送FIFO控制邏輯設置ATFPktRdy(發送包準備)信號有效,請求鏈路層邏輯開始從異步發送FIFO中讀取、處理數據.當事物層邏輯檢測到ATFInc(讀取異步發送FIFO數據的指針增加控制信號)有效時,撤銷ATFPktRdy信號.鏈路層邏輯使用ATFPktRdy信號作為處理數據的開始,使用ATFEmpty信號來判斷FIFO中是否存在有效數據.
當鏈路層邏輯采樣到ATFPktRdy有效時,會檢查異步發送FIFO中的第一個數據是否有效,若有效,鏈路層向物理層發出請求,所有的數據包會使用優先級仲裁.鏈路層邏輯在發完請求之后,會等待來自物理層的應答.當鏈路層檢測到物理層取消了當前請求,鏈路層邏輯會重新發起請求.直到接收到來自物理層的應答,鏈路層邏輯才會驅動物理層與鏈路層之間的數據傳輸接口處于保持狀態,開始準備數據發送.
每當鏈路層邏輯處理完一個異步發送FIFO字時,ATFInc信號有效一個周期,即讀FIFO數據指針加1,在下一個時鐘周期,有效的新FIFO數據將被發送.鏈路層邏輯會持續檢查ATFEmpty信號和FIFO中的包標識位.當ATFEmpty信號有效時會發生Underrun的情況,鏈路層邏輯將放棄物理層與鏈路層之間的接口控制權.當鏈路層邏輯檢測到FIFO中的包標識位時,則認為當前這個字是發送狀態字,上一個字是數據包的最后一個字,鏈路層邏輯隨后會放棄物理層與鏈路層之間的接口控制權.當完成異步包的發送后,鏈路層邏輯會等待來自物理層的響應包.當收到響應包,鏈路層將異步數據發送完成的返回信號和異步包對應的狀態字上報給事務層邏輯,便于事務層邏輯辨認該返回信息是屬于之前的哪一個發送包.
通過等時發送FIFO接口,事務層發送邏輯可以控制1394鏈路層發送等時包.盡管這個接口被定義成一個FIFO接口類型,但是這個接口可以連接多個物理FIFO.1394總線上的等時操作都是由等時周期開始包來統一控制的.當事務層發送、鏈路層接收到一個等時周期開始包,鏈路層邏輯就開始將一個周期內規劃好的等時包發送到1394總線上.整個等時發送過程如下所述:
當主機控制邏輯準備好一個等時包時,事務層發送FIFO控制邏輯設置ITFPktRdy(發送包準備)信號有效,請求鏈路層邏輯開始從等時發送FIFO中讀取、處理數據.當事務層邏輯檢測到ITFInc(讀取等時發送FIFO數據的指針增加控制信號)有效時,撤銷該信號.ITFEmpty信號用于判斷在等時發送FIFO中是否存在數據.
當鏈路層邏輯檢測到ITFPktRdy信號有效時,會從等時發送FIFO中取出第一個字檢查數據的有效性,若有效,鏈路層會向物理層發起請求,然后等待來自物理層的應答.在發送等時包前,事務層需向等時發送FIFO中填入一個周期隔離字,用于標識每個等時周期待發數據包的界限.當鏈路層檢測到物理層取消了當前的請求,鏈路層邏輯會重新發起請求.一旦檢測到來自物理層的授權應答,鏈路層邏輯將驅動物理層與鏈路層之間的接口為保持狀態,開始準備發送數據.
每當鏈路層邏輯處理完一個等時發送FIFO字時,鏈路層邏輯會驅動ITFInc有效一個周期,表明在下一個時鐘周期讀取的新FIFO數據有效.鏈路層邏輯持續檢查ITFEmpty信號和FIFO包標志位.當ITFEmpty信號有效時會發生Underrun情況,鏈路層邏輯將放棄物理層與鏈路層之間的接口控制權.當鏈路層邏輯檢測到FIFO中的包標識位時,則認為當前這個字是發送狀態字,上一個字是數據包的最后一個字,鏈路層邏輯隨后會放棄物理層與鏈路層之間的接口控制權.
當完成等時包的發送后,鏈路層邏輯會檢查等時發送FIFO中下一個字是周期隔離字,還是當前等時周期待發送的下一個等時包.若是等時周期隔離字,表示在當前等時周期中不再需要發送等時包,即鏈路層已經處理完成當前的等時周期,反之表明當前等時周期內還需要繼續發送等時包.
Underrun情況是指:在鏈路層邏輯從發送FIFO中取數的過程中,鏈路層邏輯的讀取速率大于事務層邏輯的填寫速率,即鏈路層邏輯還沒有讀取一個完整的包,發送FIFO中就已經沒有數據了,致使1394總線上出現一個不完整的錯誤幀,最終導致總線效率降低.為防止此情況發生,本設計先將足夠多的數據填入發送FIFO中,當鏈路層以一定的速率開始讀取數據時,主機發送控制邏輯能夠及時、連續提供發送數據,并避免發送FIFO空,產生錯誤幀.
發送FIFO每次只填寫一幀待發數據,發送完成之后FIFO讀寫指針歸零.當事物層邏輯、軟件檢測到發送FIFO發生Underrun、包頭字數錯誤、包頭事務代碼錯誤時,鏈路層邏輯會產生中斷信號,通知主機對發送FIFO進行flush操作,即產生一個系統時鐘周期的高電平脈沖信號,結束異常發送過程,同時復位發送FIFO及其周圍的邏輯,然后清除中斷.在flush操作結束前,發送邏輯不會向1394總線上發送任何數據包.
存儲在異步發送FIFO中的包與1394總線上傳輸的包格式不太一樣.異步發送FIFO輸出33位數據總線,32位寬的異步發送數據線,第33位為1用于標識異步發送FIFO包格式的開始和結束,即包的第一個字和最后一個字,包的其余字段此位為0.
存儲在等時發送FIFO中的包與1394總線上傳輸的包格式不太一樣.等時發送FIFO輸出34位數據總線.32位寬的等時發送數據線,第33位為1用于標識等時發送FIFO包格式的開始和結束,即包的第一個字和最后一個字,包的其余字段此位為0.第34位是等時周期隔離字標識位,為1時,表示在當前等時周期中不再需要發送等時包,即鏈路層已經處理完成當前的等時周期;為0時,表明當前等時周期內還需要繼續發送等時包.
通過異步包接收FIFO接口,1394鏈路層IP可以將1394總線上接收到的異步包,寫入到事務層的異步包接收FIFO中.通過等時包接收FIFO接口,1394鏈路層IP可以將1394總線上接收到的等時包,寫入到事務層的等時包接收FIFO中.整個接收過程如下所述:
當鏈路層邏輯檢測到物理層與鏈路層之間的接口有數據前綴時,接收邏輯就開始工作.首先會把接口的速度鎖存住,然后把接收到的數據轉換成32位數據.當接收邏輯收集到1394總線上的第一個32位數據時,會對內容進行解析.對于異步包,若其目標節點ID與鏈路層的節點ID寄存器內容相匹配,目標總線ID與鏈路層的總線ID寄存器內容相匹配,則將這幀數據傳遞給事物層接收邏輯.對于等時包,若其通過了等時接收通道檢查,則數據包會被傳遞給事物層接收邏輯.當鏈路層把第一個32位數據寫入接收FIFO時,需要把接收FIFO內的第32位置1,表明這是一個幀的開始數據.如果接收包是異步非廣播包,鏈路層會向物理層發起立即請求,用于發送響應包.
在接收數據包的包頭過程中,接收FIFO始終有空間的前提下,所有包頭字將被寫入接收FIFO中,若接收到包頭不完整或包頭CRC校驗碼錯誤的數據包以及發生了接收FIFO幾乎滿事件,則后續數據負載不會被寫入接收FIFO中,同時放棄此次接收并對已寫入接收FIFO的數據進行Backup操作.
在接收數據包數據負載過程中,每接收一個字就進行一次Update操作.若出現了接收FIFO幾乎滿狀態,接收狀態機就會停止向接收FIFO寫入數據,之前被寫入的數據負載不會被丟棄,所剩最后一個字節會被填入狀態字.當接收FIFO滿,鏈路層會丟棄正在接收的來自物理層的數據包,如果該數據包要求返回響應包,則事物層邏輯產生忙響應包輸出給發送模塊再發送至物理層.接收邏輯會對數據負載進行CRC校驗,若出現校驗碼錯誤,數據仍寫入接收FIFO中,但會產生相應的中斷信號,通過中斷狀態寄存器向主機報告錯誤.
若接收到的數據負載實際長度大于包頭中的數據長度,將在接收完包頭數據長度的數據負載后認為下一個數據是CRC校驗碼,可能會產生校驗碼錯誤;若數據負載實際長度小于包頭中的數據長度,將正常結束接收操作,主機可以通過比較包頭數據長度與實際負載長度得知此情況.
Update操作指更新接收FIFO,即鏈路層邏輯需要表明前一個和當前接收到的字是有效的FIFO控制字,其中接收包頭數據是整體更新一次,而數據負載和狀態字都是每字更新一次.Backup操作指將接收FIFO的寫指針指向最初開始接收這幀數據的位置,即拋棄接收到的數據.當鏈路層邏輯檢測到接收數據包頭存在CRC錯誤時,接收控制邏輯放棄之前已經寫入接收FIFO的數據,并把接收指針歸位.對于讀FIFO,當出現Backup,所有未Update的數據將被放棄.
異步接收FIFO接收32位寬的異步數據線,在第33位填入包標志位,為1表示包的第一個字和最后一個字,包的其余字段此位填0.第34位置1表示該字是總線復位標識字或是自標識包.等時接收FIFO接收32位寬的等時數據線,向第33位填入等時周期開始包的標識字,通知事物層邏輯收到的等時包屬于哪個等時周期,或者標識等時包的第一個和最后一個字.
主機通過這個接口訪問鏈路層邏輯的寄存器.1394鏈路層模塊寄存器分為DCR(設備配置)寄存器和PLB(處理器局部總線)寄存器.DCR寄存器主要是鏈路層內核寄存器,PLB寄存器主要是FIFO控制和狀態寄存器.主機訪問寄存器接口的時序是一個異步時序,即主機訪問寄存器的時鐘與寄存器內部使用的時鐘完全異步.所以無論讀、寫操作,都會有一個操作完成的標識.對于讀操作,只有檢測到SRWComplete信號為高脈沖,才能安全的讀取同步過來的數據,只有在上一次操作徹底完成的情況下,才能發起下一次讀寫操作.主機訪問寄存器接口時序如3所示.
事務層邏輯需要發送異步數據時,需要先將足夠的數據填入異步發送FIFO中,才能夠使能ATFPktRdy信號,當檢測到ATFInc信號為高電平,撤銷ATFPktRdy信號使能.每次ATFInc信號為高電平,即讀數據指針增1時,在下一個時鐘正跳變時,異步FIFO中待發送數據將被輸出.

圖3 主機訪問寄存器接口時序圖
事務層需要發送等時數據時,需要先將足夠的數據填入等時發送FIFO中,才能夠使能ITFPktRdy,當檢測到ITFInc為高電平,撤銷ITFPktRdy信號使能.每次ITFInc信號為高電平,即讀數據指針增1時,在下一個時鐘正跳變時,等時FIFO中待發送數據將被輸出.
異步包的接收分為2個部分:包頭的接收和包負載的接收.在包頭的接收過程中,每個接收包頭字沒有立即被寫入接收FIFO,只有在正確接收包頭完成之后,才能通過Update信號真正使數據被寫入FIFO.而在接收包負載的過程中,每個接收負載字會被立即寫入接收FIFO中.一旦在接收的過程中,出現了Backup操作,則接收FIFO的寫指針必須要能夠回到接收當前幀的起始位置.
等時包的接收分為2個部分:包頭的接收和包負載的接收.在包頭的接收過程中,每個接收包頭字沒有立即被寫入接收FIFO,只有在正確接收包頭完成之后,才能通過Update信號真正使數據被寫入FIFO.而在接收包負載的過程中,每個接收負載字會被立即寫入接收FIFO中.一旦在接收的過程中,出現了Backup操作,則接收FIFO的寫指針必須要能夠回到接收當前幀的起始位置.
文中設計的1394事物層接口不僅對數據位寬進行了有效轉換,且采用FIFO存儲器解決了鏈路層和事物層時鐘異步的問題,并對事物層控制邏輯操作過程進行了詳細設計提出了一種針對數據異常情況下的處理方法,通過對寄存器的設置不僅實現數據流的有效控制,并能獲取當前的狀態信息,實現事務層與鏈路層的數據通信,提高數據的傳輸效率.最后采用QuestaSim軟件進行仿真驗證,從仿真時序圖中可以得出事物層接口基本實現了事物層模塊正常發送和接收數據包的功能.
參考文獻:
[1] 汪國有,何曉翔,王志勉.基于FPGA的IEEE1394鏈路層控制器的設計與實現[J].紅外與激光工程,2004,33(5):553-556.
[2] 李肇慶,朱險峰.IEEE1394接口技術[M].北京:國防工業出版社,2004:7-12.
[3] 高旭光.基于IEEE1394總線的高速信息傳輸設備的設計[D].保定:河北大學,2010:4-9.
[4] 楊慶勇,劉方,張覃平,等.基于IEEE 1394接口的圖像傳輸控制器設計[J].儀器儀表用戶,2008,3(11):41-43.
[5] IEEE Std.1394bTM—2002,IEEE Standard for a High Performance Serial Bus-Amendment 2[S].New York:IEEE Computer Society,2002.
[6] 楊麗君,張盛兵,楊可,等.1394鏈路層控制器等時傳輸模式的設計[J].計算機測量與控制,2012,20(3):800-803.