FPGA控制DM9000A進(jìn)行以太網(wǎng)數(shù)據(jù)收發(fā)的Verilog實(shí)現(xiàn)
>激活PHY
設(shè)置GPR(REG_1F)CEPIO0bit[0]=0;
復(fù)位后,DM9000A恢復(fù)默認(rèn)的休眠狀態(tài),以降低功耗,因此需要首先喚醒PHY。
>進(jìn)行兩次軟復(fù)位,步驟如下:
設(shè)置NCR(REG_00)bit[2:0]=011,至少保持20μs;
清除NCR(REG_00)bit[2:0]=000;
設(shè)置NCR(REG_00)bit[2:0]=011,至少保持20μs;
清除NCR(REG_00)bit[2:0]=000;
>配置NCR寄存器;
設(shè)置NCR(REG_00)bit[2:1]=00;配置為正常模式。
通過(guò)改變?cè)摷拇嫫骺梢赃x擇設(shè)置內(nèi)部或者外部PHY、全雙工或者半雙工模式、使能喚醒事件等網(wǎng)絡(luò)操作。
>清除發(fā)送狀態(tài);
設(shè)置NSR(REG_01)bit[5]=1bit[3]=1 bit[2]=1;
>設(shè)置IMR寄存器(REG_FF)PAR bit[7]=1,以肩用RX/TX FIFOSRAM讀/寫地址指針自動(dòng)返回功能;
>通過(guò)IMR寄存器(REG_FF)PRM bit[0]/PTM bit[1],對(duì)RX/TX中斷使能。如果需要在一個(gè)數(shù)據(jù)幀發(fā)送完后產(chǎn)生一個(gè)中斷,就應(yīng)該將PTM bit[1]置1,如果需要在接收到一幀新數(shù)據(jù)時(shí)產(chǎn)生一個(gè)中斷,就應(yīng)該將PRM bit[1]置1;
>設(shè)置RCR寄存器,使能數(shù)據(jù)接收功能。
通過(guò)以上步驟,可以通過(guò)LED指示燈觀測(cè)到DM9000A是否已成功初始化。
發(fā)送模塊
DM9000A中的發(fā)送緩沖區(qū)可以同時(shí)存儲(chǔ)兩幀數(shù)據(jù),可以按照先后順序命名為幀I和幀II。DM9000A上電初始化后,發(fā)送緩存區(qū)的起始地址是00H,當(dāng)前數(shù)據(jù)幀編號(hào)為幀I。兩幀數(shù)據(jù)的狀態(tài)控制字分別記錄在DM9000A的狀態(tài)寄存器03H和04H中。發(fā)送過(guò)程如下:
首先,FPGA利用寫操作寄存器MWCMD(REG_F8)向DM9000A的發(fā)送緩存區(qū)中寫入發(fā)送數(shù)據(jù)幀,即需要先寫入6字節(jié)的目的MAC地址,再寫入6字節(jié)的源MAC地址,最后再寫入發(fā)送數(shù)據(jù)。隨后,FPGA利用寫操作寄存器MWCMD(REG_F8)將數(shù)據(jù)幀長(zhǎng)度寫入寄存器FCH和FDH,數(shù)據(jù)長(zhǎng)度為16位,將高8位寫入寄存器FCH,低8位寫入寄存器FDH。最后,FPGA將發(fā)送控制寄存器TCR(REG_02)的bit[1]置為高電平,向DM9000A發(fā)出發(fā)送數(shù)據(jù)指令。DM9000A會(huì)自動(dòng)做一些處理才將數(shù)據(jù)發(fā)往以太網(wǎng),這包括:插入報(bào)頭和幀起始分隔符;插入來(lái)自上層協(xié)議的數(shù)據(jù),如果數(shù)據(jù)量小于64字節(jié),則自動(dòng)補(bǔ)齊64字節(jié);根據(jù)目標(biāo)地址、源地址、長(zhǎng)度/類型和數(shù)據(jù)產(chǎn)牛CRC校驗(yàn)序列,并插入校驗(yàn)序列位。這些處理都無(wú)需FPGA干預(yù)。處理完畢后,DM9000A即開始發(fā)送幀I,在幀I發(fā)送的同時(shí),幀II的數(shù)據(jù)即可寫入發(fā)送緩存區(qū)。在幀I發(fā)送完后,將幀II的數(shù)據(jù)長(zhǎng)度寫入寄存器FCH和FDH,最后將發(fā)送控制寄存器NSR(REG_01)的bit[1]置為高電平,即可開始幀II的發(fā)送。依此類推,下面發(fā)送的幀將會(huì)繼續(xù)編號(hào)為幀I、幀II、幀I、幀II……按照同樣的方式發(fā)送。
如果FPGA將中斷屏蔽寄存器 IMR(REG_FF)的bit[1]置為高電平,那么發(fā)送完畢后,DM9000A將會(huì)產(chǎn)生一個(gè)指示發(fā)送完成的中斷信號(hào)。在發(fā)送過(guò)程中,F(xiàn)PGA可以查詢寄存器標(biāo)志位寄存器NSR(REG_01)中的TX1END bit[2]或者TX2END bit[3],得到數(shù)據(jù)幀的發(fā)送狀態(tài)。
發(fā)送流程,寄存器ISR中的PTS標(biāo)志位是發(fā)送中斷標(biāo)志位,當(dāng)一幀數(shù)據(jù)發(fā)送完畢,PTS=0,F(xiàn)PCA檢測(cè)到該標(biāo)志后,應(yīng)清除標(biāo)志位以便發(fā)送新的數(shù)據(jù)幀。這里需要注意的是,向FC、FD所寫的幀長(zhǎng)度應(yīng)該包含目的MAC地址段、源MAC地址段和有效數(shù)據(jù)的總長(zhǎng)度。
接收模塊
DM9000A中的接收緩存區(qū)是一個(gè)環(huán)形結(jié)構(gòu),初始化后的起始地址為0C00H,每幀數(shù)據(jù)都有4字節(jié)長(zhǎng)的首部,然后是有效數(shù)據(jù)和CRC校驗(yàn)序列。首部4字節(jié)依次是01H、狀態(tài)、長(zhǎng)度低字節(jié)和長(zhǎng)度高字節(jié)。 首部4字節(jié)含義如下:
第一個(gè)字節(jié)用來(lái)檢測(cè)接收緩存區(qū)中是否有數(shù)據(jù),如果這個(gè)字節(jié)是01H,表明接收到了數(shù)據(jù);如果為00H,則說(shuō)明沒(méi)有數(shù)據(jù)。但是,如果第一個(gè)字節(jié)既不是01H,也不是00H,DM9000A就必須作一次軟復(fù)位來(lái)從這種異常狀態(tài)中恢復(fù)。
第二個(gè)字節(jié)存儲(chǔ)著以太網(wǎng)幀狀態(tài),由此可判斷所接收幀是否正確。
第三和第四字節(jié)存儲(chǔ)著以太網(wǎng)幀長(zhǎng)度。后續(xù)的字節(jié)就是有效數(shù)據(jù)。
接收過(guò)程如下:
查看中斷狀態(tài)寄存器,如果接收到新數(shù)據(jù),寄存器ISR的PRS位將被置為0;如果檢測(cè)到PRS=0,清除PRS,F(xiàn)PGA開始讀接收緩存區(qū)數(shù)據(jù)。如果第一字節(jié)是01H,則說(shuō)明有數(shù)據(jù),00H說(shuō)明無(wú)數(shù)據(jù),否則要進(jìn)行復(fù)位; 根據(jù)獲取的長(zhǎng)度信息,判斷是否讀完一幀,如果讀完,接著讀下一幀,直到遇到首字節(jié)是00H的幀,說(shuō)明接收數(shù)據(jù)已讀完。FPGA可以重新查看中斷狀態(tài)寄存器,等待新的有效數(shù)據(jù)幀。
結(jié)語(yǔ)
本文對(duì)以太網(wǎng)控制器DM9000A進(jìn)行了原理和功能介紹,并結(jié)合自行開發(fā)的SDR基帶信號(hào)處理平臺(tái),基于FPGA設(shè)計(jì)實(shí)現(xiàn)了100M以太剛接口,其設(shè)計(jì)思路新穎,硬件連接簡(jiǎn)單。整體系統(tǒng)具有功耗低,體積小,運(yùn)行穩(wěn)定可靠等優(yōu)點(diǎn)。
評(píng)論