10G MAC层设计系列-(4)MAC TX模块

一、前言

MAC TX模块就是要将IP层传输过来的数据封装前导码、MAC地址、帧类型以及进行CRC校验,并与CRC值一块组成以太网帧。

二、模块设计

首先对输入的数据进行缓存,原因是在之后要进行封装MAC帧头,所以需要控制数据流的流动

FIFO_DATA_64X256 U_FIFO_DATA_64X256 (
  .clk      (i_clk              ), 
  .srst     (i_rst              ), 
  .din      (rs_axis_data       ), 
  .wr_en    (rs_axis_valid      ), 
  .rd_en    (r_fifo_data_rden   ), 
  .dout     (w_fifo_data_out    ), 
  .full     (w_fifo_data_full   ), 
  .empty    (w_fifo_data_empty  )  
);

FIFO_LEN_16X32 u_FIFO_LEN_16X32 (
  .clk      (i_clk                  ),
  .srst     (i_rst                  ),
  .din      (rs_axis_user[79:64]    ),
  .wr_en    (rs_axis_last           ),
  .rd_en    (r_fifo_len_rden        ), 
  .dout     (w_fifo_len_out         ), 
  .full     (w_fifo_len_full        ), 
  .empty    (w_fifo_len_empty       )  
);

FIFO_LEN_16X32 u_FIFO_TYPE_16X32 (
  .clk      (i_clk                  ),
  .srst     (i_rst                  ),
  .din      (rs_axis_user[15:0]     ),
  .wr_en    (rs_axis_last           ),
  .rd_en    (r_fifo_type_rden       ), 
  .dout     (w_fifo_type_out        ), 
  .full     (w_fifo_type_full       ), 
  .empty    (w_fifo_type_empty      )  
);

FIFO_KEEP_8X32 u_FIFO_KEEP_8X32 (
  .clk      (i_clk                  ), 
  .srst     (i_rst                  ), 
  .din      (rs_axis_keep           ), 
  .wr_en    (rs_axis_last           ), 
  .rd_en    (r_fifo_keep_rden       ),  
  .dout     (w_fifo_keep_out        ),  
  .full     (w_fifo_keep_full       ),  
  .empty    (w_fifo_keep_empty      )  
);

检测到帧长FIFO不为空之后,读取帧长、KEEP信息、TYPE信息,并根据帧长读取数据,在此过程中需要将数据转换成xgmii接口形式,并封装前导码、MAC地址、帧类型、尾部CRC。同时需要在帧起始加入起始符FB、帧结束需要加入结束符FD,在空闲时发送07.同时需要是用控制信号指示控制符。

