首页 > 编程语言 >[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程序设计

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程序设计

时间:2024-08-09 18:54:44浏览次数:13  
标签:begin 06 ip UDP 安路 cnt end udp

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

 

3.5 UDP层

该层实现用户数据和UDP报文的互转,相比于其它层次的设计,该层的逻辑相对简单。

3.5.1 UDP接收模块

通过计数器将UDP报文头部信息拆解,提取出端口号和长度信息。通过提取的长度对有效数据进行计数,从而得到有效数据并发送给用户端。

always@(posedge I_R_udp_clk or posedge I_reset) begin

    if(I_reset) begin

        cnt                 <=  4'd0;

        O_R_udp_valid       <=  1'b0;

        O_R_udp_data        <=  8'd0;

        O_R_udp_len         <=  16'd0;

        udp_src_port        <=  16'd0;

        udp_dest_port       <=  16'd0;

        udp_pkg_len         <=  16'd0;

        udp_data_cnt        <=  16'd0;

    end

    else if(I_udp_ip_rvalid) begin

        udp_data_cnt    <=  udp_data_cnt + 1'b1;

        case(cnt)

            0   :begin  udp_src_port[15:8]  <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP接收源端口(远程主机端口)

            1   :begin  udp_src_port[7:0]   <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP接收源端口(远程主机端口)

            2   :begin  udp_dest_port[15:8] <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP接收目的端口(本地主机端口)

            3   :begin  udp_dest_port[7:0]  <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP接收目的端口(本地主机端口)

            4   :begin  udp_pkg_len[15:8]   <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP数据包长度

            5   :begin  udp_pkg_len[7:0]    <=  I_udp_ip_rdata; cnt <=  cnt + 1'b1;end  //UDP数据包长度

            6   :begin  cnt <=  cnt + 1'b1;end                                          //跳过检验和

            7   :begin  cnt <=  cnt + 1'b1;end                                          //跳过校验和

            8   :begin

                O_R_udp_valid       <=  1'b1;                                           //UDP接收数据有效

                O_R_udp_data        <=  I_udp_ip_rdata;

                O_R_udp_len         <=  udp_pkg_len - 16'd8;

                cnt                 <=  cnt + 1'b1;

            end

            9   :begin

                if(udp_pkg_len < 16'd26) begin

                    if(udp_data_cnt == udp_pkg_len) begin

                        O_R_udp_valid       <=  1'b0;

                        O_R_udp_data        <=  8'd0;

                        cnt                 <=  cnt + 1'b1;

                    end    

                    else begin

                        O_R_udp_valid       <=  1'b1;

                        O_R_udp_data        <=  I_udp_ip_rdata;

                        cnt                 <=  cnt;                    

                    end        

                end

                else begin

                    O_R_udp_valid       <=  1'b1;

                    O_R_udp_data        <=  I_udp_ip_rdata;

                    cnt                 <=  cnt;

                end

            end

            10  :begin

                O_R_udp_valid       <=  1'b0;

                O_R_udp_data        <=  8'd0;

                cnt                 <=  cnt;

            end

            default:    cnt <=  4'd0;

        endcase

    end

    else if(!I_udp_ip_rvalid) begin

        udp_pkg_len         <=  16'd0;

        udp_src_port        <=  16'd0;

        udp_dest_port       <=  16'd0;

        udp_data_cnt        <=  16'd0;

        O_R_udp_len         <=  16'd0;

        O_R_udp_data        <=  8'd0;

        O_R_udp_valid       <=  1'b0;

        cnt                 <=  4'd0;

    end

end

3.5.2 UDP发送模块

状态机转换图如下:

IDLE:当用户端发送写请求,且uiip_tx模块不忙时,进入WAIT_ACK状态。

WAIT_ACK:等待uiip_tx模块将udp_ip_tbusy信号拉高,完成握手,进入SEND_UDP_HEADER状态,开始发送UDP报文头部。

SEND_UDP_HEADER:将8个字节的UDP报文头部添加在有效数据之前,头部数据发送完成后,进入SEND_UDP_PACKET状态。

SEND_UDP_PACKET:将经过shift_ram移位8位的数据拼接在包头之后,通过计数器判断发送数据的数量,待数据发送完成后,回到IDLE状态,等待下一次发送请求。

 always@(posedge I_W_udp_clk or posedge I_reset) begin

    if(I_reset) begin

        cnt                 <=  4'd0;

        O_udp_ip_tvalid     <=  1'b0;

        O_udp_ip_tdata      <=  8'd0;

        O_udp_ip_tpkg_len   <=  16'd0;

        trans_data_cnt      <=  16'd0;

        STATE               <=  IDLE;

    end

    else begin

        case(STATE)

            IDLE:begin

                if(I_W_udp_req & (~I_udp_ip_tbusy)) //当有写UDP请求,并且ip_tx模块不忙(当I_udp_ip_tbusy=1代表正在ip层正在传输数据)

                    STATE   <=  WAIT_ACK;           //进入WAIT_ACK

                else

                    STATE   <=  IDLE;

            end

            WAIT_ACK:begin

                if(I_udp_ip_tbusy)                  //如果ip_tx模块准备好,代表udp_layer可以发送数据

                    STATE   <=  SEND_UDP_HEADER;

                else

                    STATE   <=  WAIT_ACK;

            end

            SEND_UDP_HEADER:begin

                case(cnt)

                    0   :begin

                        if(I_W_udp_valid) begin

                            O_udp_ip_tvalid     <=  1'b1;                   //udp包数据有效

                            O_udp_ip_tdata      <=  I_udp_local_port[15:8]; //UDP报文源端口              

                            O_udp_ip_tpkg_len   <=  I_W_udp_len + 16'h0008; //UDP报文长度,其中8bytes为udp首部      

           

                            cnt                 <=  cnt + 1'b1;

                        end

                        else

                            cnt                 <=  0;

                    end

                    1   :begin

                        O_udp_ip_tdata          <=  I_udp_local_port[7:0];  //UDP报文源端口

                        cnt                     <=  cnt + 1'b1;

                    end

                    2   :begin

                        O_udp_ip_tdata          <=  I_udp_dest_port[15:8];  //UDP报文目的端口

                        cnt                     <=  cnt + 1'b1;

                    end

                    3   :begin

                        O_udp_ip_tdata          <=  I_udp_dest_port[7:0];   //UDP报文目的端口

                        cnt                     <=  cnt + 1'b1;

                    end

                    4   :begin

                        O_udp_ip_tdata          <=  O_udp_ip_tpkg_len[15:8];//UDP报文长度

                        cnt                     <=  cnt + 1'b1;

                    end

                    5   :begin

                        O_udp_ip_tdata          <=  O_udp_ip_tpkg_len[7:0]; //UDP报文长度

                        cnt                     <=  cnt + 1'b1;

                    end

                    6   :begin

                        O_udp_ip_tdata          <=  CHECKSUM[7:0];          //校验和

                        cnt                     <=  cnt + 1'b1;

                    end

                    7   :begin

                        O_udp_ip_tdata          <=  CHECKSUM [7:0];         //校验和

                        cnt                     <=  0;

                        STATE                   <=  SEND_UDP_PACKET;

                    end

                    default: cnt    <=  0;

                endcase

            end

            SEND_UDP_PACKET:begin

                if(trans_data_cnt != (O_udp_ip_tpkg_len - 16'd8)) begin

                    O_udp_ip_tvalid     <=  1'b1;

                    O_udp_ip_tdata      <=  shift_data_out;

                    trans_data_cnt      <=  trans_data_cnt + 1'b1;

                    STATE               <=  SEND_UDP_PACKET;

                end

                else begin

                    trans_data_cnt      <=  16'd0;

                    O_udp_ip_tdata      <=  8'd0;

                    O_udp_ip_tvalid     <=  1'b0;

                    O_udp_ip_tpkg_len   <=  16'd0;

                    cnt                 <=  0;

                    STATE               <=  IDLE;

                end

            end

            default: STATE          <=  IDLE;

        endcase

    end

 end

标签:begin,06,ip,UDP,安路,cnt,end,udp
From: https://www.cnblogs.com/milianke/p/18351346

相关文章

  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-07 ICMP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.6ICMP层该层在程序中为IP层......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-01 以太网协议介绍
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! ​1概述本文介绍了基于XILIN......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3程序设计前面我们介绍了以太......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.2IP_ARP层由于IP和ARP数据......
  • Java方法06:递归
    A方法调用B方法,我们很容易理解!递归就是:A方法调用A方法!就是自己调用自己,因此我们在设计递归算法时,一定要指明什么时候自己不调用自己。否则,就是个死循环!递归算法重点:递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方......
  • 基于java的可视化高校公寓管理系统(10621)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 基于javaweb的数学竞赛网站的设计与实现(10669)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • hive06_SQL优化
    HiveSQL原理joinjoin分为MapJoin、ReduceJoin两种,其中MapJoin思想是将小表存内存,然后大表分片,与小表完成连接操作。MapJoinMap阶段分为两个操作:将小表数据读入内存,生成分片文件后存储到分布式存储系统中;每个Mapper从分布式存储系统中读取文件分片到内存,然后顺......
  • CF1406C Link Cut Centroids
    思路如果一棵树有两个重心,那么从一个重心的一边切割一个点到另外一个重心即可。如果一棵树只有一个重心,那么随意断掉一个点再恢复即可。代码#include<bits/stdc++.h>usingnamespacestd;constintN=100010;structedge{ intto,next;}e[N*2];inthead[N]......
  • 洛谷P1064 金明的预算方案——题解
    洛谷P1064题解传送锚点摸鱼环节[NOIP2006提高组]金明的预算方案题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过\(n\)元钱就行”。今天......