米联客udp_stack以太网协议栈使用教程

这篇具有很好参考价值的文章主要介绍了米联客udp_stack以太网协议栈使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验室有一块米联客出的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就没法正常工作。
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络

1.2 接口描述

下图中是udp_stack.dcp的接口定义
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络

米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络
在这些接口的连接中,除了app_tx_XXX博主是引出来自己写控制逻辑外,其余的都参照tx_speed教程中的连接方式了。

1.3 逻辑控制

下图是米联客给的时序图,所以主要任务即为控制app层的app_tx_XXX信号,让协议栈为我们打工!实现千兆以太网通信。
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络
说到这儿,有人就要问了:“合着逻辑控制都是用嘴吹的,没法白嫖是吧?”
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络
这就奉上自己写的代码,里面用了三段式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) begin
   if(!locked) 
         delay_cnt <= 10'd0;
   else begin
		 if(delay_cnt == 10'd100)
			delay_cnt <= delay_cnt;
		 else
		    delay_cnt <= delay_cnt + 1'b1;
   end
end

//The first stage of the state machine
always@(posedge clk_15_625 or negedge rst_n)
begin
    if(!rst_n)
        state <= idle_state;
    else
        state <=  next_state;
end

//The second stage of state machine
always@(negedge clk_15_625 or negedge rst_n)
begin
    if(!rst_n)
        begin
        next_state <= idle_state;
        end
    else
        begin
        case(state)
        
            idle_state:
                begin
                if(udp_tx_ready)
                 next_state <= request_state;
                else
                 next_state <= idle_state;
                end
                
            request_state:
                begin
                    if(app_tx_ack)
                    next_state <= transmit_state;
                    else if(dst_ip_unreachable)
                    next_state <= idle_state;
                    else
                    next_state <= next_state;
                end
            
            transmit_state:
                begin
                if(send_counter < 8)
                next_state <= next_state;
                else
                next_state <= delay_state;
                end
            
            delay_state:
                begin
                //Delay logic
                    next_state <= idle_state;
//                    else
//                    next_state <= delay_state;
                end
        
            default:
            next_state <= idle_state; 
        endcase
        end
end

//The third stage of state machine
always@(posedge clk_15_625 or negedge rst_n)
    begin
        if(!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;
            end
        else
            begin
            case(state)
                idle_state:      
                    begin
                    app_tx_data = 64'h0;
					app_tx_request <= 1'b0;
					app_tx_data_valid <= 1'b0;
                    end
                
                request_state:      
                    begin
                    app_tx_data_valid <= 1'b0;
                    app_tx_request <= 1'b1;
                    end
                
                transmit_state:     
                    begin
                    app_tx_request <= 1'b0;
                    app_tx_data_valid <= 1'b1;
                    app_tx_data <= 64'h1122334455667788; 
                    if(send_counter == 4'd7)
                        begin
                        app_tx_data_keep <= 8'hff;
                         app_tx_data_last <= 1'b1;
                        end
                    else
                        begin
                        app_tx_data_keep <= 8'hff;
                        end
                    send_counter <= send_counter + 1'b1;
                    end
                
                delay_state:
                    begin
                    app_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:          
                    begin
                    app_tx_data <= 64'h0;
                    end
                
            endcase
            end
end

endmodule
白嫖的时候要记得点赞收藏,不然以后找不到回来的路。(阅完即删^V^

2 调试工具

博主在开发过程中使用了两个工具:
1.Vivado自带的Behavior simulation
2.烧写到板子,然后用chipscope/ila观察波形,值得一提的是,在仿真过程中udp_stack.dcp不能参与仿真,必须得要udp_stack.v! 那咋办嘛?难道要劳资花钱买源代码???
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络
不用担心,博主给出了解决方案:
米联客含协议栈.dcp的工程仿真教程
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络

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

3 总结

值得一提的是,米联客推出千兆以太网解决方案,总体来说还是比较好的,但是目前时序约束貌似还没有改进,即使是官方例程也是不满足时序要求的
米联客教程 2022,技术问题交流,笔记,verilog编程,udp,fpga开发,网络
如果有没描述清楚的问题,欢迎大家留言讨论;
//如果帮到你,一定要点赞收藏哦!//

参考资料
[1] 03米联客2020版FPGA课程(UDP以太网通信篇).pdf
[2] 01_udp_rgmii_1g\02_udp_txspeed_rgmii参考工程文章来源地址https://www.toymoban.com/news/detail-598219.html

到了这里,关于米联客udp_stack以太网协议栈使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络协议格式 | 以太网帧、ARP数据报、IP数据报、UDP数据报、TCP数据报

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 传输层及其以下的机制由内

    2024年01月16日
    浏览(64)
  • 以太网UDP数据回环实验

            前面说到TCP/IP是一个协议簇,其中包含有IP协议、TCP协议、UDP协议、ARP协议、DNS协议、FTP协议等。设备之间要想完成通信,就必须通过这些网络通信协议。          物理层的主要作用就是传输比特流(将1、0转化为电流强弱来进行传输,到达目的地后在转化为1、

    2024年01月23日
    浏览(50)
  • FPGA - 以太网UDP通信(一)

    ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一

    2024年04月18日
    浏览(54)
  • 基于光口的以太网 udp 回环实验

    本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」 ;不要急着评判文

    2024年01月19日
    浏览(46)
  • 以太网Checksum-UDP手算教学

    tcp/ip的checksum计算步骤及方法请见如下链接: 以太网Checksum-TCP/IP手算拆解教学-CSDN博客 1、UDP数据结构如图 在计算UDP首部校验和时,计算范围包括了伪首部、UDP首部、UDP数据报,其中各个部分数据容量如下: 伪首部—---------12字节=48字符 其中 源IP地址---------4字节=16字符 目的

    2024年04月28日
    浏览(31)
  • FPGA优质开源项目 – UDP万兆光纤以太网通信

    本文开源一个FPGA项目:UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似,只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口,以及数据传输方案展开介

    2024年02月10日
    浏览(57)
  • FPGA实现千兆/百兆自适应以太网UDP传输

    笔者最近在项目中需要使用到ZYNQ中PL端做以太网UDP传输并且需要支持100M/1000M自适应切换。使用的PHY型号为RTL8211。以下分享的主要为利用已有的1000M协议栈修改为100M并且实现二者自适应切换,IP核主要实现以下功能 1、实现100M/1000M自适应 2、回环测试 PS:完整的IP核文件下载地

    2024年01月21日
    浏览(54)
  • FPGA优质开源项目 - UDP RGMII千兆以太网

    本文介绍一个FPGA开源项目:UDP RGMII千兆以太网通信。该项目在我之前的工作中主要是用于FPGA和电脑端之间进行图像数据传输。本文简要介绍一下该项目的千兆以太网通信方案、以太网IP核的使用以及Vivado工程源代码结构。 Vivado 的 Tri Mode Ethernet MAC IP核需要付费才能使用,因

    2024年02月14日
    浏览(77)
  • 数据链路层协议 ——— 以太网协议

    IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP为其提供可靠性保证,比如数据丢包后TCP可以让IP重新发送数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机。 TCP除

    2024年02月01日
    浏览(65)
  • 以太网协议学习笔记

    以太网接口电路主要由MAC(Media Access Control)控制器和物理层接口PHY两大部分构成。 PHY在发送数据时,接收MAC发过来的数据,把并行的数据转化为串行流数据,按照物理层的编码规则把数据编码转化为模拟信号发送出去,接收数据时的流程反之。 MAC和PHY芯片有一个配置接口,

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包