1 引言 随着Internet技术的发展,在许多领域都引起了飞跃性的变化。嵌入式系统应用领域中一个新的趋势就是开始在嵌入式设备上集成网络通信功能,比如网络监控、网络数据采集系统等,以便于通过网络与远程设备进行信息的交互和增强系统的互连性,仅仅需要一根网线就可以轻轻松松完成系统的互连。 目前市场上的嵌入式处理器的种类很多。Altera公司推出了第二代片上可编程嵌入式软核处理器Nios II,再配上其低成本、高性价比的FPGA器件,使得嵌入式系统的开发变得越发方便。再者由于Nios II可配置和FPGA器件可编程的特点,与专用硬件相比灵活性得有很大的优势,从而使得FPGA器件在现代电子设计中得到广泛的应用。
2 系统设计2.1 Nios II简介 Nios II嵌入式软核处理器是Altera公司推出的第二代片上可编程的软核处理器,Nios II是可配置的,用户可以根据自己的实际需要进行处理器的配置,以达到资源的合理使用,其性能可以超过200DMIPS。Nios II采用哈佛结构,具有32位指令集,32位数据通道和可配置的指令及数据缓冲,而且支持用户自定义指令(最多256个)以扩展CPU指令集,提升系统的性能,为可编程片上系统(SoPC)设计提供了一套完整的解决方案。Nios II提供了三种内核:Nios II/f是一种高性能的内核,速度最快但消耗的资源最多;Nios II/e是低成本内核,速度最慢消耗的资源最少;Nios II/s是一种性能和成本折中的内核。本设计采用的是Nios II/s内核。 Nios II的优势就在于其灵活性,可以根据用户的需求进行灵活的配置和裁剪。基于Nios II软核的系统设计利用Altera公司提供的系统设计工具SOPC Builder和集成开发环境NiosII IDE可以进行软硬件协同设计,很大程度上缩短开发周期,在系统开发的任何阶段要都可以很方便的对系统进行修改。FPGA器件丰富的逻辑资源,结合Nios II强大的处理能力,将为嵌入式系统设计提供有效的解决方案。2.2 系统设计
图 1 系统模块图
系统模块图如图1所示。设计采用了Altera公司的Cyclone II系列芯片。在其中配置NiosII软核处理器控制外围设备和协议栈的运行。而且添加了一个计算校验和的用户指令(cal_checksum)。片上RAM用作内存运行程序;Flash使用了SHARP公司的LH28F160S3T-L13A,用来存储程序和配置信息,系统上电后,先将程序从Flash中拷贝到片上RAM运行;网络接口芯片使用SMSC公司的10/100M以太网接口控制芯片LAN9C111,所以在SOPC Builder中配置系统时,需要加上Altera免费提供的LAN9C111接口控制器,嵌入式设备通过LAN9C111就可以接入以太网,与网络上的其他设备进行网络通信;SDRAM选用Micron公司的MT48LC8M16A2,用来缓存网络数据,其中SDRAM控制器使用Altera免费提供的SDRAM控制器。 要提高系统的性能,一方面是提高处理器的处理能力;另一方面就是将用软件处理比较费时间的模块使用硬件模块来实现。经过分析发现,在网络协议栈的运行过程中,最耗费时间的是校验和的计算,尤其是当数据量非常大的时候。为此,专门用硬件定制了一个用户指令校验和计算指令(cal_checksum),对数据校验和的计算实现硬件加速,作为一个指令添加到NiosII系统中,在协议栈程序中调用来缩短计算校验和的时间,提高处理速度,达到提升系统性能的目的。2.3 校验和计算指令(Cal_chkusm) 在上面的分析中已经提到过,在整个协议栈的处理中,最耗时间的就是数据校验和的计算,特别是当数据长度很大时。所以在设计中将数据校验和的计算采用硬件模块来实现,作为NiosII的一个用户自定义指令,以提高校验和计算的速度。在协议栈的移植过程中,将数据的宽度修改为16位,方便最后将16位校验和的计算结果添加到相应的域。 校验和的计算需要很多个时钟周期才能完成,所以校验和计算指令使用了Multi-Cycle用户指令结构。Multi-Cycle用户指令的端口操作有:固定长度和可变长度。因为网络传输的数据长度是不断变化的,所以校验和计算指令选择可变长度操作,这也影响到端口信号的选择。 Multi-Cycle用户指令结构的信号有:reset,clk,clk_en,start,dataa[31:0],datab[31:0],done,result[31:0]。其中除了reset,clk,clk_en三个信号外,其他信号都是可选的,要根据具体的应用选择。本设计中校验和计算指令用到了start,dataa[31:0],done,result[31:0]。start信号作为数据有效信号,dataa[31:0]为数据输入信号,当校验和计算完成时done信号有效,通知CPU读取result端口上的数据,因此计算校验和指令逻辑必须确保当done信号有效时,result端口上的数据有效。在SOPC Builder中添加校验和计算指令,然后重新产生系统,再在QuartusII中更新并编译,在IDE的重新编译一次工程,系统库中的“system.h”文件包含校验和计算指令的宏定义如下: #define ALT_CI_CAL_CHKSUM_N 0x00000000 #define ALT_CI_CAL_CHKSUM(A) __builtin_custom_ini(ALT_CI_CAL_CHKSUM_N,(A))用户只需要在源文件中将计算校验和部分使用上面的宏做相应的替换就可以,对用户来说这再简单不过了,就像是调用一个子函数。由此可见