引言
随着电子工艺的发展,电子器件的发展趋势是: 体积越来越小,集成度越来越高,功能越来越强。FPGA即是一种随之发展而来的新兴的可编程逻辑器件,与其他的PLD相比具有更高的集成度、更快的工作速度和更大的编程灵活性。MC9S12NE64是一种集成了EMAC和EPHY的16位单片机,较以往的以太网控制器(如RTL8019AS、DM9000A、LAN91C111等),MC9S12NE64既具有以太网控制器的功能又兼具单片机的特点——体积小、可靠性高,外围电路少,设计大大简化,占板空间少,系统开发成本低等。
1 硬件设计
1.1 原理简介
图1 以太网接口的硬件结构框图
以太网接口的硬件结构框图如图1所示。在IEEE802.3协议中,MAC作为一个子层,用于实现数据帧的封装、解封、发送和接收的功能;MII是连接数据链路层和物理层的接口,同时具有数据管理的功能。在FPGA的内核中,自定义一个用于与MC9S12NE64相连接的接口,接口采用总线方式,通过异步双口FIFO,将PHY传来的信号COL、CRS提供给MAC子层,用于载波监听和冲突检测,在FIFO内部解决时钟同步的问题以实现数据的正确传输。
1.2 主要电路模块
(1) FPGA
FPGA选用的是Altera公司的Cyclone II Ep2c8Q208c8,具有8 256个逻辑单元(LE),可方便地实现用户自定义的功能。FPGA相当于一个空白的芯片,用户可根据实际需要自行定义其内核,方法是在Quartus II界面下新建一个工程。打开SOPC Builder向系统内部加入Nios II核和用户所需外设接口,如SDRAM、Flash、UART等。这些接口通过Avalon总线实现Nios II处理器与外部器件的连接[1]。由于SOPC Builder中没有提供MC9S12NE64的接口模块,所以需要自行开发组件,即在QuartusII中用Verilog语言编写MC9S12NE64的接口程序,通过SOPC Builder下的CREATE NEW COMPONENT加入接口程序,即可实现FPGA内部核心配置[2]。FPGA的内核模块如图2所示。
图2 FPGA的内核模块
(2) MC9S12NE64
MC9S12NE64是16位的单片机,内部有1个高性能的25 MHz HCS12内核,64 K内存,内部集成了以太网的MAC和PHY,具有10/100 Mbps特性,内置标准的媒介独立接口(MII),可以实现地址识别及数据管理的功能;8 KB的EMAC缓冲区,包括1个发送缓冲区和2个接收缓冲区,MC9S12N64的RAM以2倍于CPU的速度和CPU交换数据,使得CPU和EMAC缓冲区可以交换存取数据;遵循IEEE802.3协议,支持半双工和全双工通信。MC9S12NE64最小系统由MC9S12NE64单片机、25 MHz晶振及复位电路组成。通过外接RJ45实现系统与网络的连接。MC9S12NE64与FPGA通信接口的逻辑框图如图3所示。
图3 MC9S12NE64与FPGA通信接口逻辑框图
各引脚功能如下:
wr输入信号,为FPGA的写信号,与MC9S12NE64的写端口相连;
rd输入读控制信号;
ready输入信号,数据就绪标志;
ALE输入信号,与MC9S12NE64的ALE信号相连,用于FPGA片内锁存地址,配合wr信号进行MC9S12NE64与FPGA的通信;
p0双向信号,用于地址和数据的传送;
p1输入地址信号;
dout1、dout2锁存输出信号;
din输入信号,来自MC9S12NE64数据总线;
lantch读数据锁存信号。
(3) 异步双口FIFO
为了满足时钟不同步的要求,需要FIFO具有异步的读、写时钟。当冲突检测信号COL为高时,要求发送帧执行退回操作,回至FIFO中等待下一个Transmitting信号。FIFO的设计如下: 设置异步Reset,高电平触发;设置8位寄存器fifodata,保存FIFO的数据;设置fifo_rp和fifo_wp为读、写指针,cr_rp和cr_wr为进位标志,fifo_rp和fifo_wp为FIFO_DEPTH1时取反;设置nempty、nfull、near_empty、near_full为数据空、满指示。测试时,暂定容量FIFO_DEPTH为32字节(实际要求至少一个帧的大小,即1 530字节),读、写时钟分别为50 MHz和25 MHz,时序仿真波形如图4所示,FIFO能够成功读写。
图4 时序仿真波形
(4) 通信电路
为了实现系统与PC机的通信,以便上位机管理,将FPGA内部接口UART外接MAX232接口电路,通过RS232实现与PC机之间的数据通信。
2 软件设计
本设计采用自顶向下的设计方法,将系统分为几个独立的模块,模块之间相互独立有利于软件的修改和调试,应用Nios II IDE完成程序的编译。网络接口通过本地DMA和远端DMA来完成数据的收发。所谓“本地DMA”可以理解为MC9S12NE64内部数据传输,而“远端DMA”是指MC9S12NE64与FPGA之间的数据传输。
(1) 初始化
初始化程序主要包括设置寄存器和操作数据端口,设置数据总线宽度、中断服务类型以及设置接收和发送数据缓存区的大小等。
(2) 发送数据
MC9S12NE64作为一个集成以太网接口的单片机,数据的发送校验、碰撞检测由芯片自己完成。这里只需要配置发送数据的物理地址、源地址、目的地址、数据类型及发送数据即可。数据的发送由两步完成: 首先,把内存中的数据传入MC9S12NE64的发送缓冲区;然后设置寄存器启动本地DMA将数据送入FIFO发送出去。
(3) 接收数据
在初始化程序中已经分配好了接收缓冲区的位置,并且配置好了中断的模式。当有一个正确的数据包到来时,控制器发出中断请求,中断申请响应后,进入中断服务程序并开始接收数据。在查询方式下,通过查询CURR和BNRY两个寄存器的值来判断是否收到1帧数据。当BNRY+l与CURR不等时,说明接收缓冲区接收到了新的数据帧。若收到新数据帧,则先读取前2个字的数据,这2字的数据代表此次传输的数据帧的基本状态:第1个字的低字节表示接收状态,第1个字的高字节为下一个包的开始地址指针;第2个字节为本数据包的长度(以字节为单位计算)。本课题采用中断和查询组合的方式接收数据包。
结语
将MC9S12NE64以总线方式与FPGA进行通信具有以下优点:速度快,其通信工作时序是纯硬件行为;节省FPGA的I/O口线;相对于非总线方式,编程简单控制可靠;在FPGA中通过逻辑切换MC9S12NE64易于与SDRAM或ROM接口。该设计增强了系统的灵活性,实现了高速的以太网数据传输,具有广阔的应用前景。