万兆以太网MAC设计(5)MAC_TX模块设计以及上板带宽测试

文章目录

  • 前言
  • 一、模块功能
  • 二、实现方式
  • 三、仿真
  • 四、上板测速

前言

MAC_RX的设计暂时告一段落,本节将开始进行MAC_TX的设计。

一、模块功能

  1. 接收上层用户的AXIS数据,将其转换为XGMII进接口的数据发送给IP核。
  2. 可接受AXIS数据流,可支持数据包之间的间隔最小为一个时钟周期
  3. 目的MAC以及源MAC等参数可动态配置
  4. 流控,万兆以太网帧间隔为9.6ns,用户时钟频率为156.25Mhz,周期为6.4ns,因此XGMII接口数据之前至少间隔2个时钟周期

模块接口如下:

module TEN_GIG_MAC_TX#(parameter       P_SRC_MAC = 48'h00_00_00_00_00_00,parameter       P_DST_MAC = 48'h00_00_00_00_00_00
)(input           i_clk               ,input           i_rst               ,input  [47:0]   i_dynamic_src_mac   ,input           i_dynamic_src_valid ,input  [47:0]   i_dynamic_dst_mac   ,input           i_dynamic_dst_valid ,input  [63:0]   s_axis_tdata        ,input  [79:0]   s_axis_tuser        ,input  [7 :0]   s_axis_tkeep        ,input           s_axis_tlast        ,input           s_axis_tvalid       ,output          s_axis_tready       ,output [63:0]   o_xgmii_txd         ,output [7 :0]   o_xgmii_txc         
);

二、实现方式

  1. 将接收到的AXIS数据先存入FIFO,将包头组织完毕后从FIFO当中读取数据进行填充
  2. 组帧同时要进行CRC计算并且在末尾填充,需要注意,在尾端填充CRC数据时,根据尾端keep信号有多种情况,会存在数据额外需要一个时钟周期进行传输CRC数据。

包含子模块如下:

FIFO_64X256 FIFO_64X256_data_tx (.clk          (i_clk              ),.srst         (i_rst              ),  .din          (rs_axis_tdata      ),.wr_en        (rs_axis_tvalid     ),.rd_en        (r_fifo_data_rden   ),.dout         (w_fifo_data_dout   ),.full         (w_fifo_data_full   ),.empty        (w_fifo_data_empty  ) 
);FIFO_32X32 FIFO_32X32_len_type (.clk          (i_clk                  ), .srst         (i_rst              ),      .din          ({rs_axis_tuser[79:64],rs_axis_tuser[15:0]}),     .wr_en        (rs_axis_tlast          ),  .rd_en        (r_fifo_len_type_rden   ),  .dout         (w_fifo_len_type_dout   ),  .full         (w_fifo_len_type_full   ),  .empty        (w_fifo_len_type_empty  )  
);FIFO_8X32 FIFO_8X32_tail_keep (.clk          (i_clk              ),  .srst         (i_rst              ),    .din          (rs_axis_tkeep      ),  .wr_en        (rs_axis_tlast      ),  .rd_en        (r_fifo_keep_rden   ),  .dout         (w_fifo_keep_dout   ),  .full         (w_fifo_keep_full   ),  .empty        (w_fifo_keep_empty  ) 
);CRC32_64bKEEP CRC32_64bKEEP_u0(.i_clk        (i_clk              ),.i_rst        (i_rst              ),.i_en         (r_crc_en           ),.i_data       (r_crc_data[63:56]  ),.i_data_1     (r_crc_data[55:48]  ),.i_data_2     (r_crc_data[47:40]  ),.i_data_3     (r_crc_data[39:32]  ),.i_data_4     (r_crc_data[31:24]  ),.i_data_5     (r_crc_data[23:16]  ),.i_data_6     (r_crc_data[15: 8]  ),.i_data_7     (r_crc_data[7 : 0]  ),.o_crc_8      (w_crc_8_big        ),.o_crc_1      (w_crc_1_big        ),.o_crc_2      (w_crc_2_big        ),.o_crc_3      (w_crc_3_big        ),.o_crc_4      (w_crc_4_big        ),.o_crc_5      (w_crc_5_big        ),.o_crc_6      (w_crc_6_big        ),.o_crc_7      (w_crc_7_big        ) 
);

产生XGMII接口的核心代码如下:

