一種基于A(yíng)RM和FPGA的可重構MAC協(xié)議設計
(1)若MAC_flag為false時(shí),表明信道空閑,此時(shí)進(jìn)入(2);若MAC_flag為true,則說(shuō)明現在信道已被占用,此時(shí)不管節點(diǎn)已經(jīng)處于什么狀態(tài)都會(huì )進(jìn)入第七步,除了正在發(fā)送數據的節點(diǎn),由于正在發(fā)送的節點(diǎn)是不可能監聽(tīng)信道的,而且也無(wú)法接收其他節點(diǎn)的數據,載波偵聽(tīng)機制在這種狀態(tài)下是失效的,因此不會(huì )出現正在發(fā)送數據的節點(diǎn)從發(fā)送狀態(tài)突然變?yōu)榻邮諣顟B(tài)。
(2)執行幀間間隔進(jìn)程,遞減IFS_time大小,直到為0就進(jìn)入(3)。IFS_time的初始值為DIFS。
(3)退避進(jìn)程。退避時(shí)間的大小主要是由ARM提供,當節點(diǎn)經(jīng)歷了一個(gè)時(shí)隙時(shí)間,退避時(shí)隙數減1,但當節點(diǎn)沒(méi)有完全經(jīng)歷一個(gè)時(shí)隙時(shí)間,退避時(shí)隙數就不會(huì )變化。退避進(jìn)程結束后就會(huì )進(jìn)入(4)。
(4)判斷發(fā)送類(lèi)型,設計中發(fā)送類(lèi)型Tx_tpye的初始值為1。若Tx_tpye為0,則為節點(diǎn)發(fā)送ACK,根據接收到的數據幀中的源/目的節點(diǎn)號以及序列號等組裝回復發(fā)送節點(diǎn)ACK,并初始化IFS_time和Backoff_time以備節點(diǎn)發(fā)送數據幀使用,同時(shí)設置NAV_flag為true,更新NAV_time的值,繼續虛擬載波偵聽(tīng),避免出現發(fā)送ACK的節點(diǎn)會(huì )優(yōu)先占用信道的情況;若Tx_tpye不為0,則表明節點(diǎn)可以開(kāi)始發(fā)送數據幀,轉入(5)。
(5)發(fā)送數據幀前首先判斷是否超過(guò)最大允許發(fā)送的時(shí)間,若超過(guò)了就丟棄該數據幀,將IFS_time設置為EIFS,Backof_time初始化,超時(shí)計時(shí)器停止;若沒(méi)有超過(guò)最大允許發(fā)送時(shí)間,則節點(diǎn)正式發(fā)送數據幀,并啟動(dòng)單次超時(shí)計時(shí),發(fā)送完畢后就等待ACK,此時(shí)進(jìn)入(6)。
(6)在等待ACK到來(lái)的同時(shí)判斷是否超時(shí)單次允許發(fā)送的時(shí)間,若超過(guò)了,則重傳次數遞加;然后判斷是否超過(guò)重傳門(mén)限,如果超過(guò)了門(mén)限,則丟棄該數據幀;如果沒(méi)有超過(guò),則將IFS_time設置為EIFS,而且還需要ARM的隨機退避算法根據重傳次數重新給一個(gè)退避時(shí)隙數,同時(shí)修改數據幀中的重傳位以便接收節點(diǎn)識別。
(7)保存當前退避進(jìn)程中的Backoff_time和剛剛結束的幀間間隔的大小IFS_time,接收MAC幀并解析其中相關(guān)的數據,為后續的組裝ACK做準備,然后進(jìn)入(8),同時(shí)將NAV_flag設置為true,保證MAC層能處理完數據。
(8)校驗接收到的MAC幀是否正確,若不正確,則將IFS_time設置為EIFS,NAV_flag設置為false,NAV_time設置為0,這樣節點(diǎn)就進(jìn)入執行幀間間隔進(jìn)程。若校驗正確,則進(jìn)入(9)。
(9)將FPGA解析出來(lái)的目的節點(diǎn)號與本節點(diǎn)的比較,判斷是否是發(fā)送給本節點(diǎn)的。如果不是發(fā)送給本節點(diǎn)的,那么就再比較本節點(diǎn)現在的NAV_time值是否大于接收到的MAC幀內的NAV,若大于則本節點(diǎn)繼續按照現有的NAV_time值執行下去;若小于接收到的MAC幀內的NAV,則使用MAC幀內的NAV來(lái)更新本節點(diǎn)的NAV_time值,然后以最新的NAV_time值遞減下去直到為0,虛擬載波偵聽(tīng)顯示空閑。但是在執行NAV_time遞減過(guò)程中隨時(shí)都有可能收到新MAC幀,而且也不是發(fā)送給本節點(diǎn)的,照樣要執行本步驟,并不是等到NAV_time變?yōu)?后再更新。如果是發(fā)送給本節點(diǎn)的,則會(huì )進(jìn)入(10)。
(10)若節點(diǎn)接收到的是數據幀。即Rx_type為1,FPGA將接收到的數據幀上傳ARM;同時(shí)將IFS_time更新為SIFS,Backoff_time設置為0,這樣使得接收到數據幀到發(fā)送ACK之間的時(shí)間間隔為SIFS,并將Tx_tpye設置為0,NAV_flag變?yōu)閒alse,進(jìn)入(2),開(kāi)始準備發(fā)送ACK。如果Rx_type為0,則節點(diǎn)接收到的是ACK,說(shuō)明一次數據收發(fā)過(guò)程結束,節點(diǎn)將初始化相關(guān)參數,計時(shí)停止等,FPGA釋放空間,表明該數據幀已發(fā)送成功。
3 仿真驗證
基于CSMA/CA的MAC協(xié)議的實(shí)現關(guān)鍵在于各個(gè)節點(diǎn)對各種情況的處理,因此對一個(gè)節點(diǎn)協(xié)議功能的仿真驗證也能說(shuō)明設計的正確性。本設計中FPGA部分的設計是重點(diǎn),所以使用ModelSim進(jìn)行仿真觀(guān)察節點(diǎn)FPGA的處理過(guò)程。
3.1 信道競爭過(guò)程
基于CSMA/CA的MAC協(xié)議中各個(gè)節點(diǎn)也不知道自身周?chē)墓濣c(diǎn)情況,因此節點(diǎn)競爭信道時(shí)隨時(shí)都可能檢測到信道已被占用。圖3給出了節點(diǎn)在退避過(guò)程中檢測到物理載波偵聽(tīng)變?yōu)槊?,立刻停止退避進(jìn)程,將此時(shí)的退避時(shí)隙數掛起,即退避時(shí)隙數保留為31。待到信道重新空閑超過(guò)幀間間隔DIFS后,將以保留的退避時(shí)隙數繼續進(jìn)行退避進(jìn)程,變?yōu)?后開(kāi)始發(fā)送數據幀。在圖中還可以看到節點(diǎn)收到正確的ACK后,更新NAV的過(guò)程。從仿真圖的執行流程可以說(shuō)明所設計的MAC協(xié)議滿(mǎn)足載波偵聽(tīng)機制、幀間間隔、隨機退避的功能要求。本文引用地址:http://dyxdggzs.com/article/148811.htm
3.2 數據傳輸過(guò)程
從圖4中可以觀(guān)察到節點(diǎn)發(fā)送第一個(gè)數據幀后,超時(shí)計數器開(kāi)始計時(shí),但在規定時(shí)間內沒(méi)有收到ACK,則重傳數據幀,重傳退避的時(shí)間是重新賦值的,并且幀間間隔不再是DIFS,而是EIFS;當節點(diǎn)接收到正確的ACK后,開(kāi)始發(fā)送新的數據幀。說(shuō)明了所設計的MAC協(xié)議能夠實(shí)現確認重傳機制。
4 結語(yǔ)
在以ARM和FPGA為主的硬件結構上,設計與實(shí)現了基于CSMA/CA的MAC協(xié)議,該協(xié)議具有載波偵聽(tīng)機制、隨機退避、確認重傳等功能。經(jīng)過(guò)仿真測試,驗證了所設計MAC協(xié)議的可行性。
評論