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

2024-05-05 09:36
文章标签 模块 设计 10g mac 系列 tx

本文主要是介绍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)beginif(i_rst)ro_xgmii_txd <= {{8{8'h07}}};elseif(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;endcaseelse 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        elsero_xgmii_txd <= {r_fifo_data_out_ff4[55:0],r_fifo_data_out_ff3[63:56]};
end
//
always@(posedge i_clk,posedge i_rst)beginif(i_rst)ro_xgmii_txc <= 8'hff;elseif( 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]};//     endcaseelse 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;endcaseelse 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        elsero_xgmii_txc <= 8'b0000_0000;
end

三、仿真图

这篇关于10G MAC层设计系列-(4)MAC TX模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961386

相关文章

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i