实验室有一块米联客出的Kintex-7的板子,被我用来做毕业设计,其中使用到了千兆以太网的外设,于是打算使用米联客自己教程中所使用的协议栈来开发千兆以太网通信,接着就接触到了米联客的教程udp_stack.dcp。
//如果帮到你,一定要点赞收藏哦!//

0 使用背景

博主在很多设计部分参考了官方资料的udp_tx_speed工程,包括tri-mode ethernet IP, async/package FIFO的设置都与此同步,在此默认哥老倌们都已经配置好了。

1 协议栈介绍

1.1 结构拓扑

下图为udp_stack.dcp的结构,事实上博主只使用了数据发送回路。本来想把receive_buffer这一部分去掉的,后来发现,这部分用来接收反馈数据/反馈信号的,如果去掉,udp_stack.dcp就没法正常工作。

1.2 接口描述

下图中是udp_stack.dcp的接口定义


在这些接口的连接中,除了app_tx_XXX博主是引出来自己写控制逻辑外,其余的都参照tx_speed教程中的连接方式了。

1.3 逻辑控制

下图是米联客给的时序图,所以主要任务即为控制app层的app_tx_XXX信号,让协议栈为我们打工!实现千兆以太网通信。

说到这儿,有人就要问了:“合着逻辑控制都是用嘴吹的,没法白嫖是吧?”

这就奉上自己写的代码,里面用了三段式Moore状态机来控制,已经过验证,该逻辑控制可行。

