黃 旭,喬廬峰,陳慶華,吳艷華
(陸軍工程大學 通信工程學院,江蘇 南京 210001)
機載數(shù)據(jù)總線作為航空電子綜合系統(tǒng)的重要組成部分,用于機載設(shè)備和子系統(tǒng)之間的互聯(lián),承擔著各模塊之間信息交換的任務。隨著航空電子系統(tǒng)的不斷發(fā)展,對機載總線網(wǎng)絡(luò)的實時性和可靠性提出了更高要求。在以太網(wǎng)為基礎(chǔ)上發(fā)展起來的新型航空網(wǎng)絡(luò)AFDX是一種確定性網(wǎng)絡(luò)[1],可以滿足當前航空電子系統(tǒng)數(shù)據(jù)傳的容錯性、實時性和可靠性要求。在AFDX中,端系統(tǒng)(End System)是非常重要的組成部分,在航空電子子系統(tǒng)和交換網(wǎng)絡(luò)之間起到橋梁的作用。它負責將需要發(fā)送的數(shù)據(jù)流進行整形,然后按照分配好的虛擬鏈路(VL)發(fā)往目的終端[2]。虛擬鏈路作為端系統(tǒng)的核心,將一條物理鏈路分為多條VL。每條虛擬鏈路都有其獨立的參數(shù),通過這些參數(shù)的設(shè)置控制每條鏈路中數(shù)據(jù)的傳輸[3-4]。為了靈活、合理使用帶寬和存儲資源,本文設(shè)計了一種隊列管理器。該隊列管理器對每條虛擬鏈路單獨管理,從而確保業(yè)務流的服務質(zhì)量[5]。
為了對多條虛擬鏈路進行管理,且為了滿足AFDX中各虛擬鏈路之間幀傳輸時互不干擾的需求[6-7],設(shè)計了如圖1所示的隊列管理器。
圖1 隊列管理器結(jié)構(gòu)
隊列管理器主要分為以下幾個部分:自由指針隊列、多隊列管理器、緩沖區(qū)模塊、接口管理電路和寫預處理模塊。
(1)自由指針隊列。這個模塊存放著緩沖區(qū)模塊的地址,即自由指針。每當有一個信元寫入緩沖區(qū),需要從自由指針模塊取出自由指針。每當有數(shù)據(jù)完成讀操作,自由指針空閑出來,需要歸還到自由指針隊列。
(2)多隊列管理器。該模塊存放著每個隊列的相關(guān)信息,包括鏈表、頭尾指針信息、深度信息和預留門限等。
(3)緩沖區(qū)。該模塊是用來存放輸入端口傳輸進來的信元。調(diào)度器模塊也是從該模塊讀取信元。
(4)接口管理電路。該模塊在收到讀寫請求時,會判斷緩沖區(qū)是否滿足讀寫條件,若滿足則執(zhí)行操作,否則不執(zhí)行。此外,該模塊控制當前執(zhí)行的是讀或者寫操作,防止發(fā)生沖突。
(5)寫預處理模塊。該模塊從隊列管理器取出空閑指針,并將信元存往緩沖區(qū)指定地址中。
當新的業(yè)務流到達時,由前處理模塊發(fā)出輸入請求,同時告知業(yè)務流的編號。多隊列控制模塊會依據(jù)編號查詢?nèi)£犃行畔?,并判斷是否滿足繼續(xù)寫入數(shù)據(jù)的條件。若滿足條件,則操作流程如圖2所示。
圖2 數(shù)據(jù)寫入操作流程
以業(yè)務流編號為地址,多隊列管理電路會讀取該編號虛擬鏈路的相關(guān)信息,包括該隊列的信元深度、隊列預先設(shè)定的門限、頭尾信息以及剩余的共享緩存深度。接口管理電路根據(jù)這些信息判斷,當緩沖區(qū)中剩余的空間足夠裝下一個完整的數(shù)據(jù)幀時,則將輸入的數(shù)據(jù)寫入緩沖區(qū)。
本設(shè)計中隊列控制器需要對128條業(yè)務流進行管理。為了提高隊列管理器的靈活性,節(jié)約存儲資源,采用基于鏈表的存儲方式。如圖3所示,鏈表中的信元結(jié)構(gòu):2比特的信元指示位,16比特的下一跳的地址位。此外,鏈表的構(gòu)建需要用到隊列的頭尾信息,多隊列管理模中有一塊RAM用來存放鏈路的頭尾指針信息。
當上一級有數(shù)據(jù)輸入時,隊列管理器先從自由指針隊列取出一個自由指針,然后以業(yè)務流的編號ingress_qnr為地址,從多隊列管理模塊中查找該業(yè)務流所在隊列的頭尾信息。查找完成后,可以得到該隊列的尾指針地址。以尾指針為地址,將取出的自由指針寫入該隊列的鏈表中,同時更新頭尾指針信息和深度信息。最后,將信元寫入自由指針所指向的緩沖區(qū)。
圖3 鏈表
當某條鏈路需要讀取數(shù)據(jù)時,先以engress_qnr為地址,從多隊列管理模塊中讀取信息。經(jīng)接口管理電路判斷,若該鏈路的緩沖區(qū)中存有一個完整的數(shù)據(jù)幀,則以頭指針作為地址位讀取緩沖區(qū)中存儲的數(shù)據(jù)。完成讀取操作后更新鏈表,先從鏈表中讀出下一跳的地址。這是該隊列新的頭指針,然后更新多隊列管理模塊。完成表更新后進行指針歸還操作,即將完成讀操作的頭指針歸還到自由指針隊列。
緩沖區(qū)管理模塊是用來存儲輸入信元的模塊。本設(shè)計中的隊列管理器需要對128條虛擬鏈路進行管理和調(diào)度。為了更加靈活地管理128條隊列,緩沖區(qū)采用了固定分配和共享緩存兼容的緩沖方式,即緩沖區(qū)給每條虛擬鏈路預留部分緩沖空間,剩余的緩沖空間作為共享緩存。這種方式可以更加合理靈活地使用緩沖區(qū),從而提高緩沖區(qū)資源利用率。
當隊列控制模塊收到讀取數(shù)據(jù)的請求時,會同時接收到業(yè)務流的編號,根據(jù)業(yè)務流編號會對該業(yè)務流對應的隊列信息進行判斷。隊列控制器以業(yè)物流編號engress_qnr為地址,從多隊列管理器中讀取該隊列的相關(guān)信息,如隊列深度、隊列頭尾信息、隊列預留深度等。在存有一個完整數(shù)據(jù)幀的情況下,才可以發(fā)送數(shù)據(jù)。根據(jù)讀取的頭尾指針信息可以得到讀指針(engress_ptr),以讀指針為地址從緩沖區(qū)讀取信元,接口管理電路會將信元發(fā)送到調(diào)度器模塊。完成讀取流程后,需要更新鏈表和各信息模塊。此外,原先的頭指針在讀操作完成后成為自由指針,需要歸還到自由指針隊列。
系統(tǒng)完成復位后,先要進行自由指針隊列的初始化。圖4是自由指針初始化過程。當信號cfg_init置1的時候開始初始化配置,即將自由指針寫入相應的地址中。以自由指針0為例,初始化操作中使能信號wea置1,地址信號addra值為0,輸入信號dina值為0。這表示自由指針0寫入自由指針隊列地址為0的位置。當全部的自由指針寫入隊列后,自由指針隊列的初始化完成。其余的內(nèi)部模塊主要是將RAM內(nèi)個表項清零。
圖4 自由指針隊列初始化仿真結(jié)果
當上層數(shù)據(jù)進入隊列管理器時,要先判斷是否有足夠的緩存空間儲存新到達的數(shù)據(jù)幀。若滿足寫入條件,則將數(shù)據(jù)寫入緩沖區(qū);否則,丟包。如圖5所示,此時ingress_ptr_req為1,表示有信元申請寫入緩沖區(qū);ingress_qnr為100,表示信元來自編號為100的業(yè)務流。先讀取多隊列管理模塊中該隊列的相關(guān)信息,然后經(jīng)過接口管理模塊進行判斷。該通道緩沖空間為空,滿足寫入的條件,因此將信號ingress_ptr_ack置1,表示可以將信元寫入緩沖區(qū)。此時,將得到的自由指針4095賦值給寫指針ingress_ptr,然后以寫指針為地址將進入隊列管理器的信元寫入緩沖區(qū)中對應的位置。
圖5 寫數(shù)據(jù)仿真結(jié)果
當隊列管理器中有數(shù)據(jù)要被讀出時,隊列管理器會收到一個請求信號engress_ptr_req和業(yè)物流編號engress_qnr。此時,接口管理模塊會判斷該編號業(yè)務流的緩沖隊列中是否存有一個完整的數(shù)據(jù)幀。若滿足條件,則發(fā)送數(shù)據(jù);若不滿足,則不發(fā)送數(shù)據(jù)。如圖6所示,engress_qnr為100,engress_ptr_req為1,表示編號為100的業(yè)務流有數(shù)據(jù)要讀出,經(jīng)緩沖區(qū)判斷該業(yè)物流緩沖隊列中存有一個完整的數(shù)據(jù)幀。因此,將信號engress_ack置1,表示可以從緩沖區(qū)中讀取數(shù)據(jù)。指針engress_ptr的值為4095,所以從緩沖區(qū)該地址讀取信元。
圖6 讀數(shù)據(jù)仿真結(jié)果
每次完成一個信元的讀取操作都需要歸還自由指針。如圖7所示,此時虛擬鏈路號100的虛擬鏈路完成了一次讀操作,指針4095成為了自由指針,需要將其歸還到自由指針隊列。這時,將自由指針模塊的寫使能信號wea置1,空閑的地址位是4093,所以信號自由指針隊列的地址位addra值取4093,自由指針4095作為輸入信號dina。這表示將自由指針4095寫入自由指針隊列中地址為4093的位置。歸還自由指針操作完成,將寫使能信號置回0。
圖7 自由指針歸還仿真結(jié)果
本文針對AFDX這種確定型網(wǎng)絡(luò)設(shè)計了一種適用于多條虛擬鏈路的隊列管理器,并介紹了各部分的功能及其結(jié)構(gòu)。仿真證明,該隊列管理器能夠?qū)Χ讼到y(tǒng)中多條隊列實現(xiàn)單獨管理,并合理分配利用緩沖資源。下一步將結(jié)合調(diào)度器對該隊列管理器做進一步測試,檢測其時延和抖動方面的特性,以確保滿足確定型網(wǎng)絡(luò)AFDX的需求。