微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于FPGA和LAN91C111的嵌入式以太网接口设计

基于FPGA和LAN91C111的嵌入式以太网接口设计

时间:03-29 来源:互联网 点击:

2 软件设计
ALTERA公司提供的硬件抽象层(HAL)中封装了系统中硬件的相关细节和驱动程序,用户可在HAL的基础上方便地开发存储等应用程序。
NIOSⅡIDE环境中集成有μCOS II和LWIP,其中LWIP必须在μCOS的支持下使用。μC/OSⅡ是一种免费公开源代码,结构小巧,而且具有可剥夺
实时内核的操作系统,它可移植、可裁剪,最多可管理64个任务,其每个任务都拥有自己独立的堆栈,大部分源码可使用ANSI C语言编写,整个软件部分可在NIOS II IDE开发环境下完成。由于程序的内容较多,本文着重介绍LAN91C111的初始化、发送数据、接收数据三个部分的软件设计方法。
2.1 初始化
ALTERA提供有LWIP的NIOS II端口,其源代码包含在NIOS II开发工具包中。LWIP可为NIOS II处理器提供对以太网连接栈的快速、开源
地访问。ALTERA的LWIP端口包括套接字API封装,提供有标准的、文档说明齐全的套接字API。LWIP协议栈的主要接口是标准的套接字接口。
除了套接字接口以外,还可调用lwip_stack_init()函数和lwip_devices_init()函数来对堆栈和驱动程序初始化。通过HAL系统代码可调用
init_done_func()、get_mac_addr()和get_ip_addr()函数来设置MAC地址和IP地址。为了初始化堆栈,在调用OSStart启动μC/OS II调度程序之前应调用函数lwip_stack_init(),其原型为voidlwip_stack_init( int thread_prio, void(*init_done_func)(void*),void*arg)。堆栈初始化后,还必须调用函数init_done_func(),而该函数必须调用函数lwip_devices_init()。利用函数lwip_devices_init()可以对在system.h中定义的所有已安装的以太网设备驱动程序进行注册,若返回一个非0值则表示注册成功。注册成功后,TCP/IP栈即可使用,之后便可在程序中创建任务。该函数的参数是接收线程的优先级。LWIP系统码在设备初始化过程中,可通过lwip_devices_init()函数调用函数get_mac_addr()和get_ip_addr()。用户通过编写这些函数,可在系统中将MAC和IP地址存放在任意位置,从而代替在设备驱动程序中固定位置的硬编码,并增加系统的灵活性。设计时,可以将MAC地址存放在Flash存储器中,也可以将MAC地址存放在片上内嵌的存储器中。当所有的初始化都准备好后即可调用OSStart()以启动RTOS进行任务调度。这个过程需要设置以太网目的地址、以太网源地址、协议类型,然后再按照所设置的协议类型来设置数据包。
2.2 数据的发送和接收
数据的接收和发送可采用中断方式。中断服务程序通过检查LAN91C111的中断状态寄存器来判断是发送中断请求还是接收中断请求。初始化完成后,即可创建任务,建立套接字,绑定端口,绑定完之后,再监听端口。当LAN91C111接收到数据包时,可由EPH模块察看此数据包的目的地址,若为本网卡的MAC地址或广播地址或多播地址,则把此数据包传送到LAN91C111的RAM中,并向处理器发送中断,由处理器进行数据处理。由于采用的是TCP/IP协议,接收数据应调用read()函数来接收建立连接的套接字中的数据,并将其放入缓冲区。发送过程则是由FPGA将数据传送到LAN91C111,再由LAN91C111将接收到的数据封装成数据包,并检测网络,当没有数据传输时,再将数据包传输到网络中,并向处理器发送中断信号,以表示数据传送完毕。发送数据时通过调用write()函数可将要发送的数据发送到指定连接的目的地址。

3 结束语
本文的整个设计使用了逻辑单元(LE)5314个,占用EP2C35F484芯片内部资源的16%,这充分体现了FPGA资源的丰富性。在传统设计中,通常选用单片机和低速网卡的设计方案,这在实际应用中,网络速度相对较慢,而本设计中选用高速的以太网控制芯片LAN91C111和高速的FPGA,极大地提高了系统的网络数据处理能力,并可满足网络数据采集的需求。另外,基于FPGA的NIOSⅡ方案,还可根据实际需要添加不同IP,这也体现了SOPC的灵活性与可裁减性。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top