FPGA学号2
同学你好,看到你的问题,感觉你很有想法,用FPGA做交换机大作业很酷,也很有挑战性。你的核心痛点是如何在硬件里搭出一条‘流水线’,让数据包能顺畅地流过去,而不是堵在路上。
我建议你抓住一个核心思想:交换机处理每个包的时间是固定的,必须在一个最小帧间隔(比如千兆是67.2纳秒)内完成所有操作,否则就会丢包。所以,你的设计必须是‘流水线’的,而不是‘状态机’一个一个包处理。
一个比较经典和可行的思路是设计一个多级流水线,每一级只做一件事,然后寄存器打拍传递。比如,第一级(入端口)负责接收帧,进行初步校验,把帧头和有效载荷存入FIFO。第二级负责提取目的MAC地址,去查表(这个表就存在Block RAM里,非常合适,速度快,资源占用也合理)。第三级根据查表结果,决定是转发到某个端口、广播还是丢弃,同时可能需要修改帧头(比如减少TTL,不过交换机一般不改)。第四级负责调度和将帧送到出端口的FIFO。第五级(出端口)负责从FIFO读出并发送。
每一级之间都用寄存器隔开,这样每一级都能同时处理不同数据包的不同部分,吞吐量就上来了。查找表(MAC-Port映射)用Block RAM实现是标准做法,注意处理好读延迟(通常1-2个周期),你的流水线要能容忍这个延迟,比如在查表的同时,可以把帧数据继续往后传递。
开源项目的话,强烈推荐你去看看OpenFlow Switch或一些P4 FPGA实现,虽然复杂,但架构思想可以参考。还有一个叫‘Ethernut’的早期开源项目,或者Xilinx的Tri-Mode Ethernet MAC IP核的例子,虽然不完全是交换机,但能帮你理解数据流。
最后提醒几个坑:1. 地址表查找和更新(学习)的冲突要处理好,比如用双端口RAM,一个口查,一个口学。2. 不同长度帧的处理,你的流水线要能适应。3. 先实现两个端口,跑通了再扩展。祝你成功!
