你的位置:EETOP 赛灵思(Xilinx) 社区 >> >> 全部 >> 详细内容

赛灵思“安富利杯”LX9开发板使用征文---SP6 LX9 Demo Board 试用及LwIP设计开发笔记

发布者:buley 时间:2011-08-27 19:51:59

前言:

这是我第一次正式的接触Microblaze开发,之前用FPGA都是用逻辑实现的2层网络通信的功能,如今也可以考虑在FPGAembeded system上实现TCP.IP网络处理了,我在SP6-LX9这块开发板上进行了LwIP的开发,用RAW API的方式分别实现了Echo serverEcho Client并测试成功。使用ISE12.4软件,系统采用PLB总线结构。该笔记以时间为顺序记录了SP6-LX9的整个学习和开发过程。

 

l         开发板初体验:

最初看到Xilinx® Spartan®-6 FPGA LX9 MicroBoard(以下简称LX9)这块开发板的时候就觉得这就是我心目中开发板的模样,高度集成,小巧,低成本,低功耗,供电和下载都很方便,带有调试必须的串口和网口。虽然不像其他开发板那样有丰富的接口,但对于开发来说,这些已经足够去做很多开发了,尤其是软核CPU的嵌入式开发,在硬件上一切都已就绪,剩下的就是充分发挥想象空间,怎样让这块小巧的开发板绽放强大的生命力。

开发板本身内带了嵌入式的演示程序,通过micro USB口接入供电之后,4个红色LED开始走马灯的闪烁,跟着getting start的文档很快就将USB UART的驱动装好,将串口调试程序打开便可以看到命令行了,可以敲一些命令。

刚看到这块开发板的时候我和很多人一样,第一念头就是做一个webserver,没想到开发板的设计者想的很周到,在演示程序中就已经自带了webserver了,设置好本机IP,按下开发板的按键4,不一会儿,就可以用IE登录页面了。

小结:开发板做的很精致,实用,尤其是成本控制的很好。自带的演示程序很容易上手,涵盖了板子上的所有功能。接下来就得好好思考一下如何在这块开发板上做自己的应用了。

 

l         开发准备工作:

因为之前有做过SP6的项目,早期ISE软件支持SP6有些问题,所以一路从11.3升级到了12.4XILINX官网上最新的是13.2,但是家里网络不给力,试了好几次都没有成功下载下来,于是还是用12.4ISE版本来设计吧。

LX9的资料比较齐全,在http://www.em.avnet.com/s6microboard(以下称“网站”)上可以下载到,分别对应的有ISE 13.1的参考设计和ISE 12.4的参考设计。在照着Getting Start的文档玩了一下内嵌的程序后,接下来就是要构建自己的系统了。

要将开发板运行起来需要在电脑上配置驱动环境,开发板的JTAG用的是第三方的,开发板JTAG的配置说明可以在Spartan-6 LX9 MicroBoard Configuration Guidecreating embedded system中找到,尤其是对SDKJTAG配置,需要添加如下参数:-cable type xilinx_plugin modulename digilent_pluginUSB UART功能需要先从开发板网站上下载安装CP210x_VCP_Win_XP_S2K3_Vista_7驱动包即可使用。

 

l         开发知识学习:

之前几乎没有接触过MicroBlaze的开发,不过没关系,网站上提供了很多的开发实例,照着12.4的教程一步一步的做吧,没有谁天生是高手,高手都是从菜鸟一步步走过来的。

1.       安装XBD文件

XBD文件是Xilinx Board Description的缩写,定义了板子的一些特性和一些系统设计中用到的标准外围设备,在Basic System Builder(BSB)中可以方便的使用这些定义的特性和外设。

过程也很简单,从avnet的网站上下载开发板的XBD文件,解压缩到ISE的安装路径下的XILINX_EDK\BOARD即可。这样在下一步BSB中就可以看到这款开发板了。

2. 构建硬件系统

BSB向导可以轻松的帮助我们建立我们需要的硬件系统,这里的工作包括以下几项:

Ø         初始化Microblazer和外设

Ø         创建时钟

Ø         创建约束文件

Ø         创建脚本文件

具体的过程跟着J800_AvtS6LX9MicroBoard_MBHP_Create_12_4_02.pdf做就对了,中间有一个选择总线结构的,有PLBAXI总线,AXI总线是最近才集成进去的,要用起来可能还需要学习一下结构,PLBprocess local bus的缩写,之前器件都用的是这个总线结构,我的这个设计里面用的是PLB

XPS里完成了构建步骤这里就可以生成下载bitstream了。至此,一个完整的硬件环境建立了。

还有一些其他教程例如添加Custom IP,顾名思义就是添加用户自己定义的逻辑等,这些照着网站上的教程做就好了,不多说。

 

l         SDK开发:

对于FPGA工程师来讲,看到C/C++和操作系统这些东西不免有些头痛,考试计算机二级的C语言水平早就忘记的差不多了,不过头痛也得继续,为了更好的未来。

