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

news2024/12/23 23:30:07

一、模块功能

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'dtype
    input  [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'dID
    output [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)begin
    if(i_rst)begin
        rs_axis_mac_data     <= 'd0;
        rs_axis_mac_user     <= 'd0;
        rs_axis_mac_keep     <= 'd0;
        rs_axis_mac_last     <= 'd0;
        rs_axis_mac_valid    <= 'd0;    
    end
    else begin
        rs_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 
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_last_keep <= 'd0;
    else
        if(s_axis_mac_last)
            r_last_keep <= s_axis_mac_keep;
        else 
            r_last_keep <= r_last_keep;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_cnt <= 'd0; 
    else
        if(s_axis_mac_valid)
            r_cnt <= r_cnt + 1;
        else if(rm_axis_out_last)
            r_cnt <= 'd0;
        else
            r_cnt <= r_cnt ;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_len <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 0)
            r_len <= s_axis_mac_data[47:32] - 20;
        else
            r_len <= r_len;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_ID <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 0)
            r_ID <= s_axis_mac_data[31:16];
        else
            r_ID <= r_ID;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_slip <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 0)
            r_slip <= ~s_axis_mac_data[14];
        else
            r_slip <= r_slip;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_MF <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 0)
            r_MF <= s_axis_mac_data[13];
        else
            r_MF <= r_MF;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_offset <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 0)
            r_offset <= s_axis_mac_data[12:0];
        else
            r_offset <= r_offset;        
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_type <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 1)
            r_type <= s_axis_mac_data[47:40];
        else
            r_type <= r_type;
end
  
always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_source_ip <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 1)
            r_source_ip <= s_axis_mac_data[31:0];
        else
            r_source_ip <= r_source_ip;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_dest_ip <= 'd0;
    else
        if(s_axis_mac_valid && r_cnt == 2)
            r_dest_ip <= s_axis_mac_data[63:32];
        else
            r_dest_ip <= r_dest_ip;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        ri_set_source_ip <= P_SOURCE_IP;
    else
        if(i_set_source_valid)
            ri_set_source_ip <= i_set_source_ip;
        else
            ri_set_source_ip <= ri_set_source_ip;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        r_ip_check <= 'd0;
    else
        if(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)begin
    if(i_rst)
       rm_axis_out_data <= 'd0;
    else
       rm_axis_out_data <= {rs_axis_mac_data[31:0],s_axis_mac_data[63:32]}; 
