基于FPGA的高速同步HDLC通信控制器設(shè)計
摘要:高級數(shù)據(jù)鏈路控制HDLC協(xié)議是一種面向比特的鏈路層協(xié)議,具有同步傳輸數(shù)據(jù)、冗余度低等特點(diǎn),是在通信領(lǐng)域中應(yīng)用最廣泛的鏈路層協(xié)議之一。提出實(shí)現(xiàn)HDLC通信協(xié)議的主要模塊——CRC校驗(yàn)?zāi)K及‘0’比特插入模塊的FPGA實(shí)現(xiàn)方法。CRC校驗(yàn)?zāi)K采用狀態(tài)機(jī)設(shè)計方,而‘0’比特插入模塊是利用FIFO實(shí)現(xiàn),為HDLC通信控制器的設(shè)計提供新的思路。該方法已在Spartan3s400開發(fā)板上實(shí)現(xiàn),并能正確傳輸。
關(guān)鍵詞:HDLC協(xié)議;CRC校驗(yàn);‘0’比特插入;FPGA
高級數(shù)據(jù)鏈路控制HDLC(High-level Data Link Control)廣泛應(yīng)用于數(shù)據(jù)通信領(lǐng)域,是確保數(shù)據(jù)信息可靠互通的重要技術(shù)。實(shí)施HDLC的一般方法通常是采用ASIC器件和軟件編程等。HDLC的ASIC芯片使用簡易,功能針對性強(qiáng),性能可靠,適合應(yīng)用于特定用途的大批量產(chǎn)品中。但由于HDLC標(biāo)準(zhǔn)的文本較多,ASIC芯片出于專用性的目的難以通用于不同版本,缺乏應(yīng)用靈活性。例如CCITT、ANSI、ISO/IEC等都有各種版本的HDLC標(biāo)準(zhǔn),器件生產(chǎn)商都還有各自的標(biāo)準(zhǔn),對HDLC的CRC序列生成多項(xiàng)式等有不同的規(guī)定。況且,專用于HDLC的ASIC芯片其片內(nèi)數(shù)據(jù)存儲器容量有限,通常只有不多字節(jié)的FIFO可用。對于某些應(yīng)用來說,當(dāng)需要擴(kuò)大數(shù)據(jù)緩存的容量時,只能對ASIC芯片再外接存儲器或其他電
路,ASIC的簡單易用性就被抵銷掉了。
FPGA是現(xiàn)場可編程門陣列,屬于超大規(guī)模集成電路,具有豐富的系統(tǒng)門、邏輯單元、塊RAM和IO引腳等硬件資源。由于FPGA具有重裝載功能,可以在其內(nèi)部靈活實(shí)現(xiàn)各種數(shù)字電路設(shè)計,甚至可以動態(tài)改變其內(nèi)部設(shè)計,動態(tài)實(shí)現(xiàn)不同的功能。
因此,采用FPGA實(shí)現(xiàn)HDLC是一種可行的方法。HDLC通信控制器主要是對數(shù)據(jù)進(jìn)行CRC校驗(yàn)、‘0’比特插入和加幀頭幀尾操作。
1 “0”比特插入模塊
HDLC規(guī)程規(guī)定信息的傳送以幀為單位,每一幀的基本格式如圖1所示。
HDLC規(guī)程指定采用8 bit的01111110為標(biāo)志序列,稱為F標(biāo)志。用于幀同步,表示1幀的開始和結(jié)束,相鄰2幀之間的F,既可作為上一幀的結(jié)束,又可作為下一幀的開始。標(biāo)志序列也可以作為幀間填充字符,因而在數(shù)據(jù)鏈路上的各個數(shù)據(jù)站都要不斷搜索F標(biāo)志,以判斷幀的開始和結(jié)束。
由于HDLC具有固定的幀格式,以7EH為幀頭和幀尾,為了保證透明傳輸,即只有幀頭和幀尾出現(xiàn)連續(xù)的6個‘l’,其他地方不允許有連續(xù)5個以上的‘l’出現(xiàn),否則就要進(jìn)行‘0’比特插入,即只要遇到連續(xù)5個‘1’,就在其后插入1個‘O’。根據(jù)傳輸數(shù)據(jù)量的大小可采用以下2種思路實(shí)現(xiàn)‘0’比特插入操作。
1.1 遇‘O’緩沖實(shí)現(xiàn)法
由于數(shù)據(jù)中出現(xiàn)多少個連續(xù)的‘1’是不可控的,故最終插入‘0’的個數(shù)也是不可控的。例如要發(fā)送的“有效數(shù)據(jù)”(包含地址字段、控制字段、信息字段、幀校驗(yàn)字段)為320 bit,則最多會插入64個‘0’。數(shù)據(jù)是串行輸入,每插入1個‘0’,則數(shù)據(jù)由5位變成6位,則插‘0’后要輸入的數(shù)據(jù)就被“積壓”來,插入的‘0’越多,“積壓”的數(shù)據(jù)就越多。如果采用文獻(xiàn)中的插‘0’方法,簡單的將‘O’插入,將會丟失1位數(shù)據(jù),設(shè)置1個64位的緩沖,每插入1個‘0’就把后面數(shù)據(jù)做為1位延時,插‘0’后在把已經(jīng)延時1個時鐘周期的數(shù)據(jù)加進(jìn)來,就保證不丟失數(shù)據(jù)。實(shí)際利用VHDL語言編譯時,其VHDL代碼為:
上述VHDL的思路:矢量a的第64位到第l位分別為datain延時64個時鐘周期的串行數(shù)據(jù)到延時1個時鐘周期的串行數(shù)據(jù),i的初始數(shù)據(jù)為O,每遇到連續(xù)5個‘1’,插入1個‘0’后,dataout輸出為datain延時i個時鐘周期的數(shù)據(jù)。這樣就做到了不丟失數(shù)據(jù)。圖2是利用ISE 9.1i仿真的波形圖。
由圖2可看到插‘0’操作后,數(shù)據(jù)比未插‘0’前變長了,而且變長了多少位是由數(shù)據(jù)內(nèi)容決定的。
評論