专栏首页OpenFPGA基于UDP/IP协议的电口通信(一)

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

本次设计基于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 接口时钟域至用户接口时钟域的转换。

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

本文分享自微信公众号 - OpenFPGA(OpenFPGA),作者:碎碎思

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    有些生命自然而来的缘份,是约定俗成好了的。无力改变。只能精心的筹划痴心的遥望耐心的守候动心的注目。

    碎碎思
  • 最新 Xilinx vivado IP许可申请

    xilinx的fpga使用vivado开发,zynq系列fpga的SOC开发成为主流,加快fpga开发,也进一步提高了fpga开发的灵活性。

    碎碎思
  • PHY_MDIO 接口设计

    在以太网通信中,设备之间的物理局链路均由 PHY 芯片建立。PHY 芯片内部含有一些列寄存器,用户可通过这些寄存器来配置 PHY 芯片的工作模式以及获取 PHY...

    碎碎思
  • HTML中让表单input等文本框为只读不可编辑的方法

    小小许
  • html中让input标签只读不可编辑的方法

    黑泽君
  • Codeforces Round #615 (Div. 3) E. Obtain a Permutation

    ② 把矩阵中任意一列整体往上挪一个单元格,如下图矩阵我们对第一列向上挪了一个单元格

    glm233
  • 工厂实战,刀路加工和拆铜公的方法与注意事项!

    在刀路加工和拆电极的过程中,我们经常会遇到诸多的问题,容易出现很多的低级错误!今天给大家分享一下刀路加工和拆铜公的方法与注意事项!

    UG数控编程
  • 幼师虐童,用人工智能灭了她!

    这应该是第二篇,站在技术的角度,解决社会问题的文章。 第一篇,查阅:如何技术地识别双十一的“骗”局 这次围绕的是人工智能,我们探索下解决方案: 1 背景 幼儿...

    mixlab
  • “西湖论剑”开幕倒计时4天|嘉宾演讲剧透之第二季

    可信身份管理是智慧城市建设中的基础。本议题将阐述智慧城市对可信身份管理的强烈需求,国家对可信身份管理的重要战略部署,已经如何在智慧城市建设中做好可信身份管理工作...

    安恒信息
  • 电商---实现购物车功能

    优点:不占用服务器资源,可以永远保存,不用考虑失效的问题 缺点: 对购买商品的数量是有限制的,存放数据的大小 不可以超过2k,用户如果禁用cookie那...

    周小董

扫码关注云+社区

领取腾讯云代金券