一、摘要
Altera軟件NIOS II低版本(7.2版本以下,本例程中使用的是6.0版本)中實現TCP/IP所用的協議棧為LWIP,常用的例程有2個,web_server和simple_socket_server,這篇文章將敘述這2個例程實現的過程。這兩個例程參考了友晶科技的DE2_WEB例程。
二、實驗平台
軟件平台:Quartus II 6.0 + Nios II 6.0
硬件平台:DIY_DE2
三、實驗內容1——>實現web_server
1、采用SOPC定制軟核

定制軟核的詳細步驟不再贅述,以上為定制的軟核。
cpu_0需要設置的地方:
Reset Vector:cfi_flash_0、
Exception Vector:sdram_0
必須要添加timer_0,供uC/OS系統所使用
第二個標簽頁:Data Master處,Data Cache設置為None
之后分配地址,分配中斷號,生成即可。
2、硬件電路
采用原理圖的形式,創建頂層文件。
(1)添加生成的軟核;
(2)調用鎖相環IP核;
(3)連線、分配管腳;
(4)編譯、綜合,生成配置文件。
最后原理圖如下圖所示。

需要注意的問題:
(1)軟核程序在SDRAM里面運行,為了使軟核的速度提升,因此SDRAM的頻率和cpu的頻率都設置為100M。cpu時鍾clk_100和sdram操作時鍾clk_50都接PLL的c0,100M,無相位偏移;SDRAM的時鍾管腳SDRAM_CLK連接PLL的c1,100M,偏移-3ns。
(2)DM9000A的時鍾管腳接50M,直接連接晶振的輸入端即可。
(3)復位管腳接高電平VCC即可。
(4)CFI_FLASH的復位管腳FLASH_RESET接高電平VCC即可。
3、軟件方面
(1)打開NIOS II,新建工程,調用web_server工程模板。
(2)添加DM9000A驅動:dm9000a.h和dm9000a.c,將上述兩個文件復制到上步建立的工程文件夾下。
(3)打開文件network_utilities.c,賦予靜態IP。
(4)編譯、下載、運行,之前要先將.sof的配置文件下載到FPGA內。在DOS下輸入ping命令:ping 192.168.2.1,如下圖所示,則可以正常ping通。

如果事先將網頁數據燒錄到FLASH中,在PC打開瀏覽器,則可以在瀏覽器上看到FLASH中的網頁內容。這個實驗之前在DE2板子上做過,這里就不再重復了。
4、工程文件解讀
(1)http.c、http.h:網頁相關文件;
(2)Dm9000a.h、dm9000a.c:DM9000A的驅動;
(3)User.h:任務調度優先級、缺省IP設置等等;
(4)network_utilities.c:設置IP,設置MAC;
(5)Web_server:主函數所在文件。
四、實驗內容2——>實現simple_socket_server
1、建立工程及文件解讀
在上一步的基礎上,直接在NIOS II中新建工程,調用simple_socket_server工程模板。添加DM9000A的驅動,將dm9000a.h、dm9000a.c添加到建立的工程文件夾下。工程文件主要包括以下幾個:
(1)alt_error_handler.h、alt_error_handler.c:錯誤類型句柄文件;
(2)dm9000a.h、dm9000a.c:DM9000A的驅動;
(3)network_utilities.c:設置IP,設置MAC;
(4)simple_socket_server.h、simple_socket_server.c:工程的主體程序,包括任務調度優先級、缺省IP設置、套接字、各種任務調度等等工作;
(5)led.c:LED、七段數碼管顯示程序;
(6)lwip_init.c:程序主函數。
2、需要修改的地方
依照web_server例程,對simple_socket_server例程進行部分修改:
(1)simple_socket_server.h文件,
添加分配DHCP優先級:#define DHCP_TMR_PRIO 8
添加語句:void die_with_error(char err_msg[]);
添加DHCP超時任務函數:void dhcp_timeout_task();
添加語句:#define DIE_WITH_ERROR_BUFFER 256
(2)lwip_init.c文件
添加DM9000A驅動:#include "dm9000.h"
添加DM9000A接口語句:ALTERA_AVALON_DM9K_INSTANCE(DM9000A, dm9k);
添加語句:OS_EVENT *attained_ip_address_sem;
在static void init_done_func(void *arg)添加以下語句:
//++sunev ALTERA_AVALON_DM9K_INIT(dm9k); /* * At this point lwIP has been initialized, but the Ethernet interface has * not; the lwip_devices_init() call does so, adding in MicroC-OS/II * threads for low-level Ethernet MAC interface and TCP protocol timer. */ //++sunev attained_ip_address_sem = OSSemCreate(1); if (!lwip_devices_init(LWIP_RX_ETHER_TASK_PRIORITY)) { alt_lwIPErrorHandler(EXPANDED_DIAGNOSIS_CODE, "[init_done_func] Fatal: lwip_devices_init failed, perhaps ethernet interface."); } //++sunev #if LWIP_DHCP == 1 if(!(IORD(0, 0) & (1<<17))) sys_thread_new(dhcp_timeout_task, NULL, DHCP_TMR_PRIO); /* * If DHCP is enabled, activate a thread for the 120-second long time period * that will set a static IP address if acquisistion via DHCP times out. */ //--sunev /* if (!sys_thread_new(NETUTILSDHCPTimeoutTask, NULL, NETUTILS_DHCP_TIMEOUT_TASK_PRIORITY)) { alt_lwIPErrorHandler(EXPANDED_DIAGNOSIS_CODE, "[init_done_func] Fatal: Can't add NETUTILSDHCPTimeoutTask!"); }*/
(3)將web_server中的network_utilities.c文件直接替換掉simple_socket_server中的network_utilities.c文件。
3、編譯、下載、運行
之前要先將.sof的配置文件下載到FPGA內。在DOS下輸入ping命令:ping 192.168.2.1,如下圖所示,則可以正常ping通。

