王雷淘,喬廬峰,續(xù) 欣
(陸軍工程大學(xué) 通信工程學(xué)院,江蘇 南京 210001)
網(wǎng)絡(luò)技術(shù)的飛速發(fā)展帶來(lái)了網(wǎng)絡(luò)流量的爆炸式增長(zhǎng),衛(wèi)星通信以其廣闊的覆蓋范圍、穩(wěn)定可靠的性能、靈活機(jī)動(dòng)的接入、大容量寬頻帶、成本對(duì)距離不敏感等優(yōu)點(diǎn),在全球互聯(lián)網(wǎng)中扮演著愈加重要的角色[1-3]。星載路由器的一大特點(diǎn)在于其帶寬和存儲(chǔ)資源十分珍貴。DDR3 以其存儲(chǔ)容量大、讀寫(xiě)速度快等特點(diǎn),越來(lái)越多的被應(yīng)用于路由器中隊(duì)列管理器的設(shè)計(jì)當(dāng)中[4]。常見(jiàn)的基于DDR3 的隊(duì)列管理器中,都采取將數(shù)據(jù)實(shí)際存入DDR3 中,將地址指針?biāo)腿腙?duì)列控制器中的鏈表建立虛擬出口隊(duì)列的方式[5]。然而,當(dāng)需要讀出數(shù)據(jù)時(shí),輸出電路僅能從隊(duì)列中獲取待輸出數(shù)據(jù)包存儲(chǔ)位置的起始地址指針,而無(wú)法獲取數(shù)據(jù)包的實(shí)際長(zhǎng)度,在實(shí)際操作時(shí),需要暫停DDR3 的讀操作以獲取數(shù)據(jù)包長(zhǎng)度信息,這無(wú)疑降低了DDR3 的讀寫(xiě)效率,影響了整個(gè)路由器的傳輸性能。一種解決方法是利用長(zhǎng)度信息SRAM,將每一個(gè)數(shù)據(jù)包的長(zhǎng)度信息存儲(chǔ)其中,在獲取待讀出數(shù)據(jù)包的起始地址指針時(shí),從該SRAM中讀出數(shù)據(jù)包的長(zhǎng)度信息,將其同起始地址指針一起送往DDR3 控制器,從而實(shí)現(xiàn)數(shù)據(jù)包的連續(xù)讀出。但是,針對(duì)于星載路由器存儲(chǔ)資源十分珍貴這一特點(diǎn),這種解決方式明顯并不適合。
本文在上述分析的基礎(chǔ)上,基于FPGA 硬件平臺(tái),設(shè)計(jì)了一種基于DDR3 的星載路由器的隊(duì)列管理器。隊(duì)列管理器通過(guò)調(diào)用片外DDR3 作為數(shù)據(jù)存儲(chǔ)區(qū),增大了緩沖區(qū)容量,并設(shè)置共享存儲(chǔ)區(qū),可以有效應(yīng)對(duì)突發(fā),提高了抗流量波動(dòng)的能力。在本電路中,本文采取了一種可以連續(xù)對(duì)多個(gè)讀出請(qǐng)求進(jìn)行操作的設(shè)計(jì)方案,保證了DDR3 的連續(xù)讀寫(xiě)。同時(shí),為了減少存儲(chǔ)地址指針時(shí)的資源消耗,本電路采用了基于大數(shù)據(jù)塊的存儲(chǔ)區(qū)分配方式,將存儲(chǔ)區(qū)分為了16 384 塊大小相同的存儲(chǔ)塊,使用塊指針加上塊內(nèi)信元指針的方式對(duì)數(shù)據(jù)包進(jìn)行尋址,并設(shè)置了基于sram 的指針緩沖區(qū)[6]。本文將進(jìn)一步詳細(xì)介紹其具體的設(shè)計(jì)與實(shí)現(xiàn)方式。
系統(tǒng)的硬件架構(gòu)包括前級(jí)的預(yù)處理電路、查找引擎,后級(jí)的輸出調(diào)度器和輸出合路電路等,如圖1 所示。
圖1 系統(tǒng)邏輯架構(gòu)
在圖1 中,輸入至該系統(tǒng)的數(shù)據(jù)流首先經(jīng)過(guò)合路電路和查找引擎進(jìn)行預(yù)處理,而后送入隊(duì)列管理器。在預(yù)處理過(guò)程中,電路會(huì)對(duì)數(shù)據(jù)流進(jìn)行分類(lèi),傳統(tǒng)的流分類(lèi)策略主要是依據(jù)數(shù)據(jù)包報(bào)文頭中的五元組(源IP 地址、目的IP 地址、源MAC 地址、目的MAC 地址和協(xié)議種類(lèi)),這種分類(lèi)方式實(shí)現(xiàn)簡(jiǎn)單、判定速度快,適于硬件實(shí)現(xiàn)。
經(jīng)過(guò)分類(lèi)的數(shù)據(jù)流,會(huì)在數(shù)據(jù)包報(bào)文頭頭前面增加一個(gè)本地頭,其中包含了包長(zhǎng)、輸入輸出端口號(hào)、所屬隊(duì)列號(hào)(FLOW_ID)等信息。
在網(wǎng)絡(luò)流量管理中,主要存在兩個(gè)關(guān)鍵機(jī)制:一個(gè)是對(duì)不同應(yīng)用或協(xié)議對(duì)應(yīng)的業(yè)務(wù)流進(jìn)行區(qū)分的流量分類(lèi)機(jī)制;另一個(gè)則是用于實(shí)現(xiàn)對(duì)數(shù)據(jù)包的緩沖管理、基于流的排隊(duì)管理、輸出調(diào)度和輸出速度控制的隊(duì)列管理機(jī)制。
本電路使用的隊(duì)列管理器邏輯模型如圖2 所示。
圖2 隊(duì)列管理器邏輯模型
其主體結(jié)構(gòu)為多個(gè)相互獨(dú)立的鏈表隊(duì)列,不同的隊(duì)列分別對(duì)應(yīng)于特定的協(xié)議或應(yīng)用,隊(duì)列之間使用在預(yù)處理電路中生成并放置于本地頭中的隊(duì)列好(FLOW_ID)進(jìn)行區(qū)分。FLOW_ID 的數(shù)值范圍可以根據(jù)業(yè)務(wù)的實(shí)際需求進(jìn)行動(dòng)態(tài)調(diào)整,最大可同時(shí)對(duì)數(shù)千個(gè)隊(duì)列進(jìn)行管理??紤]到星載路由器存儲(chǔ)資源十分珍貴的特點(diǎn),本電路采用DDR3 作為隊(duì)列管理器的數(shù)據(jù)緩沖區(qū),從而在盡量降低片內(nèi)資源消耗的同時(shí),保證了數(shù)據(jù)緩沖空間的大小,實(shí)現(xiàn)對(duì)大量隊(duì)列的精確管理。
針對(duì)于隊(duì)列管理器,具體的電路細(xì)節(jié)如圖3 所示,其中包括寫(xiě)入預(yù)處理電路、自由指針管理電路、隊(duì)列控制電路、DDR3 控制器。
圖3 隊(duì)列管理器的電路結(jié)構(gòu)
其中,需要特別說(shuō)明的是,針對(duì)自由指針管理電路,其主要負(fù)責(zé)維護(hù)系統(tǒng)當(dāng)前所有可以使用的地址指針,同時(shí)執(zhí)行地址指針的分發(fā)和回收功能。
本電路中采用基于塊的存儲(chǔ)區(qū)分配,使用塊指針和塊內(nèi)指針聯(lián)合尋址的方式存儲(chǔ)數(shù)據(jù)包。數(shù)據(jù)存儲(chǔ)在DDR3 中,鏈表隊(duì)列中實(shí)際排隊(duì)的是使用的是數(shù)據(jù)包對(duì)應(yīng)的塊指針,因此自由指針管理電路中僅需使用128 k 大小的sram 即可存儲(chǔ)全部的塊指針,大大降低了自由指針管理電路存儲(chǔ)地址指針時(shí)的存儲(chǔ)資源消耗。
本文所設(shè)計(jì)的隊(duì)列管理器具有以下幾個(gè)特點(diǎn):
(1)對(duì)于每一隊(duì)列,都預(yù)先保留了一定大小的緩沖區(qū)。同時(shí)設(shè)立共享緩存區(qū),可供個(gè)別隊(duì)列在私有存儲(chǔ)區(qū)耗盡時(shí)申請(qǐng)使用,避免丟包;
(2)使用片外存儲(chǔ)器DDR3 作為數(shù)據(jù)緩存區(qū),極大的并提高了存儲(chǔ)容量。同時(shí)以塊為單位對(duì)DDR3 進(jìn)行劃分并分配指針,使用塊所對(duì)應(yīng)的指針以鏈表的形式構(gòu)建邏輯隊(duì)列,降低存儲(chǔ)地址指針時(shí)的存儲(chǔ)資源消耗,并降低了讀寫(xiě)數(shù)據(jù)包時(shí),打開(kāi)不同bank、行時(shí)的額外時(shí)間消耗;
(3)在DDR3 控制器中,將讀數(shù)據(jù)和分析本地頭的工作分開(kāi)進(jìn)行,使得DDR3 控制器可以連續(xù)處理多個(gè)讀請(qǐng)求,實(shí)現(xiàn)了DDR3 的連續(xù)讀寫(xiě),進(jìn)而提高了路由器的傳輸性能。
隊(duì)列管理器的設(shè)計(jì)往往要求具備一定的抗流量抖動(dòng)能力。假設(shè)在某一時(shí)刻,某一個(gè)或某幾個(gè)隊(duì)列對(duì)應(yīng)的數(shù)據(jù)流連續(xù)突發(fā),而隊(duì)列管理器又無(wú)法及時(shí)輸出時(shí),則需要為這些隊(duì)列分配額外更多的存儲(chǔ)資源,這對(duì)緩沖空間的大小提出了更高的要求。同時(shí),在隊(duì)列管理器中,數(shù)據(jù)實(shí)際存儲(chǔ)在緩沖區(qū)中,緩沖區(qū)的讀寫(xiě)速度也就決定了隊(duì)列管理器的吞吐率上限。
由于DDR3 存儲(chǔ)容量大、讀寫(xiě)速度快等優(yōu)點(diǎn),本電路采用DDR3 作為片外存儲(chǔ)區(qū)。DDR3 為了提高讀寫(xiě)的效率,采取了突發(fā)操作,在突發(fā)長(zhǎng)度為8,位寬為64 bits 的情況下,一次突發(fā)操作可以寫(xiě)入或者讀出64 字節(jié)的數(shù)據(jù)。在寫(xiě)預(yù)處理電路中完成了將經(jīng)過(guò)的數(shù)據(jù)包包長(zhǎng)填充為64 字節(jié)的整數(shù)倍,并將一個(gè)數(shù)據(jù)包劃分為了多個(gè)長(zhǎng)度為64 字節(jié)的信元的操作,這樣,一次突發(fā)即可完成一個(gè)信元的寫(xiě)入或者讀出操作。本電路采用的基于塊的存儲(chǔ)區(qū)分配,即將存儲(chǔ)區(qū)劃分為16 384 個(gè)大小相同的存儲(chǔ)塊,每個(gè)存儲(chǔ)塊對(duì)應(yīng)一個(gè)塊指針,在塊內(nèi)使用塊內(nèi)指針進(jìn)行尋址,當(dāng)數(shù)據(jù)包輸入時(shí),實(shí)際存儲(chǔ)在DDR3 中,然后將其對(duì)應(yīng)的塊指針?biāo)腿腈湵碇薪⑻摂M輸出隊(duì)列。如圖4 所示。
圖4 基于塊的存儲(chǔ)區(qū)分配
在寫(xiě)入預(yù)處理電路中設(shè)置了兩塊sram 存儲(chǔ)各隊(duì)列的詳細(xì)信息,包括首尾塊指針、首尾塊內(nèi)指針等。由于在存儲(chǔ)塊內(nèi),信元總是按順序存儲(chǔ),因此每次寫(xiě)入或讀出數(shù)據(jù)包時(shí),只需要根據(jù)該隊(duì)列的隊(duì)列編號(hào),從寄存器中獲取對(duì)應(yīng)的首尾塊指針和塊內(nèi)指針,即可迅速定位到該隊(duì)列的首尾位置,進(jìn)行讀寫(xiě)操作。而每個(gè)數(shù)據(jù)包本地頭中都包含有該包長(zhǎng)度,在每次讀寫(xiě)操作完成后,可以很方便的對(duì)首尾指針進(jìn)行更新。
同時(shí),由于DDR3 的讀寫(xiě)特性,每次讀寫(xiě)時(shí)需要按照順序打開(kāi)存儲(chǔ)數(shù)據(jù)的所在bank、行、列,消耗一定的時(shí)鐘周期,按照通常的存儲(chǔ)方式,即有可能出現(xiàn)同一個(gè)數(shù)據(jù)包存儲(chǔ)在不同行、不同bank 的情況,在讀寫(xiě)時(shí)消耗額外大量的時(shí)鐘周期。通過(guò)劃分大塊存儲(chǔ)區(qū)的方式,基本可以保證同一個(gè)數(shù)據(jù)包的數(shù)據(jù)存儲(chǔ)在相同bank 的相同行內(nèi),避免了讀寫(xiě)時(shí)在不同bank 和行之間切換,有利于提高DDR3的讀寫(xiě)效率,進(jìn)而提高系統(tǒng)的吞吐率。
系統(tǒng)上電之后,DDR3 控制器首先需要對(duì)DDR3進(jìn)行初始化操作。初始化完成后,即可按照?qǐng)D5 所示的工作流程開(kāi)始數(shù)據(jù)包的輸入操作。
圖5 寫(xiě)入工作流程
數(shù)據(jù)包經(jīng)過(guò)預(yù)處理電路后到達(dá)隊(duì)列管理器時(shí),包頭前加裝了本地頭,其中包含了隊(duì)列編號(hào)、出端口位圖、包長(zhǎng)等信息。寫(xiě)入預(yù)處理電路根據(jù)數(shù)據(jù)流的隊(duì)列編號(hào)(Flow ID),從存儲(chǔ)隊(duì)列信息的sram中獲取該隊(duì)列的首指針地址、尾指針地址、隊(duì)列深度等詳細(xì)信息,如果當(dāng)前隊(duì)列長(zhǎng)度(已使用存儲(chǔ)區(qū))沒(méi)有超過(guò)私有存儲(chǔ)區(qū),則直接進(jìn)行指針獲取、數(shù)據(jù)寫(xiě)入、隊(duì)列信息更新的流程。若已經(jīng)超過(guò)私有存儲(chǔ)區(qū),則轉(zhuǎn)而向共享緩存區(qū)域申請(qǐng)存儲(chǔ)資源,申請(qǐng)成功后,才能繼續(xù)進(jìn)行后續(xù)的操作。
讀出操作與寫(xiě)入操作類(lèi)似,如圖6 所示。
圖6 輸出工作流程
當(dāng)有鏈表隊(duì)列中有完整數(shù)據(jù)包可以輸出時(shí),調(diào)度器根據(jù)其隊(duì)列編號(hào)從隊(duì)列信息寄存器中獲取首尾指針等信息,并判斷,若當(dāng)前存儲(chǔ)塊已經(jīng)讀空,則向鏈表隊(duì)列申請(qǐng)新的塊指針,歸還當(dāng)前塊地址給自由指針電路,并更新鏈表信息,將新的塊指針和塊內(nèi)指針?biāo)腿隓DR3 控制器,若當(dāng)前存儲(chǔ)塊尚未讀空,則將當(dāng)前塊指針和塊內(nèi)指針?biāo)腿隓DR3 控制器。DDR3 控制器根據(jù)讀請(qǐng)求和地址指針,將數(shù)據(jù)包從DDR3 中讀出,最后更新隊(duì)列信息。
在DDR3 控制器根據(jù)讀請(qǐng)求從DDR3 中讀數(shù)據(jù)時(shí)存在一個(gè)問(wèn)題,即跟隨讀請(qǐng)求一同送入的地址指針僅指示了等待讀取的數(shù)據(jù)包在DDR3 中的起始地址,并不攜帶數(shù)據(jù)包的長(zhǎng)度信息,控制器也就無(wú)法確定要從DDR3 中讀取多少數(shù)據(jù)。因此,控制器在從DDR3 中讀出第一個(gè)信元后,需要暫停讀出操作,從首信元中分離出本地頭,進(jìn)而獲取數(shù)據(jù)包的長(zhǎng)度信息,然后再繼續(xù)執(zhí)行讀操作,將數(shù)據(jù)包的剩余信元完全讀出。在分離本地頭、獲取長(zhǎng)度信息的這個(gè)過(guò)程中,DDR3 的讀操作處于停滯狀態(tài),降低了其讀寫(xiě)效率,對(duì)于路由器的吞吐率造成了一定的影響。一種解決方案是利用sram 將各數(shù)據(jù)包的長(zhǎng)度信息都存儲(chǔ)起來(lái),當(dāng)發(fā)出讀信號(hào)時(shí),將數(shù)據(jù)包對(duì)應(yīng)的長(zhǎng)度信息同地址指針一同送入DDR3 控制器中,這樣雖然解決了DDR3 連續(xù)讀寫(xiě)的問(wèn)題,但當(dāng)存儲(chǔ)的數(shù)據(jù)包較多時(shí),存儲(chǔ)各數(shù)據(jù)包的長(zhǎng)度信息需要消耗額外大量的存儲(chǔ)資源。
對(duì)于調(diào)用DDR3 作為片外存儲(chǔ)區(qū)的電路而言,DDR3 的帶寬決定了本電路吞吐率的上限,因此,保證DDR3 的連續(xù)讀寫(xiě)是提高電路性能的關(guān)鍵。在數(shù)據(jù)包讀出時(shí),DDR3 控制器依據(jù)從隊(duì)列中讀出的塊指針和塊內(nèi)指針對(duì)數(shù)據(jù)包進(jìn)行讀出操作,由于隊(duì)列和隊(duì)列信息sram 中不包含數(shù)據(jù)包長(zhǎng)度的實(shí)際情況,DDR3 控制器需要在讀出數(shù)據(jù)包首信元后暫停對(duì)DDR3 的讀請(qǐng)求,從首信元的本地頭中分析出數(shù)據(jù)包總長(zhǎng)度,然后再繼續(xù)從DDR3 中讀出數(shù)據(jù)包的剩余信元,在分析首信元這一過(guò)程中,DDR3 讀操作一度處于停滯狀態(tài),大大降低了DDR3 的讀寫(xiě)效率。本文提出并實(shí)現(xiàn)了一種將讀出信元和分析首信元的工作分開(kāi),可以連續(xù)處理多個(gè)讀信號(hào)的DDR3控制器設(shè)計(jì)方案,保證當(dāng)有讀寫(xiě)請(qǐng)求時(shí),DDR3 可以連續(xù)讀寫(xiě),不存在停滯,同時(shí)避免了消耗額外的資源去存儲(chǔ)各數(shù)據(jù)包的長(zhǎng)度信息。
經(jīng)過(guò)分析發(fā)現(xiàn),在對(duì)首信元進(jìn)行分析獲取包長(zhǎng)的這段時(shí)間內(nèi),DDR3 并不是無(wú)法進(jìn)行讀操作,而是無(wú)法繼續(xù)進(jìn)行當(dāng)前數(shù)據(jù)包后續(xù)信元的讀操作。因此,我們可以考慮讓DDR3 控制器在對(duì)某數(shù)據(jù)包的首信元進(jìn)行分析的過(guò)程中,暫時(shí)擱置對(duì)該數(shù)據(jù)包的讀操作,先對(duì)后續(xù)的讀請(qǐng)求進(jìn)行應(yīng)答,讀出相應(yīng)的信元,等到有首信元分析完畢時(shí),再來(lái)繼續(xù)讀出該數(shù)據(jù)包的剩余信元。DDR3 控制器其結(jié)構(gòu)圖如圖7所示。
圖7 DDR3 控制器結(jié)構(gòu)
本電路中將DDR3 控制器主要分為讀請(qǐng)求處理模塊和信元處理模塊兩部分。讀請(qǐng)求處理模塊負(fù)責(zé)根據(jù)調(diào)度器發(fā)來(lái)的讀請(qǐng)求和信元處理模塊發(fā)來(lái)的后續(xù)信元讀請(qǐng)求,從DDR3 中讀出數(shù)據(jù),信元處理模塊則負(fù)責(zé)對(duì)從DDR3 中讀出的信元進(jìn)行判斷,若是首信元,則先存入首信元緩沖中,分析獲取包頭等信息,形成后續(xù)信元讀請(qǐng)求,送入讀請(qǐng)求處理模塊,若不是首信元,則送入輸出緩沖中等待輸出。具體的工作流程如圖8 所示。
圖8 DDR3 工作流程
讀請(qǐng)求處理處理模塊對(duì)調(diào)度器發(fā)出的讀請(qǐng)求和信元處理模塊發(fā)出的讀請(qǐng)求進(jìn)行輪詢(xún)監(jiān)測(cè)。對(duì)于調(diào)度器發(fā)出的讀請(qǐng)求,讀請(qǐng)求處理模塊根據(jù)地址指針,從DDR3 中讀出數(shù)據(jù)包首信元,而后暫時(shí)擱置該數(shù)據(jù)包的讀操作,繼續(xù)處理其他讀請(qǐng)求;對(duì)于信元處理模塊發(fā)出的讀請(qǐng)求,讀請(qǐng)求處理模塊根據(jù)地址指針和包長(zhǎng)信息,可以從DDR3 中讀出數(shù)據(jù)包的全部剩余信元,完成數(shù)據(jù)包的讀操作。
信元處理模塊則時(shí)刻對(duì)DDR3 緩沖進(jìn)行監(jiān)測(cè),當(dāng)其中有數(shù)據(jù)時(shí)進(jìn)行判斷,若是首信元,且不是單信元數(shù)據(jù)包,則開(kāi)始進(jìn)行分離本地頭、獲取包長(zhǎng)信息、生成后續(xù)信元讀請(qǐng)求的操作;若是首信元且是單信元數(shù)據(jù)包,表示該數(shù)據(jù)包已經(jīng)輸出完畢,可以直接將其送入輸出緩沖中等待輸出;若不是首信元,表示讀請(qǐng)求處理模塊正在完成某數(shù)據(jù)包剩余信元的讀出工作,則將該數(shù)據(jù)包的首信元和后續(xù)信元一起送入輸出緩沖中,等待輸出。
本設(shè)計(jì)通過(guò)將處理讀信號(hào)和分析首信元的工作分入兩個(gè)模塊進(jìn)行,使得控制器可以連續(xù)處理多個(gè)讀請(qǐng)求,避免DDR3 讀操作進(jìn)入停滯狀態(tài),保障了DDR3 的讀寫(xiě)效率,提高了電路的傳輸性能。
本設(shè)計(jì)中,隊(duì)列管理器的電路核心模塊采用Verilog HDL 編程實(shí)現(xiàn),開(kāi)發(fā)環(huán)境采用的是Xilinx集成開(kāi)發(fā)環(huán)境VIVADO 2018.3,使用仿真軟件Modelsim SE-64 2019.2對(duì)整個(gè)系統(tǒng)進(jìn)行行為級(jí)仿真。
如圖9 所示,前級(jí)有數(shù)據(jù)包可以輸入時(shí)(i_frame_ptr_fifo_ft_empty),從指針中獲取該包所屬的流編號(hào)(wr_flowid),進(jìn)而從存儲(chǔ)隊(duì)列信息的sram中獲取首尾地址指針等隊(duì)列信息(如圖中①)。當(dāng)需要申請(qǐng)新的存儲(chǔ)塊時(shí),向自由指針電路發(fā)送請(qǐng)求(ll_wr_req),并附帶流編號(hào)(ll_wr_flowid)(如圖中②),自由指針電路收到請(qǐng)求后,首先獲取該流當(dāng)前隊(duì)列長(zhǎng)度和門(mén)限值,若隊(duì)列長(zhǎng)度小于門(mén)限值,表示為該流預(yù)留的存儲(chǔ)區(qū)還有剩余,將新申請(qǐng)的塊指針?lè)祷貙?xiě)入電路(如圖中③)。收到塊指針后,將數(shù)據(jù)包送入輸出緩沖fifo(i_frame_data_fifo_ft_dout),準(zhǔn)備送入DDR3 控制器中(o_cell_data_fifo_ft_din)(如圖中④)。寫(xiě)入完成后,該隊(duì)列的長(zhǎng)度、首尾指針等都有變化,對(duì)隊(duì)列信息進(jìn)行更新(depth_flag_refresh),DDR3 控制器收到寫(xiě)入請(qǐng)求后,將數(shù)據(jù)包寫(xiě)入DDR3 中(如圖中⑤)。
圖9 數(shù)據(jù)包輸入仿真
如圖10 所示,當(dāng)某隊(duì)列中有完整數(shù)據(jù)包時(shí),向調(diào)度器發(fā)出一個(gè)可讀信號(hào)(q_rdy),若正好此時(shí)端口空閑(port_rdy),則向隊(duì)列管理器發(fā)出讀信號(hào)(q_status_rd_req),申請(qǐng)要讀出數(shù)據(jù)包的地址指針(如圖①)。調(diào)度器收到地址指針后(rd_addr),將其寫(xiě)入面向DDR3 控制器的讀信號(hào)緩沖中(sdram_req_fifo_ft_din),等待從DDR3 中輸出(如圖②)。等到數(shù)據(jù)包輸出完畢后,DDR3 控制器將已經(jīng)剛讀出的數(shù)據(jù)包的相關(guān)信息送回調(diào)度器當(dāng)中(sdram_rtn_fifo_ft_din)(如圖③),調(diào)度器從中獲取該包所屬的流編號(hào)(q_status_ref_flowid)、包長(zhǎng)度(q__status_ref_len)后送到隊(duì)列管理器當(dāng)中,隊(duì)列管理器根據(jù)收到的信息對(duì)隊(duì)列信息寄存器進(jìn)行更新,若該數(shù)據(jù)包是數(shù)據(jù)塊中的最后一個(gè)包,則此時(shí)該數(shù)據(jù)塊為空,隊(duì)列控制器想自由指針控制電路發(fā)出請(qǐng)求歸還指針(rtn_ptr_req)(如圖④)。
如圖11 所示,讀信號(hào)處理電路當(dāng)收到前級(jí)發(fā)來(lái)的讀請(qǐng)求(sdram_req_fifo_ft_empty)時(shí),首先從中讀信息(sdram_req_fifo_ft_dout)中獲取數(shù)據(jù)包起始地址(read_start_addr)送往DDR3 中(app_addr),請(qǐng)求讀出數(shù)據(jù),隨后交由信元處理電路分析該數(shù)據(jù)包的首信元,暫時(shí)擱置該讀請(qǐng)求,繼續(xù)處理其他讀請(qǐng)求(如圖中①)。
當(dāng)收到來(lái)自信元處理電路的讀請(qǐng)求時(shí)(sdram_secreq_fifo_empty),讀信號(hào)處理電路根據(jù)包長(zhǎng)度,將數(shù)據(jù)包剩余信元全部讀出(如圖中②)。
圖10 數(shù)據(jù)包輸出仿真
圖11 DDR3 控制器工作仿真
DDR3 輸出的信元(app_rd_data)存儲(chǔ)在一個(gè)DDR3 輸出緩沖當(dāng)中,等待進(jìn)一步處理(w512_ddr_rd_data_fifo_ft_din)(如圖中③)。信元處理器檢測(cè)到緩沖區(qū)有信元時(shí),首先檢測(cè)是否首信元(cell_first),若是,則將后續(xù)信元起始地址和包長(zhǎng)作為新的讀信號(hào),發(fā)送給讀信號(hào)處理電路(sdram_sec_req_fifo_din)(如圖中④)。等到數(shù)據(jù)包完全讀出后,將其存入輸出緩沖中,等待輸出(如圖中⑤)。
星載路由器對(duì)資源消耗、吞吐率等都有嚴(yán)格的要求,在資源消耗較低的前提下仍能保證一定的吞吐量。電路基于Xilinx Virtex-7 XC7V690T 設(shè)計(jì)實(shí)現(xiàn),圖12 所示為該設(shè)計(jì)的硬件資源消耗情況。從圖中可以看到,在調(diào)用外部DDR3 作為數(shù)據(jù)存儲(chǔ)區(qū)時(shí),雖然訪(fǎng)問(wèn)片外存儲(chǔ)區(qū)的時(shí)間會(huì)增加,但對(duì)應(yīng)的片內(nèi)硬件資源消耗也較低,實(shí)際占用的BRAM 資源僅為18%。
圖13 為本設(shè)計(jì)的功耗評(píng)估報(bào)告,電路中大量采用了狀態(tài)機(jī)結(jié)構(gòu),其與流水線(xiàn)結(jié)構(gòu)相比,狀態(tài)機(jī)結(jié)構(gòu)能耗相對(duì)較低,可以看到整個(gè)隊(duì)列管理器動(dòng)態(tài)功耗4.391 W,存儲(chǔ)部分的功耗只占了20%。
圖12 FPGA 內(nèi)部硬件資源消耗
圖13 功耗評(píng)估報(bào)告
本文提出了一種基于FPGA 硬件平臺(tái)的網(wǎng)絡(luò)流量管理系統(tǒng)架構(gòu),基于流建立隊(duì)列并進(jìn)行資源預(yù)留,同時(shí),為了減少片內(nèi)資源消耗,提供更大的數(shù)據(jù)緩存功能,本系統(tǒng)使用了片外DDR3 作為數(shù)據(jù)緩沖區(qū)。在此基礎(chǔ)上,針對(duì)其中的核心關(guān)鍵模塊,隊(duì)列管理器和DDR3 控制器,進(jìn)行了設(shè)計(jì)與實(shí)現(xiàn)。
仿真結(jié)果表明,該電路能夠?qū)Σ煌臄?shù)據(jù)流實(shí)現(xiàn)有效管理,實(shí)現(xiàn)資源預(yù)留,正確地完成了數(shù)據(jù)流的寫(xiě)入與讀取操作,能夠?qū)Σ煌臉I(yè)務(wù)提供絕對(duì)服務(wù)保證,減少了關(guān)鍵業(yè)務(wù)的時(shí)延。