一、摘要

  Altera软件NIOS II高版本(7.2版本以上,本例程中使用的是9.0版本)中实现TCP/IP所用的协议栈为NicheStack,常用的例程有2个,web_server和simple_socket_server,这篇文章只叙述simple_socket_server例程实现的过程。这里DM9000A的驱动和上篇博文中基于LWIP的驱动不同。

二、实验平台

软件平台:Quartus II 9.0 + Nios II 9.0

硬件平台:DIY_DE2

三、实验内容——>实现simple_socket_server

1、采用SOPC定制软核

定制软核的详细步骤不再赘述,以上为定制的软核。

cpu_0需要设置的地方:

Reset Vector:cfi_flash_0、

Exception Vector:sram_16bit_512k_0

必须要添加sys_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,新建工程,调用simple_socket_server工程模板。

(2)添加DM9000A驱动:dm9000a.h和dm9000a.c,将上述两个文件复制到上步建立的工程文件夹下。

(3)打开network_utilities.c文件,将附录代码覆盖原始代码,这里采用的是使用静态IP的方法(IP的值将在后面给出说明),并且赋给MAC值。

(4)打开iniche_init.c文件,

添加头文件#include"dm9000a.h",

添加DM9000A接口语句DM9000A_INSTANCE(DM9000A_0, dm9000a_0);

在函数void SSSInitialTask(void *task_data)中,

添加DM9000A的初始化语句DM9000A_INIT(DM9000A_0, dm9000a_0);

(5)编译、下载、运行,之前要先将.sof的配置文件下载到FPGA内。在DOS下输入ping命令:ping 192.168.2.1,如下图所示,则可以正常ping通。

再输入telnet命令:telnet 192.168.2.1,则得到如下图所示:

在PC键盘输入0-7数字,则DIY_DE2上的8个LED就会相应的亮或者灭。至此,说明,telnet正常。

4、工程文件解读

(1)alt_error_handler.h、alt_error_handler.c:错误类型句柄文件;

(2)dm9000a_regs.h、dm9000a.h、dm9000a.c:DM9000A的驱动;

(3)network_utilities.h、network_utilities.c:设置IP,设置MAC;

(4)simple_socket_server.h、simple_socket_server.c:工程的主体程序,包括任务调度优先级、缺省IP设置、套接字、各种任务调度等等工作;

(5)led.c:LED、七段数码管显示程序;

(6)iniche_init.c:程序主函数。

四、实验结果分析

NIOS II运行结果:

稍过2分钟后,得到如下结果:

  实验现象,程序一开始运行,先赋给静态IP,这时候ping能够跑通,但telnet却不能跑通。稍过2分钟之后(这个默认时间在LWIP协议栈实现的时候可以调整,但在NicheStack协议栈中不能调整,至少在工程文件里是这样),出现上面第二幅结果图的时候,能够ping正常,telnet正常。

  分析可得,虽赋予静态IP,但是系统仍是先通过DHCP获取IP,获取超时,使用缺省IP,缺省IP的设置在simple_socket_server.h中。而真正能够ping正常,telnet正常的却是事先赋予的静态IP。

注:取消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中原装的器件。

附录:

network_utilities.c文件

#include <alt_types.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <sys/alt_flash.h>
#include "includes.h"
#include "io.h"
#include "simple_socket_server.h"#include <alt_iniche_dev.h>#include "ipport.h"
#include "tcpport.h"
#include "network_utilities.h"#define IP4_ADDR(ipaddr, a,b,c,d) ipaddr = \htonl((((alt_u32)(a & 0xff) << 24) | ((alt_u32)(b & 0xff) << 16) | \((alt_u32)(c & 0xff) << 8) | (alt_u32)(d & 0xff)))/*
* get_mac_addr
*
* Read the MAC address in a board specific way
*
*/
static unsigned char macaddr[6] = { 0x00, 0x07, 0xed, 0xff, 0x06, 0x00 };int get_mac_addr(NET net, unsigned char mac_addr[6])
{int rv = -1;/* first 3 bytes are altera's vendor id *//* last 3 bytes are picked from serial number sticker */mac_addr[0] = macaddr[0];mac_addr[1] = macaddr[1];mac_addr[2] = macaddr[2];mac_addr[3] = macaddr[3];mac_addr[4] = macaddr[4];mac_addr[5] = macaddr[5];/* return the mac address in the array */rv = 0;return rv;
}/** get_ip_addr()** This routine is called by InterNiche to obtain an IP address for the* specified network adapter. Like the MAC address, obtaining an IP address is* very system-dependant and therefore this function is exported for the* developer to control.** In our system, we are either attempting DHCP auto-negotiation of IP address,* or we are setting our own static IP, Gateway, and Subnet Mask addresses our* self. This routine is where that happens.*/
int get_ip_addr(alt_iniche_dev *p_dev,ip_addr* ipaddr,ip_addr* netmask,ip_addr* gw,int* use_dhcp)
{IP4_ADDR(*ipaddr, 192, 168, 2, 1);IP4_ADDR(*gw, 192, 168, 2, 1);IP4_ADDR(*netmask, 255, 255, 255, 0);#ifdef DHCP_CLIENT*use_dhcp = 1;
#else /* not DHCP_CLIENT */*use_dhcp = 0;printf("Static IP Address is %d.%d.%d.%d\n",ip4_addr1(*ipaddr),ip4_addr2(*ipaddr),ip4_addr3(*ipaddr),ip4_addr4(*ipaddr));
#endif /* not DHCP_CLIENT *//* Non-standard API: return 1 for success */return 1;
}

