加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

UDP协议 收发数据的FPGA实现 verilog

(2015-10-17 15:20:12)
标签:

it

分类: FPGA学习
折腾了一个多星期终于把UDP的通讯给搞定了,目前可以把我的FPGA放到局域网中,进行通信了,可以远程控制FPGA led灯的开关了。目前只是实现了UDP发送数据和接收数据,还没有实现广播发送和arp接收,以及DHCP。最近时间不多,可能实现不了了,线停下来歇歇,然后再继续敲代码了。
下面我把自己在写UDP 通讯的时候写的头文件贴出来给分析一下, ip协议,udp协议,mac帧的封装等等。
这是笔者写的宏定义文件。
http://s9/mw690/0025qXBpty6Wh3auUDmf8&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />

上图显示的是UDP数据报的构成,UDP数据报头只有8字节,第一个字表示的是发送端的源端口号,第二个字表示的UDP的目标端口号,这些端口号都是16位的,其中高8位在前,第8位在后,紧跟着就是长度,这个长度是UDP数据的长度+udp报头的长度8,也就是说你要发送的数据是1位那么这里的长度应该写位9,然后就是UDP的校验和,这个校验和包括头部数据+UDP数据一块校验的,也可以不校验直接写16'h00(这个校验是可选字段)。数据的话如果小于18字节的话,就要在后面补够18字节(以太网数据规定每帧最小的数据是64byte),然后再交给IP网络层进行处理,注意:有效数据有几位UDP头中的数据就写几位,比如说 你只传送1个字节的数据那么U_D_LTH久设置为1 U_LENGTH就是9,至于你后面补充的17个自己的数据就不用加进去。但是如果用FPGA实现的话,后面补充的数据也要进行FCS(crc)校验的,这个地方我就折腾了好一阵子,因为没有校验填充的数据,网络调试助手老是收不到数据。
http://s5/mw690/0025qXBpty6Wh4jIwio84&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />
上图显示的是IP数据报协议的构成,IP头通常只有20个字节的数据,笔者在协议实现的时候,也是封装的20字节的协议头,这里的数据就不在介绍了,可以直接参看IP协议的书就可以了,我这里的注释也还好吧。
http://s3/mw690/0025qXBpty6Wh4DVHGy62&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />
这是网络链路层的数据封装过程,需要注意的是前导码的发送是从低位高高位发出去的。还有自己直接写的mac地址,其实在发送的时候需要转换一下,才能发出去,因为phy芯片是4位的,每个时钟周期只能发送4bit数据,而且对于一个字节的数据来说应该先发低位再发高位的。所以为了发送的方便我对mac地址做了转换,把每个字节的低四位与高四位换一下位置,然后再发送出去,这样就可以直接从高位到低位的发送了。
http://s3/mw690/0025qXBpty6Wh56GduG52&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />
这是我的发送状态机宏定义,S_DATA_S,S_DATA_L这两个状态分别对应的发送的数据小于18字节,大于等于18自己的发送状态,应为在发送小于18字节的数据时要进行数据填充。所以两个发送状态不一样。

http://s1/mw690/0025qXBpty6Wh5phQcw80&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />

http://s7/mw690/0025qXBpty6Wh5tMDwW86&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />
这里定义的宏用来控制发送的帧率,以太网规定每帧的最小发送间隔是96bit的发送时间,如果每个周期发送4位那么这个等待的周期数刚好是96/4=24。
http://s8/mw690/0025qXBpty6Wh5XS1Vl87&690收发数据的FPGA实现 verilog" TITLE="UDP协议 收发数据的FPGA实现 verilog" />
这是我在quartusii中看udp的rtl视图,图中sys_reset模块是采用的异步复位同步释放的复位输出,这样可以提高中合后的工作频率,笔者试过,如果不加这个模块,我的phy_clk_tx引脚最高跑到45MHz左右,如果加了这个模块,可以跑到60多MHz,cb大神说的应该不会错。我用了一个fifo用来测试的,实现把收到的数据发送出去。

总结,基本的功能实现了,如果有时间的话,就把DHCP,ARP,RARP实现了,其实,笔者的接收模块还没校验FCS,IP头的CHECKSUM也没校验。。。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有