end 

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        rm_axis_out_keep <= 'd0;
    else
        if(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;
            endcase
        else 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; 
            endcase
        else
            rm_axis_out_keep <= 8'b1111_1111;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        rm_axis_out_valid <= 'd0;
    else
        if(r_cnt == 2)
            rm_axis_out_valid <= 1'b1; 
        else if(rm_axis_out_last)
            rm_axis_out_valid <= 1'b0; 
        else
            rm_axis_out_valid <= rm_axis_out_valid;
end

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        rm_axis_out_last <= 'd0;
    else
        if((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;
        else
            rm_axis_out_last <= 1'b0;

end
always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        rm_axis_out_user <= 'd0;
    else
        rm_axis_out_user <= {r_MF,r_len,r_slip,r_type,r_offset,r_ID};
end

endmodule

三、仿真图如下

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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

港股大反攻结束了吗?

‘港股长线见顶了吗&#xff1f;今天开盘就是最高点&#xff0c;然后一路跳水&#xff0c;市场又是一片恐慌。到底是健康的技术性回调&#xff0c;还是市场已经见顶&#xff1f; 港股此轮“大反攻”中&#xff0c;科网股表现十分亮眼。今日港股盘后&#xff0c;阿里巴巴、腾讯…

联软安渡 UniNXG 安全数据交换系统 任意文件读取漏洞复现

0x01 产品简介 联软安渡UniNXG安全数据交换系统,是联软科技自研的业内融合网闸、网盘和DLP的一体机产品,它同时支持多网交换,查杀毒、审计审批、敏感内容识别等功能,是解决用户网络隔离、网间及网内数据传输、交换、共享/分享、存储的理想安全设备,具有开创性意义。 UniN…

【Android踩坑】 Constant expression required

gradle 8&#xff0c;报错 Constant expression required&#xff1a;意思是case语句后面要跟常量 解决1 单击switch语句&#xff0c;键盘按下altenter&#xff0c;将switch-case语句替换为if-else语句(或者手动修改) 解决2 在gradle.properties中添加 android.nonFinalRes…

Java(四)---方法的使用

文章目录 前言1.方法的概念和使用2.方法的定义3.实参和形参的关系4.方法重载4.1.改进4.2.注意事项 5.递归5.1 生活中的故事5.2 递归的概念 5.3.练习 前言 前面一章我们学习到了程序逻辑语句&#xff0c;在写代码的过程中&#xff0c;我们会遇到需要重复使用的代码块&#xff0…

使用 Python 进行图像验证码识别训练及调用

目录 1、验证码识别原理1.1 Tensorflow 介绍1.2 Tensorflow 运行原理1.3 卷积神经网络 CNN&#xff08;Convolutional Neural Networks&#xff09; 2、验证码识别实现步骤2.1 安装第三方模块2.1.1 安装 TensorFlow 模块2.2.2 安装 cuda2.2.3 下载 cudnn 2.2 读取验证码样本形成…

智慧公厕的核心技术详解:物联网、云计算、大数据、自动化控制

公共厕所是城市的重要组成部分&#xff0c;而智慧公厕的建设和管理正成为城市发展的重要方向。智慧公厕的核心技术即是物联网、云计算、大数据和自动化控制。下面将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例项目现场实景实图实例&#xff0c;详细介…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用&#xff0c;也经常忘记&#xff0c;特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

Redis的集群模式——Java全栈知识(20)

1、主从模式 Redis 支持主从模式的集群搭建&#xff0c;这是 Redis 提供的最简单的集群模式搭建方案&#xff0c;目的是解决单点服务器宕机的问题。当单点服务器发生故障的时候保证 Redis 正常运行。 主从模式主要是将集群中的 Redis 节点分为主节点和从节点。然后读和写发生在…

C++初阶学习第六弹——string(1)——标准库中的string类

前言&#xff1a; 在前面&#xff0c;我们学习了C的类与对象&#xff0c;认识到了C与C语言的一些不同&#xff0c;今天&#xff0c;我们将进入C的 关键部分——STL&#xff0c;学习完这部分之后&#xff0c;我们就可以清楚的认识到C相比于C语言的快捷与便利 目录 一、为什么有s…

springboot房屋租赁系统

摘要 房屋租赁系统&#xff1b;为用户提供了一个房屋租赁系统平台&#xff0c;方便管理员查看及维护&#xff0c;并且可以通过需求进行设备信息内容的编辑及维护等&#xff1b;对于用户而言&#xff0c;可以随时进行查看房屋信息和合同信息&#xff0c;并且可以进行报修、评价…

面试集中营—rocketmq架构篇

一、基本定义 Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力&#xff0c;同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。 Topic&#xff1a;消息主题&…

基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..............................................................I0 imresize…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令)&#xff0c;只读数据 (static int x)&#xff0c;读写堆栈 (int y)&#xff0c;读写运行时分配的内存 (???)&#xff0c;读写动态链接库 (???) 非法的地址 NULL&#xff0c;导致 se…

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二 1.概述 这篇文章在触摸屏上绘制一个开关&#xff0c;通过点击开关实现控制灯的开关功能。 2.硬件 硬件连接参考第一篇文章介绍 Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之获取触控坐标一 3.实现…

使用Caché管理工具

Cach通过一个web工具来对其进行系统管理和完成管理任务,该方法的一个好处是不必将Cach安装到用于管理的系统上。目前,通过网络远程管理和控制对站点的访问,这些都比较容易。因为数据及其格式信息都直接来自被管理的系统,因此,这也可以最小化跨版本的兼容问题。 本文将描述…

【知识碎片】2024_05_14

本篇记录了两道关于位运算的选择题&#xff0c;和一道有点思维的代码题。 C语言碎片知识 求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09; int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算} return c…

Java医院绩效核算系统与his对接所需数据有哪些?java+springboot+MySQL医院绩效管理系统-构建智慧医疗生态

Java医院绩效核算系统与his对接所需数据有哪些&#xff1f;javaspringbootMySQL医院绩效管理系统-构建智慧医疗生态 医院绩效核算系统与his对接所需数据 1、诊察工作量绩效&#xff1a;信息系统-财务权限-统计报表-报表浏览-财务常用报表-门诊医生工作量报表 2、判读及操作工…

微信小程序 - - - - - 使用TDesign库(微信小程序UI库)

使用TDesign库 1. 初始化依赖2. 安装TDesgin3. npm构建3. 修改 app.json 1. 初始化依赖 npm init -y2. 安装TDesgin yarn add tdesign-miniprogram -S --productionor npm install tdesign-miniprogram -S --production3. npm构建 3. 修改 app.json 将 app.json 中的 “styl…

CTF如何学习?

CTF如何学习&#xff1f;打CTF有什么用 CTF本身有几个常见的领域 MISC WEB [逆向 密码学](https://www.zhihu.com/search?q逆向 密码学&search_sourceEntity&hybrid_search_sourceEntity&hybrid_search_extra{“sourceType”%3A"answer"%2C"sourc…

ubuntu 22.04 安装 RTX 4090 显卡驱动 GPU Driver(PyTorch准备)

文章目录 1. 参考文章2. 检查GPU是Nvidia3. 卸载已有驱动3.1. 命令删除3.2. 老驱动包 4. 官网下载驱动5. 运行5.1. 远程安装关闭交互界面5.2. 运行5.3. 打开交互界面 6. 检测与后续安装 1. 参考文章 https://blog.csdn.net/JineD/article/details/129432308 2. 检查GPU是Nvid…