转载于:https://www.cnblogs.com/lianjiehere/p/4019430.html

转载 基于NicheStack协议栈的TCP/IP实现相关推荐

  1. 怎样实现linux的网络通信协议是,一种基于Linux系统的TCP/IP协议栈的实现

    一种基于Linux系统的TCP/IP协议栈的实现 本文分析了Linux内核TCP/IP协议栈的实现,给出了Linux网络数据处理流程,探讨了Linux的I (本文共3页) 阅读全文>> 介 ...

  2. 基于TI C6000的TCP/IP协议栈的研究与实现

    本文来自:东北大学信息学院 李松  吴建华 <TI C6000DSP上TCP/IP协议栈的实现> 有适当删减. 摘要:针对TIC6000系列DSP网络开发工具NDK进行研究,结合TMS32 ...

  3. 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲 ...

  4. 用户态协议栈之tcp/ip设计

    1 解决问题 对于服务器而言,正常的接受一帧Data的过程,客户端先通过网络发送一帧数据到网卡,再经过协议栈,最后通过系统调用叨叨应用程序.具体的流程图如下: 针对上面的两个流程,涉及到两次拷贝(网卡 ...

  5. TCP/IP协议栈在MSP430单片机上的实现

    引言 随着信息技术的不断发展,以及人们对日常生活舒适度.方便度要求的提高,信息家电.智能仪表等产品越来越频繁的出现在我们的生活当中:人们也越来越热衷于把家电.仪表等设备连接到Internet 中,从而 ...

  6. TCP/IP网络协议栈:以太网数据包结构、802.3、MTU

    <TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...

  7. TCP/IP协议——TCP/IP协议栈及框架

    TCP/IP协议同ISO/OSI模型一样,也可以安排成栈形式.但这个栈不同于ISO/OSI版本,比ISO/OSI栈少,所以又称之为短栈.另外,需要知道的是:TCP/IP协议栈只是许多支持ISO/OSI ...

  8. 网络编程-TCP/IP协议栈-IP协议

    协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...

  9. Linux内核协议栈分析之网卡初始化——tcp/ip通信并不神秘(1)

    写在代码前: 写技术类文章的一个痛苦之处在于--写简单了,看的人觉得没意思:写难了,又看不懂是什么意思.例如--<redis源代码分析--事件机制>http://blog.csdn.net ...

  10. uIP TCP/IP协议栈

    转自yxwkaifa微博 第1章  uIP TCP/IP协议栈 uIP TCP/IP协议栈的目标是:即便是8位微控制器也可以使用TCP/IP协议栈进行网络通信.虽然小而简单, uIP不须要与他们通信的 ...

最新文章

  1. 办公电脑选购方案指南
  2. 【时序数据处理】pandas某些列由于n个数据导致的,通过Series生成Dataframe
  3. c++求解自行车慢速比赛问题_一元一次方程应用专题,十大题型(包括数轴上动点问题)...
  4. 检测生成.xml文件的效果:以人脸xml为例
  5. Linux运维:ulimit命令修改打开文件的句柄数
  6. django 2.0 url匹配
  7. 开源服务器Tornado的初步了解
  8. PHP 备份还原 MySql 数据库
  9. 新概念英语第三册单词
  10. 职称论文发表时怎么选择期刊
  11. 什么是数据增强(Data Augmentation)
  12. 【ArcGIS|空间分析】选址分析(为学校选址)
  13. 牛客网刷题java之(斐波那契数列)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
  14. I'm coming now.
  15. Java——字母大小写全排列
  16. (在WPS或者WORD中使用MathType编辑数学公式)写论文必备
  17. 百度地图定位出现4.9E -324的问题解决
  18. android 广播监控手机电量
  19. 云端服务器维护,云端服务器维护
  20. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat

热门文章

  1. 君が呼ぶ メギドの丘で 美吉特之丘的呼唤 游戏感想
  2. 用自己的算法实现startsWith和endsWith功能
  3. 团队计划(4.22)
  4. 关于离散数学的一点事情
  5. 【leetcode】面试题 03.03. 堆盘子vector_stack的使用
  6. 逆向知识第七讲,三目运算符在汇编中的表现形式,以及编译器优化方式
  7. Remote System Explorer Operation在eclipse后台一直跑 解决办法
  8. BZOJ4817 [SDOI2017]树点涂色
  9. 一、auto_test_base
  10. Web---HTTP请求、重定向、转发和数据压缩