从零开始 verilog 以太网交换机(一)架构分析

从零开始 verilog 以太网交换机(一)架构分析


🔈声明:
😃博主主页:王_嘻嘻的CSDN主页
🔑未经作者允许,禁止转载
🚩本专题部分内容参考于乔庐峰教授的《Verilog HDL数字系统设计与验证——以太网交换机案例分析》,侵权必删

  当下很多IC设计的求职者可能苦于找不到合适的项目,或者是希望有一个区别于培训班的独特项目,所以博主从今天开始会根据一些资料,完成一个以太网交换机的手把手教学,并将所有工程代码开源。

  关注本专题的朋友们可以收获一个经典交换机设计的全流程,包括设计与验证(FPGA);以太网MAC层(Media Access Control,媒体介入控制层)的基础知识。新手朋友们还将获得一个具有竞争力的项目经历



一、ethernet switch作用

  在开始工程前,先讨论以下为什么要有以太网交换机。
  简单来说,当越来越多的设备接入网络后,子网下的点对点的通信需要某一设备来集中处理数据的转发。以太网交换机就是为了完成这一任务,当然随着时代发展,其内部对网络包的处理变得更为多样,但本工程仅仅完成最基本的交换机功能。


有关更多同一子网下数据的传输过程可以关注IB协议专题


二、ethernet switch架构

  首先我们需要明确,ethernet switch作用在ISO模型的传输层,物理层通常由外置的PHY完成,在更高级的交换机中,上层的网络层、链路层也可以进一步融入设计中

  ethernet switch的整体架构如下图,主要由mac_r/mac_t(MAC收发控制器)frame_mux(帧合并单元)frame_process(帧处理单元)MAC Lut(MAC地址查找表)queue manager(队列管理器) 组成,最后实现的交换机可以支持4 Port的数据输入输出。

基本功能如下:

  • mac_r 负责接受PHY上传的MAC帧,并检测是否出现CRC Error、帧长度错误、非字节对齐错误;
  • frame mux将4 Port的数据帧进行合路;
  • frame process需要根据数据帧进行Mac Address查找,地址逆向学习并维护MAC Address和输出Port的映射表;
  • MAC Lut 是基于hash算法的MAC Address和输出Port的映射表;
  • queue manager负责;
  • mac_t 功能和mac_r对称,负责将处理完的数据帧按PHY所要求的格式发送,包括添加帧起始符,CRC校验码等;

请添加图片描述


  具体功能细节将在每个子模块设计中进行详细介绍与分析。
  本专题的后续章节将对MAC控制器、帧合并,处理单元、Mac地址LUT以及队列管理四部分进行设计与实现。




  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现一个简单的交换机,可以采用以下步骤: 1. 设计交换机的流水线结构,例如采用三级流水线:接收数据包、查找目的地址、转发数据包。 2. 实现交换机的输入输出端口,包括以太网端口和控制端口。 3. 设计交换机的查找表,用于存储MAC地址和对应的端口信息,可以采用SRAM或者CAM实现。 4. 实现交换机的流水线逻辑,包括接收数据包、查找目的地址、转发数据包等。 5. 测试交换机的性能和正确性,可以通过模拟数据包的发送和接收来进行测试。 以下是一个简单的Verilog代码示例,实现了一个具有4个以太网端口和1个控制端口的交换机: ``` module switch( input clk, input rst, input [47:0] in_data, // 输入数据包 input [3:0] in_port, // 输入端口 output reg [47:0] out_data, // 输出数据包 output reg [3:0] out_port, // 输出端口 input [47:0] mac_table [0:255], // MAC地址表 input [7:0] mac_port [0:255], // MAC地址对应的端口表 input [7:0] ctrl, // 控制端口 output reg [7:0] status // 状态输出 ); // 定义状态机状态 parameter IDLE = 0; parameter RECEIVE = 1; parameter FORWARD = 2; // 定义状态机变量 reg [1:0] state; reg [47:0] dest_mac; reg [3:0] dest_port; // 接收数据包 always @(posedge clk) begin if (rst) begin state <= IDLE; dest_mac <= 48'h000000000000; dest_port <= 4'h0; out_port <= 4'h0; out_data <= 48'h000000000000; status <= 8'h00; end else begin case(state) IDLE: begin if (in_port == ctrl) begin state <= RECEIVE; end end RECEIVE: begin dest_mac <= in_data[47:0]; state <= FORWARD; end FORWARD: begin if (mac_table[dest_mac[23:16]][47:0] == dest_mac) begin dest_port <= mac_port[dest_mac[23:16]][3:0]; end out_port <= dest_port; out_data <= in_data; status <= dest_port; state <= IDLE; end endcase end end endmodule ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值