http://www.360doc.com/content/12/0426/11/7769620_206630142.shtml 一文和下面的文章结合看效果比较好
前一篇文章写过关于利用DM9000A发送一些数据,通过一个回送装置,在DE2上又可以接收回来,这个程序从实际的应用来看,没有多大的用处。Altera给出的这个例子肯定是没有多大的实际价值的,他只是告诉你我们DE2能够做网络传输,仅此而已。
在上一篇提到,这个实验是个基础,他为后面做网络方面奠定了一个很好的基础。在这个实验的基础上,我在国外的一个论坛上下载到了一个UDP协议的发送数据的程序。下面对这个工程做一下小小的讲述。
这个工程从硬件方面来看,没有什么东西可讲的。但是,有一次,当我自己重新从头开始建立工程的时候,却发现出现了问题。最终,我一步一步的找到了问题的原因,问题最终出现在CPU的设定里面,在CPU设定的时候有一个cache line选项,那里面只能选择4B,不能选择32B,这里我翻查了一部分说明书,也没找到为什么是这种情况,而且NIOS II 是不公开的软核,我不知道内部的工作原理,也没有研究过。这只能当做遗留的一个困惑吧!另外一点,在SOPC里面这个工程用的是200M的时钟,已经相当快了。
主要来讲讲软件方面吧!在这里Altera并没有用来大家通用的socket编程,这里面,仅仅在硬件上进行操作,就是利用TCP/IP协议里面规定的一样,封装每个数据包,将数据包利用DM9000A里面给定的驱动API函数传输出去。这里面又让我学到了很多内容。主要就是封装数据包的各种格式。
封装主要包括以下几个方面:
MAC头+IP头+UDP头+发送的数据。这里就很符合TCP/IP里面讲的各个层的对应。最底层就是网络接口层(对应上面的MAC),紧接着是网络层(对应上面的IP层),上面就是传输层(这里用的是UDP协议,对应于上面的UDP头),最顶层就是应用层,这里就只有要发送的数据。这就是所有书上讲的TCP/IP协议的各个层,有了这个程序,就很容易的理解每个层之前的分工,以及他所对应的含义。
对于具体每个层是如何封包,每个数据又表示什么意义,这些就不一一细讲,因为这些都是固定的,如果需要,可以查看相关的书,就能看明白。了解了大框架,里面的东西就好理解了。
有了这些知识的储备,再来回过头看看整个工程的运作情况。首先需要计算一些封装包里的数据,包括包头长度,校验位等等。之后就是将MAC头+IP头+UDP头都封装在一个字符数组里面,以后每次打包数据的时候,放在这些包头后面就可以了。之后产生要发送的数据,进入一个无限循环,利用API函数将数据发送出去。这里,用网线将DE2和PC机连上,在PC机上,我们采用一个网络接收软件来实时接收发送的数据。这里,我采用的wireshark这款软件,从软件接收的结果来看,传输速率达到5.9Mbps,数据发送的也是正确的。说明整个工程是正确的,也是由实际意义的。
做一下简单的总结吧。
1.在这个工程下载来之后,我运行之后,是没有出现结果的。主要错误是,一个是在IDE里面编译的时候有错误,这个错误告诉我是软件的版本问题,这个问题解决的办法是将Debug文件夹删掉,这个呢,是参照以前编写C语言的经验想出来的,果然最后问题就解决了。
2.在随后有一次,我自己建立这个工程的时候,数据发送有问题,速度是原来的十分之一,想到了很多原因,首先就是DM90000A驱动的问题,看了一看驱动,最后发现确实是由点问题,驱动更新之后,他没有完全识别有的管脚信号,最后改了一下驱动,其次就是,在IDE控制台上,不要用printf函数,打印出发送的数据,这样的话,发送速率会减慢的。可能CPU要来做printf这个函数,而减慢吧、
3.最后要总结的就是这个工程的意义所在,因为这个工程奖DE2的数据发送到PC机上,这样的话,就可以为网络视频监控系统解决了最关键的一个问题,传输速率也得到了保障。但是,远远没有想到,其实在整个工作中,这一点其实不是最难点。
来分析一下将来的工作难点:
完成的工作:
1.前端数据的采集、缓存、VGA显示都已经很好的完成;
2.数据的发送,利用cpu不断发送数据也基本完成;
3.PC机上监控界面也开发了一部分。
难点工作:
1.在数据采集、缓存之后,如何利用cpu来不断地取数据呢,首先在硬件采集的时候,SDRAM已经用上,这样的话,在SOPC里面,就没法连接上SDRAM,这样的话就要建立一个数据通道,即是一个FIFO,但是这个FIFO的建立是很困难的,首先CPU的工作时钟是200M,像素的采集时钟是25M,要达到这样的速率匹配是很困难的;其次就是,如何在IDE里面控制数据的读以及暂停CPU的读取,因为FIFO里面肯定会出现读空的情况。
2.从数据发送到PC机,以及在PC机上利用VC开发一个界面,在界面的制作过程中,也遇到了很多问题。现在终于把问题解决了,利用两个线程,一个线程用来接收数据,当接收到一帧数据的时候,利用消息告诉主线程,将数据通过位图的形式画出来,这个肯定是没有问题。这里面应该是有问题的,因为PC机没有和DE2进行用户界面交换,他只是用来接收数据,没有发送命令啊以及一些等等控制命令。但是这些应该是比较好解决的,因为毕竟PC机上,C语言的调试还是比较方便的。
所有的难点就是在第一个上,因为我无法对这个FIFO里的数据读取,看是否正确,因为视频数据时很大的,没法看。这一点是很困惑的,所以整个系统都耽误下来了,好久都没有突破。希望在接下来的时间里,找到突破的地方。
文章评论(0条评论)
登录后参与讨论