module TOP_CTRL(input clk_15_625,input clk_25,input clk_200,input rst_n,input udp_tx_ready,input app_tx_ack,input locked,input dst_ip_unreachable,output phy_rst_o,output reg app_tx_request,output reg app_tx_data_valid,output reg [63:0] app_tx_data,output reg [7:0] app_tx_data_keep,output reg app_tx_data_last,// output reg [15:0] package_length,output reg [3:0] state);
//reg definition
reg [15:0] delay_cnt;
reg [3:0] send_counter = 0;
// reg [3:0] state;
reg [4:0] next_state;
//wire definition//parameter definition
parameter idle_state = 0;
parameter request_state = 1;
parameter transmit_state = 2;
parameter delay_state = 3;
//phy_rst_o output defintion
assign  phy_rst_o = (delay_cnt == 10'd100)? 1'b1 : 1'b0;always @(posedge clk_25) beginif(!locked) delay_cnt <= 10'd0;else beginif(delay_cnt == 10'd100)delay_cnt <= delay_cnt;elsedelay_cnt <= delay_cnt + 1'b1;end
end//The first stage of the state machine
always@(posedge clk_15_625 or negedge rst_n)
beginif(!rst_n)state <= idle_state;elsestate <=  next_state;
end//The second stage of state machine
always@(negedge clk_15_625 or negedge rst_n)
beginif(!rst_n)beginnext_state <= idle_state;endelsebegincase(state)idle_state:beginif(udp_tx_ready)next_state <= request_state;elsenext_state <= idle_state;endrequest_state:beginif(app_tx_ack)next_state <= transmit_state;else if(dst_ip_unreachable)next_state <= idle_state;elsenext_state <= next_state;endtransmit_state:beginif(send_counter < 8)next_state <= next_state;elsenext_state <= delay_state;enddelay_state:begin//Delay logicnext_state <= idle_state;
//                    else
//                    next_state <= delay_state;enddefault:next_state <= idle_state; endcaseend
end//The third stage of state machine
always@(posedge clk_15_625 or negedge rst_n)beginif(!rst_n)begin           app_tx_data_valid <= 1'b0;         app_tx_request  <= 1'b0;            app_tx_data <= 64'd0;app_tx_data_last <= 1'b0;app_tx_data_keep <= 8'hff;send_counter <= 4'd0;// package_length <= 16'd8;endelsebegincase(state)idle_state:      beginapp_tx_data = 64'h0;app_tx_request <= 1'b0;app_tx_data_valid <= 1'b0;endrequest_state:      beginapp_tx_data_valid <= 1'b0;app_tx_request <= 1'b1;endtransmit_state:     beginapp_tx_request <= 1'b0;app_tx_data_valid <= 1'b1;app_tx_data <= 64'h1122334455667788; if(send_counter == 4'd7)beginapp_tx_data_keep <= 8'hff;app_tx_data_last <= 1'b1;endelsebeginapp_tx_data_keep <= 8'hff;endsend_counter <= send_counter + 1'b1;enddelay_state:beginapp_tx_data_valid <= 1'b0;app_tx_data <= 64'h0; app_tx_data_keep <= 8'hff;send_counter <= 4'd0;app_tx_data_last <= 1'b0;end default:          beginapp_tx_data <= 64'h0;endendcaseend
endendmodule
白嫖的时候要记得点赞收藏,不然以后找不到回来的路。(阅完即删^V^)

2 调试工具

博主在开发过程中使用了两个工具:
1.Vivado自带的Behavior simulation
2.烧写到板子,然后用chipscope/ila观察波形,值得一提的是,在仿真过程中udp_stack.dcp不能参与仿真,必须得要udp_stack.v! 那咋办嘛?难道要劳资花钱买源代码???

不用担心,博主给出了解决方案:
米联客含协议栈.dcp的工程仿真教程

注意:
0# 实际implementation 的时候又需要删除udp_stack.v
1# 起初调试过程中,发现udp_stack的发送回路和接受回路都可以通,但是无论如何udp_tx_ack也不能拉高,我勒个去,排查了几天,最后把自己写的三段式状态机替换了才知道原来问题出在时钟源,我的状态机控制那里是整个工程的,包括了千兆网口和其余的一些模块,因而使用的是默认的200MHz时钟源clk_200,但实际上udp_stack中控制关键引脚时应该使用的时钟时clk_15_625。

3 总结

值得一提的是,米联客推出千兆以太网解决方案,总体来说还是比较好的,但是目前时序约束貌似还没有改进,即使是官方例程也是不满足时序要求的

如果有没描述清楚的问题,欢迎大家留言讨论;
//如果帮到你,一定要点赞收藏哦!//

参考资料
[1] 03米联客2020版FPGA课程(UDP以太网通信篇).pdf
[2] 01_udp_rgmii_1g\02_udp_txspeed_rgmii参考工程

米联客udp_stack以太网协议栈使用教程相关推荐

  1. 米联客ZYNQ——Linux系统移植教程之脚本文件解读

    最近学习了米联客zynq-Linux系统移植教程,做下学习记录. 米联客学习论坛:https://www.osrc.cn 1.setting.sh文件  功能描述:配置开发所需要的环境变量  主要包括 ...

  2. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH05 PS 千兆 UDP 加速

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  3. 米联客含协议栈.dcp的工程仿真

    米联客FPGA工程无法仿真解决方法(针对.dcp文件) 使用新买的米联客K7开发板跑以太网通信的时候,使用的是米联客自己写的.dcp协议栈,然后仿真中是不能够直接调用的,本博客记录了解决方案,如果帮到 ...

  4. 基于米联客MA703FA开发板的MicroBlaze LWIP千兆以太网例程

    Xilinx FPGA MicroBlaze使用AXI 1G/2.5G Ethernet Subsystem(= Tri Mode Ethernet MAC + AXI Ethernet Buffer ...

  5. 米联客 ZYNQ/SOC精品教程 S01-CH05 FPGA程序的固化和下载

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  6. 米联客 ZYNQ/SOC精品教程 S02-CH13 CAN总线通信实验

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  7. 米联客 ZYNQ/SOC 精品教程 S02-CH29 基于TCP的QSPI Flash bin文件网络烧写

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  8. fast角点检测 java_米联客 ZYNQ/SOC 精品教程 S04-CH11 快速角点检测之硬件实现

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  9. 米联客 ZYNQ/SOC精品教程 S01-CH04 VIVADO创建工程之流水灯

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

最新文章

  1. 基于Autoencoder的反欺诈数据集的异常检测
  2. matlab导向滤波磨皮,图像处理(七)导向滤波磨皮
  3. 拿 C# 搞函数式编程
  4. 前端学习(2338):记录解决问题的一次
  5. python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...
  6. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
  7. Java 多态,接口
  8. 运行matlab生成多张图片后如何瞬间将图片全部关闭
  9. 微信小游戏开发(11)-文件系统
  10. 葛道辉,李洪升,张亮,等. 轻量级神经网络架构综述
  11. 用支付宝和微信可以直接跳转拉起支付,API搭建比较方便第三方支付接口首选杉德比较靠谱,
  12. php extraxt,php中关于extract方法的使用和建议
  13. HEVC视频扩展解决方法
  14. 全网唯一正确身份证和社统一社会信用代码自定义表单校验器(身份证校验和社统一社会信用代码校验)
  15. Java重修之路(十)面向对象之多态详解,Object类,内部类,匿名内部类详解
  16. php正则抓取网页指定内容,php正则匹配获取指定url网页页面超级链接地址与抓取指定页面内容方法...
  17. selenium自动化之登录淘宝自动下单案例
  18. python继承和多态心得_python学习第十五天 -面向对象之继承和多态
  19. c开源hash项目 uthash的用法总结
  20. Libfilth(一个滤波器C库)使用

热门文章

  1. 手机贴膜选购及洗涤经验
  2. 一文读懂虚拟机的网络模式
  3. Gaea‘s English Studies notes
  4. 【必看】HTML+CSS去掉img图片底部的空白的3种通用方法
  5. CorelDRAW文字竖排横排,左右切换方法
  6. 虽然隔行如隔山但是还是得改
  7. 正则表达式验证代码(字母、数字、Email、网址、电话号码、汉字、身份证号码) (转载)...
  8. BFS——1072 Nightmare
  9. sql无法打开键: UNKNOWN\Components\8922126C77B064F4683FF04644421772\4BE06D23D119
  10. html实现扫雷小游戏(附源码)