//r_xgmii_txc还需要考虑最后多加4byte的CRC
always @(posedge i_clk or posedge i_rst)beginif(i_rst)r_xgmii_txc <= 8'b1111_1111;else if(r_fifo_len_type_rden)r_xgmii_txc <= 8'b1000_0000;else if(r_pkt_cnt == r_data_len + 3 && r_tail_keep >= 8'b1111_1000)case (r_tail_keep)8'b1111_1111    : r_xgmii_txc <= 8'b0001_1111;8'b1111_1110    : r_xgmii_txc <= 8'b0011_1111;8'b1111_1100    : r_xgmii_txc <= 8'b0111_1111;8'b1111_1000    : r_xgmii_txc <= 8'b1111_1111;default         : r_xgmii_txc <= 8'b0000_0000;endcaseelse if(r_pkt_cnt == r_data_len + 2 && r_tail_keep < 8'b1111_1000)case (r_tail_keep)      8'b1111_0000    : r_xgmii_txc <= 8'b0000_0001;8'b1110_0000    : r_xgmii_txc <= 8'b0000_0011;8'b1100_0000    : r_xgmii_txc <= 8'b0000_0111;8'b1000_0000    : r_xgmii_txc <= 8'b0000_1111;default         : r_xgmii_txc <= 8'b0000_0000;endcaseelse if(r_send_data)r_xgmii_txc <= 8'b0000_0000;elser_xgmii_txc <= 8'b1111_1111;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)r_send_data <= 'd0;else if(r_pkt_cnt == r_data_len + 3 && r_tail_keep >= 8'b1111_1000)r_send_data <= 'd0;else if(r_pkt_cnt == r_data_len + 2 && r_tail_keep < 8'b1111_1000)r_send_data <= 'd0;else if(r_fifo_len_type_rden)r_send_data <= 'd1;elser_send_data <= r_send_data;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)ro_xgmii_txd <= {8{P_FRAME_IDLE}};else if(r_pkt_cnt_3d == r_data_len + 2)case (r_tail_keep_1d)8'b1111_1111    : ro_xgmii_txd <= {r_xgmii_txd_2d[63: 8],r_crc_result[31:24]};8'b1111_1110    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:16],r_crc_result[31:16]};8'b1111_1100    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:24],r_crc_result[31: 8]};8'b1111_1000    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:32],r_crc_result[31: 0]};8'b1111_0000    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:40],r_crc_result[31: 0],P_FRAME_END};8'b1110_0000    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:48],r_crc_result[31: 0],P_FRAME_END,P_FRAME_IDLE};8'b1100_0000    : ro_xgmii_txd <= {r_xgmii_txd_2d[63:56],r_crc_result[31: 0],P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE};8'b1000_0000    : ro_xgmii_txd <= {r_crc_result[31: 0],P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE};default         : ro_xgmii_txd <= {8{P_FRAME_IDLE}};endcase else if(r_pkt_cnt_3d == r_data_len + 3 && r_tail_keep >= 8'b1111_1000)case (r_tail_keep_1d)      8'b1111_1111    : ro_xgmii_txd <= {r_crc_result[23:0],P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE};  8'b1111_1110    : ro_xgmii_txd <= {r_crc_result[15:0],P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE};  8'b1111_1100    : ro_xgmii_txd <= {r_crc_result[7 :0],P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE};  8'b1111_1000    : ro_xgmii_txd <= {P_FRAME_END,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE,P_FRAME_IDLE};default         : ro_xgmii_txd <= {8{P_FRAME_IDLE}};endcase      elsero_xgmii_txd <= r_xgmii_txd_2d;
end

三、仿真

模块AXIS_test_module会产生各种不同尾端keep的数据包,用于测试发送端的各种情况,包长为1488byte,间隔为6个时钟周期(AXIS用户端包间隔为6,则XGMII处数据间隔为2,俩者之间相差4),通过查看主机侧网卡接收带宽检查FPGA侧发送是否符合要求。

always @(posedge i_clk or posedge i_rst) beginif(i_rst)rm_axis_tkeep <= 8'hff;else if(r_send_cnt == P_SEND_LEN - 1 && w_axis_active)rm_axis_tkeep <= 8'hff;else if(r_send_cnt == P_SEND_LEN - 2 && w_axis_active)case (r_pkt_cnt)0   : rm_axis_tkeep <= 8'b1111_1111;1   : rm_axis_tkeep <= 8'b1111_1110;2   : rm_axis_tkeep <= 8'b1111_1100;3   : rm_axis_tkeep <= 8'b1111_1000;4   : rm_axis_tkeep <= 8'b1111_0000;5   : rm_axis_tkeep <= 8'b1110_0000;6   : rm_axis_tkeep <= 8'b1100_0000;7   : rm_axis_tkeep <= 8'b1000_0000;default: rm_axis_tkeep <= 8'b1111_1111;endcaseelserm_axis_tkeep <= 8'hff;
end

在这里插入图片描述

四、上板测速

接收带宽可达9.9G
在这里插入图片描述

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

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

相关文章

Spring Boot集成easypoi快速入门Demo

1.什么是easypoi&#xff1f; Easypoi功能如同名字easy&#xff0c;主打的功能就是容易&#xff0c;让一个没见接触过poi的人员就可以方便的写出Excel导出&#xff0c;Excel模板导出&#xff0c;Excel导入&#xff0c;Word模板导出&#xff0c;通过简单的注解和模板语言(熟悉的…

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架&#xff08;ArkUI&#xff09;、分布式组网和 FA 跨设备迁移能力等新特性&#xff0c;因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后&#xff0c;用户须根据提示完成相应操作&am…

Adobe AE(After Effects)2015下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

RK3568 学习笔记 : u-boot 千兆网络功能验证

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 使用 虚拟机 ubuntu 20.04 编译 RK3568 Linux SDK&#xff0c;生成镜像&#xff0c;烧写后&#xff0c;Linux 系统正常启动 开启后可以使用 CTRLC 进入 u-boot 本篇验证一下 u-boot 下网络功能 【正点原子】 rk…

分类算法——模型选择与调优(三)

交叉验证 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成4份&#xff0c;其中 一份作为验证集。然后经过4次&#xff08;组&#xff09;的测试&#xff0c;每次都更换不同的验证集。即得到4组模型的 结果&#xff0c;取…

iOS依赖库版本一致性检测:确保应用兼容性

一、背景 在 iOS 应用开发的世界里&#xff0c;每次 Xcode 更新都带来了新的特性和挑战。最近的 Xcode 15 更新不例外&#xff0c;这次升级引入了对 SwiftUI 的自动强依赖。SwiftUI最低是从 iOS 13 开始支持。 这一变化也带来了潜在的兼容性问题。如果您的项目在升级到 Xcode…

Rust 编写的数据框架:多线程、矢量化查询引擎 | 开源日报 No.226

pola-rs/polars Stars: 25.2k License: MIT polars 是使用 Rust 编写的多线程、支持矢量化查询引擎的数据框架。 基于 Apache Arrow 列式内存模型惰性和急切执行多线程处理SIMD 加速计算查询优化功能强大的表达式 API支持混合流式处理&#xff08;适用于大于内存大小的数据集…

盲盒小程序成为收益“法宝”?盲盒线上如何发展

近年来&#xff0c;盲盒在年轻人中掀起了一股潮玩热风&#xff0c;受到了不少年轻人的青睐&#xff0c;盲盒商品更是在不断创新中&#xff0c;收藏价值逐渐提高。随着市场规模的扩大&#xff0c;越来越多的玩家和商家涌入到了市场中&#xff0c;盲盒的商业模式正在加快发展中。…

AppBuilder升级!工作流编排正式上线!AssistantsAPI开放邀测!

>>【v0.5.3版本】 上线时间&#xff1a;2024/4/14 关键发版信息&#xff1a; 低代码态&#xff1a;新增工作流&#xff0c;低代码制作组件 自定义组件&#xff1a;支持用户自定义创建组件&#xff0c;并被Agent自动编排调用
 工作流框架&#xff1a;组件支持流式编排…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好&#xff0c;有幸与屏幕前你们相识&#xff0c;博主现已经搬砖9年&#xff0c;趁着头发还充裕&#xff0c;希望给大家提供一些编程领域的帮助&#xff0c;深知计算机毕业生这个阶段的崩溃与闹心&#xff0c;让我们共同交流进步。 博主给大家列举了项目合集&#…

pdf做批注编辑工具 最新pdf reader pro3.3.1.0激活版

PDF Reader Pro是一款功能强大的PDF阅读和编辑工具。它提供了多种工具和功能&#xff0c;帮助用户对PDF文档进行浏览、注释、编辑、转换和签名等操作。以下是PDF Reader Pro的一些主要特色&#xff1a; 最新pdf reader pro3.3.1.0激活版下载 多种查看模式&#xff1a;PDF Reade…

Qt 4 QPushButton

Qt 常用控件 QPushButton 实例 Push Button:命令按钮。 入口文件 main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }头文件 mainwindow.h …