always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        ro_xgmii_txd <= {{8{8'h07}}};
    else
        if(r_cnt == 0|| r_cnt == 1 || r_cnt == 2)
            ro_xgmii_txd <= {{8{8'h07}}};
        else if(r_cnt == 3)
            ro_xgmii_txd <= 64'hFB_55_55_55_55_55_55_55;
        else if(r_cnt == 4)
            ro_xgmii_txd <= {8'hd5,ri_set_target_mac,ri_set_source_mac[47:40]};
        else if(r_cnt == 5)
            ro_xgmii_txd <= {ri_set_source_mac[39:0],w_fifo_type_out,r_fifo_data_out_ff1[63:56]};
        // else if(r_cnt == 2)
        //     ro_xgmii_txd <= {w_fifo_type_out[7:0],w_fifo_data_out[63:8]};
        else if(r_cnt == w_fifo_len_out + 5)
            case(w_fifo_keep_out)
                8'b1111_1111:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:0],r_crc_result[31:24]};
                8'b1111_1110:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:8],r_crc_result[31:16]};
                8'b1111_1100:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:16],r_crc_result[31:8]};
                8'b1111_1000:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:24],r_crc_result[31:0]};
                8'b1111_0000:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:32],r_crc_result[31:0],8'hFD};
                8'b1110_0000:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:40],r_crc_result[31:0],8'hFD,{{8'h07}}};
                8'b1100_0000:ro_xgmii_txd <= {r_fifo_data_out_ff4[55:48],r_crc_result[31:0],8'hFD,{2{8'h07}}};
                8'b1000_0000:ro_xgmii_txd <= {r_crc_result[31:0],8'hFD,{3{8'h07}}};
                default     :ro_xgmii_txd <= 'd0;
            endcase
        else if(r_cnt == w_fifo_len_out + 6)
            case(w_fifo_keep_out)
                8'b1111_1111:ro_xgmii_txd <= {r_crc_result[23:0],8'hFD,{4{8'h07}}};
                8'b1111_1110:ro_xgmii_txd <= {r_crc_result[15:0],8'hFD,{5{8'h07}}};
                8'b1111_1100:ro_xgmii_txd <= {r_crc_result[7:0],8'hFD,{6{8'h07}}};
                8'b1111_1000:ro_xgmii_txd <= {8'hFD,{7{8'h07}}};
                // 8'b1111_0000:ro_xgmii_txd <= {8'hFD,{7{8'h07}}};
                // 8'b1110_0000:ro_xgmii_txd <= {8'hFD,{7{8'h07}}};
                // 8'b1100_0000:ro_xgmii_txd <= {r_fifo_data_out_ff3[55:48],r_crc_result,8'hFD,{2{8'h07}}};
                // 8'b1000_0000:ro_xgmii_txd <= {r_crc_result,8'hFD,{3{8'h07}}};
                default     :ro_xgmii_txd <= {{8{8'h07}}};
            endcase
        // else if(r_cnt == w_fifo_len_out + 5)
        //     case(w_fifo_keep_out)
        //         8'b1111_1111:ro_xgmii_txd <= {r_crc_result[7:0],8'hFD,{6{8'h07}}};
        //         8'b1111_1110:ro_xgmii_txd <= {r_crc_result[15:0],8'hFD,{5{8'h07}}};
        //         8'b1111_1100:ro_xgmii_txd <= {r_crc_result[7:0],8'hFD,{6{8'h07}}};
        //         8'b1111_1000:ro_xgmii_txd <= {8'hFD,{7{8'h07}}};
        //         default     :ro_xgmii_txd <= {8{8'h07}};
        //     endcase        
        else
            ro_xgmii_txd <= {r_fifo_data_out_ff4[55:0],r_fifo_data_out_ff3[63:56]};
end
//
always@(posedge i_clk,posedge i_rst)begin
    if(i_rst)
        ro_xgmii_txc <= 8'hff;
    else
        if( r_cnt == 0 || r_cnt == 1 || r_cnt == 2)
            ro_xgmii_txc <= 8'b1111_1111;
        else if(r_cnt == 3)
            ro_xgmii_txc <= 8'b1000_0000;
        // else if(r_cnt == 2)
        //     ro_xgmii_txd <= {w_fifo_type_out[7:0],w_fifo_data_out[63:8]};
        // else if(r_cnt == w_fifo_len_out + 2)
        //     case(w_fifo_keep_out)
        //         8'b1111_1111:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1111_1110:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1111_1100:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1111_1000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1111_0000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1110_0000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1100_0000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         8'b1000_0000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //         default     :ro_xgmii_txd <= {r_fifo_data_out_ff2[55:0],r_fifo_data_out_ff1[63:56]};
        //     endcase
        else if(r_cnt == w_fifo_len_out + 5)
            case(w_fifo_keep_out)
                // 8'b1111_1111:ro_xgmii_txc <= {r_fifo_data_out_ff2[55:0],r_crc_result[31:24]};
                // 8'b1111_1110:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:8],r_crc_result[31:16]};
                // 8'b1111_1100:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:16],r_crc_result[31:8]};
                // 8'b1111_1000:ro_xgmii_txd <= {r_fifo_data_out_ff2[55:24],r_crc_result[31:0]};
                8'b1111_0000:ro_xgmii_txc <= 8'b0000_0001;
                8'b1110_0000:ro_xgmii_txc <= 8'b0000_0011;
                8'b1100_0000:ro_xgmii_txc <= 8'b0000_0111;
                8'b1000_0000:ro_xgmii_txc <= 8'b0000_1111;
                default     :ro_xgmii_txc <= 'd0;
            endcase
        else if(r_cnt == w_fifo_len_out + 6)
            case(w_fifo_keep_out)
                8'b1111_1111:ro_xgmii_txc <= 8'b0001_1111;
                8'b1111_1110:ro_xgmii_txc <= 8'b0011_1111;
                8'b1111_1100:ro_xgmii_txc <= 8'b0111_1111;
                8'b1111_1000:ro_xgmii_txc <= 8'b1111_1111;
                default     :ro_xgmii_txc <= 8'b1111_1111;
            endcase        
        else
            ro_xgmii_txc <= 8'b0000_0000;
end

三、仿真图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码&#xff0c;构建镜…

茶树(山茶属)CCoAOMT基因家族的全基因组鉴定、表达分析和蛋白质相互作用分析-全基因组家族分析-文献精读13

Genome-wide identification, expression profiling, and protein interaction analysis of the CCoAOMT gene family in the tea plant (Camellia sinensis) 茶树&#xff08;山茶属&#xff09;CCoAOMT基因家族的全基因组鉴定、表达分析和蛋白质相互作用分析&#xff0c;一篇…

详解SDRAM基本原理以及FPGA实现读写控制(一)

文章目录 一、SDRAM简介二、SDRAM存取结构以及原理2.1 BANK以及存储单元结构2.2 功能框图2.3 SDRAM速度等级以及容量计算 三、SDRAM操作命令3.1 禁止命令&#xff1a; 4b1xxx3.2 空操作命令&#xff1a;4b01113.3 激活命令&#xff1a;4b00113.4 读命令&#xff1a;4b01013.5 写…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5; 程序员&#xff1a;职场关键角色通识宝…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

大语言模型教程与实践(开源)

1.简介 大语言模型&#xff08;Large Language Models, LLMs&#xff09;的兴起确实始于OpenAI在2018年发布的GPT&#xff08;Generative Pre-trained Transformer&#xff09;&#xff0c;这一开创性工作引领了自然语言处理领域的新纪元。随后&#xff0c;2022年底ChatGPT的横…

基于Spring Boot的在线BLOG网设计与实现

基于Spring Boot的在线BLOG网设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页管理界面&#xff0c;用户经过登录前台首页查看通…

SQL Server 存储过程中的字符串本身包含单引号的用法

文章目录 引言I 存储过程中的字符串本身包含单引号的用法1.1 问题1.2解决方法引言 使用场景: 字符串类型字段的值比较 I 存储过程中的字符串本身包含单引号的用法 在SQL Server中,单引号用于表示字符串常量。如果你的存储过程中的字符串本身包含单引号,你需要用两个连续的…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

【C++】文件

目录 文件文件分类文本文件的读写(ASCII文件)的读写打开文件打开文件的方式关闭文件将数据写入ASCII文件从ASCII文件读入数据 二进制存储对比ASCII和二进制存储用成员函数read和write读写二进制文件打开方式文件的读入与读出 文件 所谓文件&#xff0c;一般指存储在外部介质上…

【k8s】利用Kubeadm搭建k8s1.29.x版本+containerd

文章目录 前言1.准备的三台虚拟机2.安装 kubeadm 前的准备工作3.安装containerd1.解压安装包2.生成默认配置文件3.使用systemd托管containerd4.修改默认配置文件 4.安装runc5.安装 CNI plugins6.安装 kubeadm、kubelet 和 kubectl6.1 配置crictl 7.初始化集群1.打印初始化配置到…

DETR类型检测网络---思考和Tricks测试

目录 batch_size的影响辅助损失的作用学习率的影响Decoder层数增多的影响3D检测中, feats位置编码和query位置编码是否共享mpl层背景-关于query的生成方式 利用widthformer类似的方式简化注意力机制 batch_size的影响 batch8: batch20: 由实验结果可知:这里实验有问题,横坐标…

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

文章目录 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41)&#xff0c;framework修改&#xff0c;去除第三方app的倒计时页面1.打印异常堆栈2.去除第三方app的倒计时页面3.模拟点击事件跳过首页进入主页 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41)&#x…

C语言 | Leetcode C语言题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; void reserve(char* s) {int len strlen(s);for (int i 0; i < len / 2; i) {char t s[i];s[i] s[len - i - 1], s[len - i - 1] t;} }char* addBinary(char* a, char* b) {reserve(a);reserve(b);int len_a strlen(a), len_b st…

2024全域数字化转型评估模型研究报告

来源&#xff1a;伏羲智库&腾讯智慧零售 智慧零售逐渐成为发展趋势 随着技术突破、商业创新和监管制度的发展演进,零售业数字化转型的内涵随实践延展而不断丰富,智慧零售逐渐成为零售业数字化转型的新趋势。 在技术层面,零售业数字化转型呈现出三大变化与趋势: 一是数字技…

能将图片转为WebP格式的WebP Server Go

本文完成于 2023 年 11 月 之前老苏介绍过 webp2jpg-online&#xff0c;可以将 webp 格式的图片&#xff0c;转为 jpg 等&#xff0c;今天介绍的 WebP Server Go 是将 jpg 等转为 webp 格式 文章传送门&#xff1a;多功能图片转换器webp2jpg-online 什么是 WebP ? WebP 它是由…

多多搜索在哪里找到

拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商家破零、积累基础销量的重要…

OpenHarmony实战开发-使用通用事件、焦点事件

基本概念 焦点 指向当前应用界面上唯一的一个可交互元素&#xff0c;当用户使用键盘、电视遥控器、车机摇杆/旋钮等非指向性输入设备与应用程序进行间接交互时&#xff0c;基于焦点的导航和交互是重要的输入手段。 默认焦点 应用打开或切换页面后&#xff0c;若当前页上存在…

缤纷成长:儿童换牙顺序解析与注意事项

引言&#xff1a; 儿童的换牙过程是成长中的一个重要阶段&#xff0c;但每个孩子的换牙顺序可能会有所不同。本文将详细解析儿童换牙的顺序&#xff0c;并提供换牙期间的注意事项&#xff0c;助您更好地理解孩子的口腔健康&#xff0c;并为他们提供正确的护理与关爱。 1. 换牙顺…
最新文章