再輸入telnet命令:telnet 192.168.2.1,則得到如下圖所示:

在PC鍵盤輸入0-7數字,則DIY_DE2上的8個LED就會相應的亮或者滅。至此,說明,telnet正常。
五、實驗結果分析
這個實驗結果分析,對上述2個實驗內容均為一致。
解讀上述程序,在network_utilities.c文件中,可以得知,設置IP的3種方法:第一種,程序設定靜態IP;第二種,DHCP獲得動態IP;第三種,缺省IP。其優先級及順序如下:
(1)當設定靜態IP之后,DHCP能獲得一個動態IP,但以設置的靜態IP為有效IP。
(2)當未設定靜態IP之后,DHCP則不能獲得一個動態IP,但過了設定的DHCP超時時間后(以上2個例程中的超時時間為120s),使用的是缺省IP,缺省IP為有效IP。
設定靜態IP時,NIOS II 運行結果

未設定靜態IP時,需等待2分鍾(DHCP超時可在simple_socket_server.h中設定),NIOS II 運行結果

注:可以在network_utilities.c文件中將
#if LWIP_DHCP == 1 *use_dhcp = 1;
中的
*use_dhcp = 1;
設置為
*use_dhcp = 0;
來取消DHCP功能。
六、實驗的幾點說明
1、IP值設置:
因為是采用局域網通信,所以要將PC和DIY_DE2的IP的前3位設置為相同,最后一位不同。
2、MAC值設置:
直接采用程序設定即可,或者是將MAC值存儲在FLASH中,上電讀取即可。本例采用的是前一種方法。
3、端口設定:
telnet的時候,需要偵聽端口,當偵聽的端口號和DIY_DE2中設定的相同的時候,才能正常通信。方法:telnet 192.168.2.1時,會有一個專用的端口23,將DIY_DE2中設定的端口號改為23即可(在文件simple_socket_server.h中#define SSS_PORT 23)。
4、關於這個例程在NIOS II方面:
關於Software Components這個按鈕下Lightweight TCP/IP Stack下選項為灰色的原因,其實這個不必理他。這一點也得到了友晶科技的證實。如果用LAN91c111這個網卡,上述位置的選項則可以正常使用,這說明NIOS II軟件只認SOPC中原裝的器件。
