FPGA通過以太網(wǎng)與PC機通信完整方案
一、簡介
使用以太網(wǎng)接口實現(xiàn)PC和FPGA的通信,相對于串口而言,具有更高的傳輸速度。采用以太網(wǎng)接口的目的在于,在一定技術(shù)要求下,實現(xiàn)PC機和FPGA的實時數(shù)據(jù)傳輸。從而可以借助PC機強大的計算能力,降低FPGA的運算負(fù)擔(dān)。
成都浩然電子有限公司開發(fā)的網(wǎng)絡(luò)模塊HS-NM5300A,作為實現(xiàn)以太網(wǎng)通信的主要元件。模塊以韓國Wiznet公司開發(fā)W5300A為關(guān)鍵芯片。模塊一端為RJ45,通過網(wǎng)絡(luò)交叉線與PC機相連;另一端為外部總線,與FPGA的IO相連。模塊內(nèi)嵌10BaseT/100BaseTX的以太網(wǎng)物理層,支持自動握手功能,支持固件TCP/IP協(xié)議,通信理想速率可達(dá)到50Mbps。
W5300A接收PC機發(fā)來的數(shù)據(jù)包,進(jìn)行協(xié)議解析,并將傳輸?shù)臄?shù)據(jù)保存在其內(nèi)部寄存器中,或者將寄存器內(nèi)的數(shù)據(jù)打包封裝發(fā)送到以太網(wǎng)上。FPGA通過外部總線,訪問W5300A的寄存器,從而對W5300A進(jìn)行配置、查詢數(shù)據(jù)包是否到來、收取/發(fā)送通信數(shù)據(jù)等等。
二、FPGA與W5300A的硬件連接
FPGA與W5300A的外部總線連接如下圖所示(ref:W5300_v1.2.2_english,115-115)。
FPGA和W5300的連線,我們稱之為外部總線。FPGA為外部總線的主機,W5300為從機。通過外部總線,可以實現(xiàn)FPGA對W5300的讀/寫。圖中DATA為十六位數(shù)據(jù)線,ADDR為10位地址線,WR為寫使能,RD為讀使能,CS為片選使能,INT為中斷請求。
三、外部總線的工作時序
要使W5300正確讀入/輸出數(shù)據(jù),外部總線上各信號電平應(yīng)滿足一定的時序要求。讀時序如下圖所示(ref:P120-122):
圖中PLL_CLK為W5300A的內(nèi)部時鐘,頻率為15OMHz。
四、FPGA程序?qū)崿F(xiàn)
(1)FPGA網(wǎng)口通信模塊的頂層結(jié)構(gòu)如下圖所示:
BusDriver是核心模塊,驅(qū)動外部總線和RX_FIFO的寫使能以及TX_FIFO的讀使能。RX_FIFO和TX_FIFO是兩個16位的先進(jìn)先出存儲器。在FPGA內(nèi)部,可以通過讀取RX_FIFO的數(shù)據(jù),寫TX_FIFO實現(xiàn)與以太網(wǎng)的數(shù)據(jù)交換。
(2)接口定義
引腳名稱 | IN/ OUT | 說明 | 有效狀態(tài) | 位置 |
Enet_ADDR | OUT | 網(wǎng)絡(luò)芯片總線的地址位 | 外 | |
Enet_BRDY | IN | 外 | ||
Enet_CSn | OUT | 網(wǎng)絡(luò)芯片總線的片選 | 低 | 外 |
Enet_DATA | INOUT | 網(wǎng)絡(luò)芯片總線的數(shù)據(jù)位,16位 | 外 | |
Enet_INTn | IN | 網(wǎng)絡(luò)芯片總線的中斷位 | 低 | 外 |
Enet_L_LINK | IN | 網(wǎng)絡(luò)電氣連接位 | 高 | 外 |
Enet_RDn | OUT | 網(wǎng)絡(luò)芯片總線的讀使能 | 低 | 外 |
Enet_RST | OUT | 網(wǎng)絡(luò)芯片硬件復(fù)位 | 高 | 外 |
Enet_WRn | OUT | 網(wǎng)絡(luò)芯片總線的寫使能 | 低 | 外 |
RESET | IN | Bus_fifo模塊的初始化,包括總線模塊和FIFO | 低 | 內(nèi) |
rxfifo_dout | OUT | RX_FIFO的數(shù)據(jù)輸出,16位 | 內(nèi) | |
rxfifo_rd_en | IN | RX_FIFO的讀使能,如果在rxfifo_empty_p為1,有可能出現(xiàn)錯誤。 | 高 | 內(nèi) |
rxfifo_empty_p | OUT | 當(dāng)RX_FIFO為空時,輸出高電位 | 高 | 內(nèi) |
rxfifo_valid | OUT | 在rxfifo_rd_en置1后一個fifo_clk置1,標(biāo)示RX_FIFO輸出數(shù)據(jù)有效。 | 高 | 內(nèi) |
txfifo_din | IN | TX_FIFO的數(shù)據(jù)輸入,16位 | 內(nèi) | |
txfifo_wr_en | IN | TX_FIFO的數(shù)據(jù)寫使能 | 高 | 內(nèi) |
txfifo_full | OUT | 當(dāng)TX_FIFO滿時,輸出高電位 | 高 | 內(nèi) |
txfifo_valid | OUT | TX_FIFO數(shù)據(jù)輸出有效位 | 高 | 內(nèi) |
fifo_clk | IN | RX_FIFO的讀時鐘和TX_FIFO的寫時鐘,上升沿從FIFO中讀取或?qū)懭霐?shù)據(jù)。10M | 升 | 內(nèi) |
CLK | IN | bus_driver的時鐘,RX_FIFO的寫時鐘和TX_FIFO的讀時鐘。100M | 升 | 內(nèi) |
注:表中第五列“位置”,標(biāo)示該信號線應(yīng)連接至FPGA內(nèi)部信號或者FPGA外部信號。
(3)TCP工作模式
PC機與W5300A通信采用TCP協(xié)議。對于TCP模式,通信的一方根據(jù)IP地址和端口號與對端建立SOCKET連接。再通過指定的SOCKET發(fā)送和接收數(shù)據(jù)。建立SOCKET的連接有兩種方式:“TCP服務(wù)器”和“TCP客戶端”。區(qū)別在于誰首先發(fā)送連接請求(SYS數(shù)據(jù)包)。“TCP服務(wù)器”等待對端的連接請求,當(dāng)收到連接請求時建立SOCKET連接(被動打開)。“TCP客戶端”主動發(fā)出連接請求,與對端建立連接(主動打開)。出于方便考慮,由PC端發(fā)起連接,設(shè)定PC端為TCP客戶端,W5300A為TCP服務(wù)端。通信流程如下圖所示(ref:90)。
圖中的LISTEN、ESTALISHED、CLOSED為對應(yīng)SOCKET的狀態(tài)。對W5300A的SOCKET正確地初始化(OPEN)后,SOCKET處于LISTEN狀態(tài),對網(wǎng)絡(luò)進(jìn)行偵聽。當(dāng)收到客戶端發(fā)來的連接請求(SYS數(shù)據(jù)包),變?yōu)镋STABLISHED狀態(tài),此時客戶端和服務(wù)器可以進(jìn)行數(shù)據(jù)通信。當(dāng)服務(wù)器斷開連接或者收到客戶端發(fā)來的斷開請求(FIN數(shù)據(jù)包),W5300A相應(yīng)的SOCKET狀態(tài)變?yōu)镃LOSED。服務(wù)器SOCKET更為詳細(xì)的狀態(tài)轉(zhuǎn)換過程可以參考W5300A手冊77頁。
(4)busdriver模塊的工作流程
busdriver通過外部總線對網(wǎng)絡(luò)芯片進(jìn)行復(fù)位和數(shù)據(jù)交換。通過訪問W5300A的寄存器,實現(xiàn)網(wǎng)絡(luò)芯片的配置、監(jiān)控、數(shù)據(jù)收/發(fā)。同時,busdriver監(jiān)視FIFO,如果RX_FIFO則暫緩收數(shù);如果TX_FIFO不空則發(fā)送數(shù)據(jù)。Busdriver的工作流程如下圖所示。
圖中,重置芯片是指:對芯片硬件復(fù)位、軟件復(fù)位;基本配置包括:配置 W5300A的MAC地址、IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)地址,分配W5300A的存儲空間,中斷設(shè)置等等。中斷服務(wù)程序主要是讀取芯片的中斷寄存器,獲取中斷類型,并復(fù)位中斷寄存器。值得注意的是,上圖所示的流程是查詢方式而不是中斷方式。啟動SOCKET的程序主要是:設(shè)置SOCKET端口號,工作模式(TCP服務(wù)器端),打開SOCKET、開始偵聽等等。
(5)以太網(wǎng)通信的程序?qū)崿F(xiàn)
考慮到處理器是FPGA,采用VHDL語言描述圖中所示流程。與C語言順序為執(zhí)行不同,VHDL基于硬件結(jié)構(gòu)、并發(fā)執(zhí)行。圖中用C語言可以很方便地描述出來,但是要在FPGA里面實現(xiàn),則需要靈活運用狀態(tài)機以控制其流程,且要盡力避免競爭和險象。限于正文篇幅,源程序在附錄中給出。
評論