打开SDKNEW一个XILINX HARDWARE PLATFORM SPECIFICATION,选STANDALONE这个最基础的模块,这个模块可以比较底层的调用CPU的所有缓存和相关外设,就是之前建立硬件系统时的那些外设,包括串口,DDRFLASH,网口等。相当于比较底层的软件接口了。记得要把LwIPXilmfsXilinx Memory file system)这两个library加进去。这个作为基础的BOARD SUPPORT PACKAGE.

因为我做通信出身,所以对于TCP/IP的开发比较感兴趣,于是就瞅上了LwIP这个玩意,LwIP全称是light weight IP,是一个TCP/IP的协议栈,一般网络处理都会用到这个,之前在FPGA上做的都只做二层的东西,如今也可以考虑在FPGAembeded system上实现TCP.IP网络处理了。

AVNET网站上LwIP的例子只有for ISE 13.1版本的,这让我这个用ISE 12.4的人情何以堪?无奈只有硬着头皮,用手头的12.4自行实现LwIP的设计。

LwIPRAW APISocket API两种模式,RAW API模式效率高,但是通用性不强,相反Socket API模式通用性好一点,用法简单一些但是效率上不高。效率主要是体现在性能和内存上。LwIP的文档可以在[Xilinx]\12.4\ISE_DS\EDK\sw\ThirdParty\sw_services\

lwip_v3_00_a\中找到,建议大家读一下rawapi.txt这个文档,是RAW API模式下的一些函数。xilinx的网站上的xapp1026是关于它的一个应用文档。更多的资料在http://savannah.nongnu.org/projects/lwip/上面可以找到。

照着之前的文档生成的硬件环境有个地方需要修改,那就是要把Ethernet MACinterrupt接到xps_intc_0也就是interrupt controller上,不然LwIP会报错。操作也很简单,在port页面里,把Ethernet MACinterrupt设为new connection,然后在xps_intc_0里面添加这个中断即可。

SDK里面新建一个xiilnx C project,选择之前定义好的Standlone_bsp这个board support package,用lwip echo server这个templete来实现我的LwIP设计。

Ø         Echo Server设计

Echo server的原理是,将LwIP设置为server端,首先创建一个连接,然后打开这个连接,在这个连接上侦听,如果有客户端连接这个IP的这个端口的话,就把连接建立起来了,这个时候就进入接受数据状态,如果有数据过来,就把它收下来,然后在通过LwIP发送出去。

Echo Server的实现很容易,直接用templete中的例子就可以运行一个简单的echo server设计,将之前的比特文件下载到开发板上,在SDK中在开发板上run整个工程,很快就可以在串口窗口看到如下信息了:

这时候打开TCP-UDP服务管理软件,将其作为一个TCPclient去连开发板,填好IP和端口号,点连接即可,这时候在数据发送区任意填写一些字符,点击发送,就可以看到下面的数据显示区收到开发板echo回来的字符了。如图所示:

       这样就验证了Echo server的功能。

接下来,我在Echo server的基础上做了一些修改,将其改成了一个client,因为大部分情况下,服务器一般都是PC,而我们开发的东西都是client,需要去连接主机进行一些通信。

Ø         Echo Client设计

Echo Client的原理和Echo Server差不多,只是在创建连接过程上有一些区别,在创建了连接之后,需要主动的用tcp_connect函数去连接服务器,在连接成功之后,同样也进入到接收数据状态,将收到的数据转发出去。

       在代码中,将Echo Server的侦听转为连接,注释掉的为原来的侦听函数,具体修改为:

//pcb = tcp_listen(pcb);

err = tcp_connect(pcb,&ipaddr,port,connected_callback);

       还需将连接确认函数注释掉,添加上接收数据并返回的函数,具体修改为:

//tcp_accept(pcb, accept_callback);

tcp_recv(pcb, recv_callback);

代码修改完后,接下来打开TCP-UDP服务管理软件,将其作为一个TCPserver,选择本机IP和端口号,点侦听,然后将代码在开发板上RUN起来,就可以在串口窗口看到如下信息:

下面的data sent是我添加的一个提示,每当echo一次的时候就会打印一遍。同时在TCP-UDP服务管理软件的界面上,也可以看到连接上去的客户端窗口中显示开发板作为客户端连接上了,在数据发送区发送16进制数据,可以看到在数据显示区开发板返回的数据,如图所示:

       这样就验证了Echo client的功能。

 

总结:

SP6-LX9的开发中,大多数开发时间是花在SDK上的,因为开发板就像是一块地皮,而SDK的软件开发就像是在这块地皮上修的建筑,同样一块地皮,你可以修摩天大楼,也可以只是盖个猪圈,当然价值就是天壤之别了。嵌入式开发可以让想法和创意得以快速实现,也能够更好的体现开发人员的价值,这需要我们开发人员不断的学习,思考和进步。

LwIP的应用比较全面,在RAW API模式下,效率会比较高,设计可以更加灵活,这里实现了其作为serverclient的两种基础应用,为将来进行更深入的TCP/IP开发打下了基础,有很多的创意可以由此产生。

最新课程

  • 深入浅出玩儿转FPGA

    本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念

  • 从零开始大战FPGA基础篇

    本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“

  • Verilog基础及典型数字

    课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了