您现在的位置:首页 >> 网络协议 >> 内容

m基于DE2-115开发板的网口UDP数据收发系统FPGA实现

时间:2023/4/18 21:15:39 点击:

  核心提示:12_049_m,包括程序操作录像+说明文档+参考文献...

1.完整项目描述和程序获取

>面包多安全交易平台:https://mbd.pub/o/bread/ZJeclZ5v

>如果链接失效,可以直接打开本站店铺搜索相关店铺:

点击店铺

>如果链接失效,程序调试报错或者项目合作可以加微信或者QQ联系。

2.部分仿真图预览

3.算法概述

       UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1]  是UDP的正式规范。UDP在IP报文的协议号是17。

       UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。

4.部分源码

reg [15:0] myIP_Prtcl;

reg [159:0]myIP_layer;

reg [63:0] myUDP_layer;

reg [31:0] mydata; 

reg [2:0]  byte_counter;

reg [4:0]  state_counter;

reg [95:0] mymac;

reg [15:0] data_counter;

reg [3:0]  rx_state;

wire       e_rxdv;

wire[7:0  ]datain;

reg [159:0]IP_layer; 

reg [63:0] UDP_layer;

reg [15:0] rx_total_length;         //UDP frame的总长度

reg [15:0] rx_data_length;          //接收的UDP数据包的长度

reg [31:0] data_o;                  //UDP接收的数据 

 

 

assign e_rxdv=1'b1;

assign datain={ENET1_RX_DATA,ENET1_RX_DATA};

parameter idle=4'd0,

          six_55=4'd1,

spd_d5=4'd2,

rx_mac=4'd3,

rx_IP_Protocol=4'd4,

       rx_IP_layer=4'd5,

rx_UDP_layer=4'd6,

rx_data=4'd7,

rx_finish=4'd8;

 

initial

begin

rx_state<=idle;

end

 

//UDP数据接收程序

always@(posedge clk_50)

begin

data_o<={24'd0,datain};

case(rx_state)

  idle: begin

  byte_counter<=3'd0;

  data_counter<=10'd0;

  mydata<=32'd0;

  state_counter<=5'd0;

  if(e_rxdv==1'b1) begin                           //接收数据有效为高,开始接收数据

  if(datain[7:0]==8'h55) begin                  //接收到第一个55//

  rx_state<=six_55;

  mydata<={mydata[23:0],datain[7:0]};

  end

  else

  rx_state<=idle;

  end

  end

  six_55: begin                                              //接收6个0x55//

if ((datain[7:0]==8'h55)&&(e_rxdv==1'b1)) begin

  if (state_counter==5) begin

state_counter<=0;

rx_state<=spd_d5;

  end

  else

state_counter<=state_counter+1'b1;

end

else

  rx_state<=idle;

  end

  spd_d5: begin                                              //接收1个0xd5//

if((datain[7:0]==8'hd5)&&(e_rxdv==1'b1)) 

  rx_state<=rx_mac;

else 

  rx_state<=idle;

  end

  rx_mac: begin                    //接收目标mac address和源mac address

if(e_rxdv==1'b1) begin

if(state_counter<5'd11) begin

  mymac<={mymac[87:0],datain};

  state_counter<=state_counter+1'b1;

end

else begin

state_counter<=5'd0;

if((mymac[87:72]==16'h000a)&&(mymac[71:56]==16'h3501)&&(mymac[55:40]==16'hfec0))   //判断目标MAC Address是否为本FPGA

rx_state<=rx_IP_Protocol;

else

rx_state<=rx_IP_Protocol;

end

end

else

rx_state<=idle;

  end

  rx_IP_Protocol: begin                                              //接收2个字节的IP TYPE//

  if(e_rxdv==1'b1) begin

if(state_counter<5'd1) begin

myIP_Prtcl<={myIP_Prtcl[7:0],datain[7:0]};

state_counter<=state_counter+1'b1;

end

else begin

state_counter<=5'd0;

rx_state<=rx_IP_layer;

end

end

else 

rx_state<=idle;

end   

rx_IP_layer: begin               //接收20字节的udp虚拟包头,ip address

if(e_rxdv==1'b1) begin

if(state_counter<5'd19) begin

myIP_layer<={myIP_layer[151:0],datain[7:0]};

state_counter<=state_counter+1'b1;

end

else begin

IP_layer<={myIP_layer[151:0],datain[7:0]};

state_counter<=5'd0;

rx_state<=rx_UDP_layer;

end

end

else 

rx_state<=idle;

end

rx_UDP_layer: begin                //接受8字节UDP的端口号及UDP数据包长   

rx_total_length<=IP_layer[143:128];

if(e_rxdv==1'b1) begin

if(state_counter<5'd7) begin

myUDP_layer<={myUDP_layer[55:0],datain[7:0]};

state_counter<=state_counter+1'b1;

end

else begin

UDP_layer<={myUDP_layer[55:0],datain[7:0]};

rx_data_length<= myUDP_layer[23:8];                //UDP数据包的长度

state_counter<=5'd0;

rx_state<=rx_data;

end

end

else 

rx_state<=idle;

end  

rx_data: begin                                             //接收UDP的数据       

if(e_rxdv==1'b1) begin

if (data_counter==rx_data_length-9) begin         //存最后的数据,真正的UDP数据需要减去8字节的UDP包头

data_counter<=0;

rx_state<=rx_finish;  

 

  data_o<={mydata[23:0],datain[7:0]};

  byte_counter<=0;

 

end

else begin

data_counter<=data_counter+1'b1;

if(byte_counter<3'd3) begin

  mydata<={mydata[23:0],datain[7:0]};

  byte_counter<=byte_counter+1'b1; 

end

else begin

  data_o<={mydata[23:0],datain[7:0]};

  byte_counter<=3'd0;   

end

end  

end

else

rx_state<=idle;

end 

rx_finish: begin        

rx_state<=idle;

end

default:rx_state<=idle;    

endcase

end

 

 

alt_25 alt_25_u(enetclk,MDC);

 

assign ENET1_MDC=MDC;

 

assign GTX_CLK=0;

 

 

//产生发送的控制使能信号和地址信息

TXcontrol TXcontrol_u(

                 .TX_CLK(TX_CLK),//网口时钟

  .flag  (flag),//发送接收周期性标志信号

  .addr  (ADDR),//地址

  .TX_EN (TX_EN),//控制网口的EN信号

  .TX_ER (TX_ER)//控制网口的ER信号

                );

 

 

//寄存器中读取数据或者存放数据 

package_wr package_wr_u(

                  .MDC    (MDC),

.flagi  (flag),

.mdio_in(mdio_in),

.wr_rd  (wr_rd),

.mdio   (mdio),

.flag   (flag_),

.RST_N  (RST_N)

                 );

12_049_m

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168