前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于UDP/IP协议的电口通信(一)

基于UDP/IP协议的电口通信(一)

作者头像
碎碎思
发布2020-06-28 17:28:27
7680
发布2020-06-28 17:28:27
举报
文章被收录于专栏:OpenFPGAOpenFPGA

本次设计基于UDP协议的通信设计,设计思路采用FPGA辅助设计-模块设计。

设计参考:https://opencores.org/projects?expanded=Communication%20controller

Opencores上有很多和通信相关的开源IP核可以使用,包括MAC、ARP、PCS等等,但是大部分IP都是VHDL语言写的,这和国外的设计习惯息息相关(为什么国内就没有类似的网站呢?大部分网站除了收费就是收取积分,太难了。)

所以本次设计主要还参考《ALINX》《MIZ》等国内开发板设计的UDP/IP协议栈。

首先根据UDP协议设计如下框图。应用层不在本次设计范围内,只需要预留接口供后续开发需要即可;所以设计的第一层即运输层,主要添加UDP首部,然后是IP层,添加IP首部,接下来就是MAC层,形成以太网帧,最后数据通过MII接口将数据发送给PHY,完成整个通信。下面以应用数据发送为例,简单解释下流程。

1、 应用数据报发送给UDP发送模块,UDP发送模块会添加UDP首部后发送给IP层发送模块;

2、 IP层发送模块添加IP首部后发送给MAC层发送模块;

3、 MAC发送模块会形成以太网帧之后会通过RGMII总线发送给PHY;

4、 ICMP应答模块主要实现PING功能,ARP发送模块主要实现ARP功能。

图8‑18 UDP发送数据的简易流程

根据模块设计,接下来要分析主要数据流向,如下图所示:

图8‑19 udp_ip_stack层叠结构和数据流向图

表8‑7 udp_ip_stack层叠结构图说明

模块/层

说明

udp_ip_protocol_stack

顶局模块,使用该协议栈时,需要了解其接口和配置参数。

udp_layer:主要完成对上层应用数据的 udp 协议控制

udp_send

完成对上层应用数据 udp 报文的发送,udp_send 中例化了长度为 8 的移位寄存器组 udp_shift_register,用于发送 udp 首部时进行数据缓冲。

udp_receive

完成对上层应用数据 udp 报文的接收。

ip_layer:完成对 udp 报文的 ip 协议控制

ip_send

ip 局协议数据的发送,包含发送 icmp 协议包的子模块 icmp_packet_send。目前,可支持 icmp 协议中的 ping 子协议,可接收并应答外部的 ping 请求包。 ip_send 中例化了长度为 20 的移位寄存器组udp_shift_register,用于发送 ip 首部时进行数据缓冲。

ip_receive

ip 局协议数据的接收,包含了解析 icmp 协议的子模块 icmp_packet_process,ip 首部校验和校验模块ip_header_checksum_check。

icmp_echo_data_fifo

用于缓存 icmp_packet_process 模块所解析出的 ping 请求数据包中的附加数据,供 icmp_packet_send 模块发送 ping 应答包时读取。

arp_layer:主要完成 arp 协议的控制

arp_send

完成 arp 请求/应答包的发送

arp_receive

完成 arp 请求/应答包的接收

mac_cache

mac_cache 用于建立ip 地址和 mac 地址之间的查找表。

send_buffer

send_buffer 主要完成 arp_send 和 ip_send 模块发送请求之间的仲裁,将 arp_send 和 ip_send 模块所需发送的数据发至 mac_layer。同时,完成 ip 地址至 mac 地址的查找,以及 ARP 请求的发起。

receive_buffer

receive_buffer 主要对从 mac_layer 输出的 ip 包和 arp 包进行分类,并分别将对应数据输出至ip_receive 和 arp_receive 模块。

mac_layer:主要完成对 ip 数据报和 arp 包的 mac 协议控制

mac_send

完成 mac 帧的发送,mac_send 包含了 mac 发送流量控制的子模块 mac_send_flow_control, CRC 校验码生成子模块CRC32_generation,并通过 send_fifo 完成用户接口时钟域至 phy 接口时钟域的转换。本模块通过mac_control_frame_process 和 mac_send_flow_control 模块可完成有效的以太网流量控制。同时,mac_send 中例化了长度为 22 的移位寄存器组 mac_shift_register,用于发送 mac 首部时进行数据缓冲。

mac_receive

完成 mac 帧的接收,包含 mac 暂停帧解析子模块mac_control_frame_process, CRC 码校验子模块 CRC32_check,并通过 receive_fifo 完成 phy 接口时钟域至用户接口时钟域的转换。

上述数据流向不需要太详细,只需要了解大致的数据流向图即可,接下来就是每个模块的详细设计。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档