10G UDP协议栈 IP层设计-(5)IP RX模块

一、模块功能

1、解析目的IP是否是本节点的源IP,如果是则进行如下的处理,如果不是则无需上上级传递

2、提取MAC层发送过来的IP报文,并提取其中的数据字段(上层协议字段),传递给上级

3、提取IP报文头中的关键字段,例如数据长度、标识、是否分片、分片偏移等,组合成user数据传递给上级

注:本模块暂时没有做头部校验

二、模块代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/05/14 10:11:58
// Design Name: 
// Module Name: IP_RX
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module IP_RX#(parameter       P_SOURCE_IP = {8'd192,8'd168,8'd100,8'd100}
)(input           i_clk               ,input           i_rst               ,input  [31:0]   i_set_source_ip     ,input           i_set_source_valid  ,input  [63:0]   s_axis_mac_data     ,input  [79:0]   s_axis_mac_user     ,//16'dlen,48'dsource_mac,16'dtypeinput  [7 :0]   s_axis_mac_keep     ,input           s_axis_mac_last     ,input           s_axis_mac_valid    ,output [63:0]   m_axis_out_data     ,output [54:0]   m_axis_out_user     ,//16'dlen,1'bsplit,8'dtype,13'doffset,16'dIDoutput [7 :0]   m_axis_out_keep     ,output          m_axis_out_last     ,output          m_axis_out_valid    
);reg [63:0]          rm_axis_out_data    ;
reg [54:0]          rm_axis_out_user    ;
reg [7 :0]          rm_axis_out_keep    ;
reg                 rm_axis_out_last    ;
reg                 rm_axis_out_valid   ;reg [63:0]          rs_axis_mac_data    ;
reg [79:0]          rs_axis_mac_user    ;
reg [7 :0]          rs_axis_mac_keep    ;
reg                 rs_axis_mac_last    ;
reg                 rs_axis_mac_valid   ;reg [31:0]          ri_set_source_ip    ;
reg                 ri_set_source_valid ;reg  [15:0]         r_len               ;
reg  [15:0]         r_ID                ;
reg                 r_slip              ;
reg                 r_MF                ;
reg  [12:0]         r_offset            ;
reg  [7 :0]         r_type              ;
reg  [31:0]         r_source_ip         ;
reg  [31:0]         r_dest_ip           ;
reg  [15:0]         r_cnt               ;
reg                 r_ip_check          ;
reg  [7 :0]         r_last_keep         ;assign  m_axis_out_data   = rm_axis_out_data  ;
assign  m_axis_out_user   = rm_axis_out_user  ;
assign  m_axis_out_keep   = rm_axis_out_keep  ;
assign  m_axis_out_last   = rm_axis_out_last  ;
assign  m_axis_out_valid  = rm_axis_out_valid ;always@(posedge i_clk,posedge i_rst)beginif(i_rst)beginrs_axis_mac_data     <= 'd0;rs_axis_mac_user     <= 'd0;rs_axis_mac_keep     <= 'd0;rs_axis_mac_last     <= 'd0;rs_axis_mac_valid    <= 'd0;    endelse beginrs_axis_mac_data     <= s_axis_mac_data  ;rs_axis_mac_user     <= s_axis_mac_user  ;rs_axis_mac_keep     <= s_axis_mac_keep  ;rs_axis_mac_last     <= s_axis_mac_last  ;rs_axis_mac_valid    <= s_axis_mac_valid ;end 
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_last_keep <= 'd0;elseif(s_axis_mac_last)r_last_keep <= s_axis_mac_keep;else r_last_keep <= r_last_keep;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_cnt <= 'd0; elseif(s_axis_mac_valid)r_cnt <= r_cnt + 1;else if(rm_axis_out_last)r_cnt <= 'd0;elser_cnt <= r_cnt ;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_len <= 'd0;elseif(s_axis_mac_valid && r_cnt == 0)r_len <= s_axis_mac_data[47:32] - 20;elser_len <= r_len;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_ID <= 'd0;elseif(s_axis_mac_valid && r_cnt == 0)r_ID <= s_axis_mac_data[31:16];elser_ID <= r_ID;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_slip <= 'd0;elseif(s_axis_mac_valid && r_cnt == 0)r_slip <= ~s_axis_mac_data[14];elser_slip <= r_slip;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_MF <= 'd0;elseif(s_axis_mac_valid && r_cnt == 0)r_MF <= s_axis_mac_data[13];elser_MF <= r_MF;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_offset <= 'd0;elseif(s_axis_mac_valid && r_cnt == 0)r_offset <= s_axis_mac_data[12:0];elser_offset <= r_offset;        
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_type <= 'd0;elseif(s_axis_mac_valid && r_cnt == 1)r_type <= s_axis_mac_data[47:40];elser_type <= r_type;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_source_ip <= 'd0;elseif(s_axis_mac_valid && r_cnt == 1)r_source_ip <= s_axis_mac_data[31:0];elser_source_ip <= r_source_ip;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_dest_ip <= 'd0;elseif(s_axis_mac_valid && r_cnt == 2)r_dest_ip <= s_axis_mac_data[63:32];elser_dest_ip <= r_dest_ip;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)ri_set_source_ip <= P_SOURCE_IP;elseif(i_set_source_valid)ri_set_source_ip <= i_set_source_ip;elseri_set_source_ip <= ri_set_source_ip;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_ip_check <= 'd0;elseif(s_axis_mac_valid && r_cnt == 2 && (s_axis_mac_data[63:32] == r_source_ip))r_ip_check <= 1'b1;else if(s_axis_mac_valid && r_cnt == 2 && (s_axis_mac_data[63:32] != r_source_ip))r_ip_check <= 1'b0;else r_ip_check <= r_ip_check;
end//解析数据
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_out_data <= 'd0;elserm_axis_out_data <= {rs_axis_mac_data[31:0],s_axis_mac_data[63:32]}; 
end always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_out_keep <= 'd0;elseif(rs_axis_mac_last && r_last_keep >= 8'b1111_1000)case(r_last_keep)8'b1111_1111: rm_axis_out_keep <= 8'b1111_0000;8'b1111_1110: rm_axis_out_keep <= 8'b1110_0000;8'b1111_1100: rm_axis_out_keep <= 8'b1100_0000;8'b1111_1000: rm_axis_out_keep <= 8'b1000_0000;default     : rm_axis_out_keep <= 8'b0000_0000;endcaseelse if(s_axis_mac_last && s_axis_mac_keep <= 8'b1111_0000)case(s_axis_mac_keep)8'b1111_0000: rm_axis_out_keep <= 8'b1111_1111;8'b1110_0000: rm_axis_out_keep <= 8'b1111_1110;8'b1100_0000: rm_axis_out_keep <= 8'b1111_1100;8'b1000_0000: rm_axis_out_keep <= 8'b1111_1000;default     : rm_axis_out_keep <= 8'b1111_1111; endcaseelserm_axis_out_keep <= 8'b1111_1111;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_out_valid <= 'd0;elseif(r_cnt == 2)rm_axis_out_valid <= 1'b1; else if(rm_axis_out_last)rm_axis_out_valid <= 1'b0; elserm_axis_out_valid <= rm_axis_out_valid;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_out_last <= 'd0;elseif((s_axis_mac_keep <= 8'b1111_0000) && s_axis_mac_last)rm_axis_out_last <= 1'b1;else if((r_last_keep > 8'b1111_0000) && rs_axis_mac_last)rm_axis_out_last <= 1'b1;elserm_axis_out_last <= 1'b0;end
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_out_user <= 'd0;elserm_axis_out_user <= {r_MF,r_len,r_slip,r_type,r_offset,r_ID};
endendmodule

三、仿真图如下

数据包的目的IP地址要等与本节点的源IP地址,IP地址校验通过

解析IP报文头中的关键字段,并将IP报文中的数据解出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702079.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个基于Qt的Ymodem的上位机(GitHub开源)

文章目录 1.项目地址2.Ymodem 协议介绍3.文件传输过程4.使用5.SecureCRT 软件也支持Ymodem6.基于PyQt5的Ymodem界面实现案例 1.项目地址 https://github.com/XinLiGH/SerialPortYmodem 基于VS2019 Qt5.15.2 编译&#xff0c;Linux下编译也可以&#xff0c;这里不做说明。 2.…

Redis-持久化操作-AOF

持久化操作-AOF AOF是什么&#xff1f; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只允许加文 件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换言之…

day15 个人博客项目登录验证CookieSession验证码安全

知识点 1.后台验证-登录用户逻辑安全 2.后台验证-cookie和session 3.后台验证-验证码和万能密码 通常的后台验证登录都是&#xff0c;1.发送登录请求&#xff0c;账户密码&#xff1b;2.接受账号密码3.对账号密码进行判断 正确 -》跳转到成功登录界面 失败-》重新登录 而…

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

多元化、高辨识显示丨基于G32A1445的汽车尾灯解决方案

由刹车灯、倒车灯、转向灯、雾灯等组成的汽车尾灯&#xff0c;既能在光线低暗时发出照明信息&#xff0c;也可向周围环境传递车辆的行驶状态与意图信号&#xff0c;对于行车安全起着至关重要的作用。与传统尾灯相比&#xff0c;贯穿式汽车尾灯更加醒目、美观、安全&#xff0c;…

奥维地图下载高清影像的两种方式!以及ArcGIS、QGIS、GlobalMapper、自编工具下载高清影像的方法推荐!

今天来介绍一下奥维互动地图是如何下载高清影像的&#xff0c;也不是多了不起的功能&#xff01;有朋友问&#xff0c;加上这个软件确实用的人多。 下载的高清数据在ArcGIS中打开的效果&#xff01; 开始介绍奥维之前我们也介绍一下我们之前介绍的几个方法&#xff0c;没有优劣…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中&#xff0c;有几位关键人物为它们的诞生和推广做出了重要贡献。 首先&#xff0c;肯汤姆森&#xff08;Ken Thompson&#xff09;是一位在AT&T公司工作的员工&#xff0c;他不仅发明了B语言&#xff0c;还创造了Unix系统。…

3.3 整型

本节必须掌握的知识点&#xff1a; 整型数据类型的取值范围 示例八 代码分析 汇编解析 获取数据类型的取值范围 3.3.1 整型数据类型取值范围 整型是用来表示限定范围内连续整数的数据类型。表3-1列出了C语言编译器定义的整型数据类型及其大小和取值范围。 类型 存储大小…

解决springboot+vue静态资源刷新后无法访问的问题

一、背景 原项目是有前后端分离设计&#xff0c;测试环境是centos系统&#xff0c;采用nginx代理和转发&#xff0c;项目正常运行。 项目近期上线到正式环境&#xff0c;结果更换了系统环境&#xff0c;需要放到一台windows系统中&#xff0c;前后端打成一个jar包&#xff0c;…

从需求到实现:能源软件服务商如何量身定制企业解决方案

能源行业需要数字化转型的原因主要有以下几点&#xff1a;首先&#xff0c;数字化技术可以提高生产效率和安全性&#xff0c;通过实时监控和智能调度降低事故风险&#xff0c;并实现远程控制和自动化生产。其次&#xff0c;数字化转型有助于推动能源行业的创新发展&#xff0c;…

Transformers实战01-开箱即用的 pipelines

文章目录 简介安装pipelines图片转文本文本生成情感分析零训练样本分类遮盖词填充命名实体识别自动问答自动摘要 pipeline 背后做了什么&#xff1f;使用分词器进行预处理将预处理好的输入送入模型对模型输出进行后处理 简介 Transformers 是由 Hugging Face 开发的一个 NLP 包…

根据Word文档用剪映批量自动生成视频发布抖音

手头有大量word文档&#xff0c;想通过剪映的AI图文成片功能批量生成视频&#xff0c;发布到抖音平台&#xff0c;简单3步即可&#xff1a; 第一步&#xff1a;把word文档或者PDF等文档转成txt文本&#xff0c;可以用一些软件&#xff0c;也可以用AI工具&#xff0c;具体常见文…