基于Altera FPGA無操作系統的LWIP移植
Ethernetif. c的編寫移植者應根據自身使用的網卡特性完善這一函數。LWIP源碼提供者將ethernetif. c中的函數實現為一個框架形式。總體而言,在文件ethernetif. c中已有5個函數的框架,包括函數名、函數參數、函數內容等,要完成如下5個函數的編寫:

這5個函數中,前3個與網卡功能密切相關。low_level_init為網卡初始化函數,其主要用于完成網卡復位及參數初始化,同時根據實際網卡特性,還需設置協議棧網絡接口管理結構neitif中與網卡屬性相關的字段,例如網卡MAC地址長度等;low_level_output為網卡數據包發送函數,該函數的主要工作是將內核數據結構pbuf描述的數據包發送出去;low_level_input為網卡數據包接收函數;ethernetif_input的主要作用是調用網卡數據包接收函數low_level_input從網卡處讀取一個數據包,然后解析該數據包的類型,最后將數據包遞交給上層;ethernetif_init,是上層在管理網絡接口結構netif時會調用的函數,該函數主要完成netif結構中某些字段的初始化,并最終調用low_level_init,完成網卡的初始化。到此,關于網卡驅動的移植就基本完成了。
1.5 協議棧的初始化


在使用協議棧之前,協議棧內核必須完成初始化,若要使用網卡進行通信,則網卡相關的網絡接口結構也需被注冊到內核中。在此用函數lwip_init_task來完成協議棧的初始化和網卡信息的注冊。初始化工作主要是調用內核函數1wip_init來完成的,其依次調用各模塊的初始化函數,例如內存初始化函數、數據包結構初始化函數、網絡接口結構初始化函數、IP初始化函數、TCP初始化函數等。接口結構注冊通過調用函數netif_add完成,該函數除了使用3個IP地址作為參數外,還需另外兩個函數地址作為參數,即etherne tif_init和ethernet_input。這兩個函數地址會被賦值給netif結構的相關字段,內核通過這些字段指向的函數來完成網卡的初始化以及向上層遞交數據。
2 運行和測試
利用FPGA上的JTAG接口將程序燒寫至串行配置芯片EPCS64中,再通過SOPC Builder中CPU的配置,將RESET VECTOR指向EPCS_FLASH_CONTROLLER,此時程序會被下載到串行配置芯片中,串行配置芯片在通電時,將運行程序拷貝到代碼運行區,并從reset address啟動。SOPC中的exception address指定的是系統異常處理代碼的存放處。若exception address和reset address不同,則程序從reset address啟動后將放在reset address處的系統異常處理代碼拷貝到exception address,設置如圖5所示。

利用移植的協議棧中UDP協議,調用udpsend()函數往計算機發送數據,在計算機端,打開TCPUDP測試工具,在FPGA中模擬數據產生模塊,并向上位機發送遞增碼,從測試工具欄中,看到上位機接收到的數據。從接收窗口中,能看到捕獲的udp數據包,是正常的16進制遞增碼,如圖6所示。

3 結束語
通過提出基于FPGA的SOPC自定義MAC IP核的設計思路,用Verilog HDL硬件語言編程,滿足特殊器件的特殊要求,其從設計到實現驗證,充分感受到SOPC的優勢。SOPC將中央處理器和外圍接口集成到一塊芯片上,具有體積小、成本低、高精度的優點。而NIOS的可定制性,可根據需要添加組件,同時也可根據需要編寫IP模塊,具有較強的靈活性。此外,還可直接由C語言完成軟件系統的開發設計,調用現成C語言算法,提高工作效率,且具有良好的便捷性和靈活性。
評論