四端口以太网二层交换机的搭建实录

在大三下学期,我学习了“通信芯片设计基础”这门课。说实话,我最感兴趣的还是Verilog实践部分,对于模电学的不好的我,再去学PN结、mos管电路等等知识实在是遭罪。最后老师布置了一个很难的大作业,具体要求见下图:
大作业要求

大作业要求

布置的时候是5月底,同时还有其他几门课的实践要做,又因为这个作业的截止日期是6月18日,在不知道期末考试时间的情况下,暂时搁置没有做。等到6月初所有课程结课,知道6.15-6.20会把所有课考完的时候,才反应过来只能用复习周的时间来做了。一开始准备两个人合作着做,后来发现我们低估了这个东西的难度,而且两个人的进度难以同步。于是我从6月9日晚上开始,给自己两天的时间,全力投入这个实践(因为再耽误就来不及复习了),终于在6月12号的早上成功进行了仿真,得到了想要的结果,晚上写完了实验报告。虽然延迟了一天,但这种成就感是满满的(尤其是得知班上暂时没有别人做出来的时候)。

反正的确花了时间,也确确实实学到了东西。本来打算考试结束以后进一步完善,但是没有精力了。就以这个为开端,开始我的博客记录吧。下面介绍一下我的思路。

设计方案

按照我粗浅的理解,整个项目可以大致分为4个模块:地址学习表模块查表模块数据帧处理模块MAC核通信模块。但这些模块不是完全相互独立的,这是按照功能所进行的大致区分。接下来我会一一介绍这些模块的设计方案。

地址学习表模块

在接触这个作业之前,除了在课堂上听老师说了一下哈希以外,我对地址学习表的认知仅限于在通信网络基础课上学到的知识,了解概念和逻辑但从未想过用某种语言去实现。因此,我最直观的想法就是用二维寄存器数组来实现,一个维度是序号(广度),另一个维度是内容(深度)。我也询问了ChatGPT如何用Verilog实现地址学习表,得到的回应是不仅可以使用二维寄存器数组,还可以“使用别的数据结构如链表、结构体和哈希表”来实现。联想到老师上课讲过的内容,我继续追问哈希表的具体情况,得到的回应是,不能直接实现哈希表,只能使用Verilog语言来模拟哈希表的功能。看完示例后,我坚定了使用二维寄存器数组构建地址学习表的想法。由于我本学期选修的科目是高级程序设计(数据结构),我对链表和结构体也有一定的了解。但经过查阅资料,发现Verilog并不支持链表和结构体,猜想可能是Verilog中没有指针的概念。
于是,我打算进一步学习哈希表。通过询问助教老师,明确了用Verilog语言实现哈希表的结构和逻辑:
图 1 Hash表示意图

图 1 Hash表示意图

实际运用时,需要先初始化所有表的所有项为0。当数据帧传入时,提取其源MAC地址,并记录传入数据帧的端口号。接着对源MAC地址进行Hash值计算。若Hash值对应地址的内容为空,就在两个表内分别写入发送数据帧的端口号和源MAC地址,并在老化时间表内赋予默认的老化时间time_decay。如果不为空,说明已经记录,但还需要更新老化时间,将默认老化时间写入老化时间表中Hash值对应地址,其他两个表内容不变。
对于老化时间,采用一个计数器进行计数,每过一定的时钟周期,所有不为0的表项的值都自减。直到减为0,记录该表项的Hash地址,删除其它两个表中地址相同的表项。
运用Hash算法,不仅起到了索引的作用,还对MAC地址进行了压缩和加密,没有开启MAC核中的CRC校验功能就完成了CRC加密。

查表模块

与写表的逻辑相似,查表也需要先提取数据帧中的目标MAC地址,然后进行Hash运算,以Hash值为地址直接访问三张表中对应的表项。如果内容不为空,就读出端口号,作为目标端口准备发送。如果目标MAC地址是全1序列(广播),就不查表,直接向所有端口发送数据帧。
图 2 查表模块的示例代码

图 2 查表模块的示例代码

数据帧处理模块

这个模块的内容包括从数据帧中提取源MAC地址、目标MAC地址和数据、将提取的地址和数据重新组合成新的数据帧发送等功能。实现的前提是学习以太网帧结构。大致的逻辑是:对于接收到的数据帧,记录其发送端口,并提取其源MAC地址。对于要发送的数据帧,提取其目的MAC地址,采用addr_fanzhuan任务重组数据帧的MAC地址部分。所以,核心是对MAC地址的提取。由于数据帧只有32位宽,但MAC地址有48位宽,因此在处理完数据帧的前置序列后,还需要通过打两拍的方式读取MAC地址。
图 3 上层模块中对于MAC地址提取模块的实例化示例

图 3 上层模块中对于MAC地址提取模块的实例化示例

对于4个端口我都分别采用了一个实例实现MAC地址的提取,提取完成后均会采用addr_rdy1/2/3/4置高位来标记提取完毕的端口。在上层模块中还有一个总的addr_rdy用来判断和示意引入哪一个端口的地址,当输入不使能后,就把原来置为高位的addr_rdy1/2/3/4再置于低位,这样能够确保每次只读入一个端口提取好的地址,从而良好地避免冲突。

MAC核通信模块

对于我个人而言,这是我最头疼的模块,需要面对庞大的开源MAC核代码。即使很明确逻辑,也很难在实例化时确保每一个端口都正确。在这里我想把它和发包函数一起讲一讲,因为涉及到一些以太网帧结构的知识,如果弄清楚将无法正确发包。
先来说说MAC核本身,大致可以分为输入区端口和输出区端口,分别管理着MAC核的输入数据和输出数据。如果要实现独立的收发,就需要在实例化时全部和定义的属于自己的端口连起来。读到这里可能有些疑惑,但可以先看看我的实例化示例:
图 4 TestBench中MAC核实例化示例

图 4 TestBench中MAC核实例化示例

如果要实现4个MAC回环测试模式,就需要把第一个核的输入区和第二个核的输入区连接、把第二个核的输出区和第三个核的输入区连接,以此类推。
图 5 回环测试MAC核实例化示例

图 5 回环测试MAC核实例化示例

可以很清楚的看到,同样是对第二个MAC核实例化,输入区输出区连线的改变直接影响着功能。
此外,为了实现地址学习、查表等功能,还需要把这些端口引入相应的模块中作为输入和输出。
接下来我分析一下用于测试的发包模块ephy。一开始我并没有注意到这个模块,因为它在所给范例的文件夹中藏得很深。后来真正测试时才发现,必须弄清楚这个模块的含义。该模块本身的输入是关于使能和同步的一些寄存器,重点是名为Rxd的端口,该模块主要采用Rxd进行变量的传输和通信。
图 6 ephy模块的输入和输出

图 6 ephy模块的输入和输出

在其内部编写的send_frame任务,传入的参数原本是数据帧总长度和数据data内容,但为了方便测试,我还加入了目标MAC地址以及源MAC地址作为传入参数。
图 7 修改后的send_frame任务

图 7 修改后的send_frame任务

需要注意的是premble_100M任务,它的内容是在Rxd端口输出一些固定的值。通过学习以太网帧结构,我了解到以太网帧最前面的8个字节的作用是同步,也印证了premble_100M是必须执行的。关于pad_100M,就是将目标MAC地址、源MAC地址和数据内容按需通过Rxd进行发送。其实在之前,我并没有接触过Verilog里的task。这次实践大大拓宽了我对Verilog的认识。

仿真验证平台搭建方案

我认为,TestBench文件的编写是不算困难的,只需要把该实例化的模块实例化就可以。关键问题在于发送数据帧的模块配置。在内容以外的另一个关键点就是用脚本进行仿真。
先来说说发送数据帧的模块配置。根据我在上一个部分的分析,该模块的关键是Rxd端口。如果在tb中只进行一次实例化,通过逻辑来实现对所选择MAC核的发送,是远远不如进行4个实例化,再把对应的端口连接起来来的直接和方便的,因为每个MAC核的端口没有数据结构管理,采用逻辑选择的模块反而是浪费资源。
图 8 ephy模块的一个实例化示例

图 8 ephy模块的一个实例化示例

我设置发送四个包,下一个包的目标MAC地址正好是前一个包的源MAC地址,这样能够清晰地看到对应关系。
关于用脚本进行Modelsim仿真,我也是和助教老师沟通学习,按照获得的模板,再自己查阅资料,最终编写出较为完善的运行脚本。我认为关键不在于脚本本身,而是对Modelsim甚至Vivado等软件的理解。我发现,与Modelsim的交互完全可以采用命令行来实现,这也激起了我对软件编写的思考。在编写脚本的过程中我也遇到了一些问题,比如需要获取所有需要编译的文件的地址,我自己编写了一个脚本用来获取其绝对地址(相对地址也可以),并生成一个文本文档来记录。总而言之,我从学习用脚本进行仿真的过程中学到了很多,不仅磨练了自己写代码的能力,而且拓宽了我的知识面,并且加深了我对语言、软件的理解。

仿真结果分析

图 9 地址学习表仿真结果

图 9 地址学习表仿真结果

我设置发送四个包,下一个包的目标MAC地址正好是前一个包的源MAC地址,这样能够清晰地看到对应关系。对于输入端口号,我采取了独热码编码,因此位宽为4。可以看到,成功地读取了每个端口发送数据帧的目的MAC地址和源MAC地址,并通过Hash算法计算出了地址,存入了对应的表。以第一次输入为例,记录输入端口号为4’h1,解析出的源MAC地址为48’h3333,先通过Hash算法算出Hash值为10’h275,再将源MAC地址写入mac_table[275],其值变为48’h3333,同时将输入端口号写入port_table[275],其值变为4’h1。以第一次输出为例,解析出目的MAC地址为48’h3333,先通过Hash算法算出Hash值为10’h275,然后直接查询mac_table[275],其值不为空,于是查询port_table[275],得到输出端口号4’h1。此时output_port_reg的值变为4’h1。
图 10发送和接收端口仿真结果

图 10 发送和接收端口仿真结果

能看到数据按照输出端口被正确发送。如果放大看,还能看到整个数据包的传输过程:在前置序列后,先传输目的MAC地址,再传输源MAC地址,最后是数据内容。

心得体会

这次实验我真的学到了很多,非常感谢帮助我的两位助教学长给予我指导和帮助。我的代码编写能力和对Verilog语言的认识加深了很多。我意识到Verilog语言的局限性,也深刻感受到老师所说的“心中有电路”是什么感觉:开始写代码之前一定要弄清楚模块之间的逻辑。此外我对通信网络以及TCL语言有了更广泛更深入的认识和理解。虽然大作业很困难,我也参考了学长的代码,但是自己修改、编写模块并最终实现功能的过程让我充满了信心和兴趣,希望在以后的学习道路上也可以多一点这样的机会,并且做的越来越好。

写在最后

虽然以后可能不研究FPGA的通信方向,虽然时间很仓促,但是这个作业让我学到了很多。本人处于保研边缘,但是非常愿意深入研究某一方面,快要被拼命卷分数的同学卷死力()我希望像我这样的成绩不是特别优秀但是愿意钻研愿意主动学习新知识的同学能得到更多的机会,具体咋办我也不到捏,现在只能求求我能入围保研名单┭┮﹏┭┮

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

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

相关文章

​AI + 非遗文化传播,人工智能师资培训重磅招募

大语言模型热度空前,诸如文心一言、 ChatGPT 等已经能够与人对话互动、回答问题、协助创作,逐渐应用于人们的工作和生活,也引发了社会热议。为推动大模型及人工智能相关专业人员的培养,同时将人工智能技术融入非遗文化传播&#x…

优质的懒人资源导航工具集合网站

说到「效率工具」,一直是大家关心的热点话题。作者网站的初心就是我自己也很懒,每一次需要什么东西的时候,都是需要话费很大的一个时间去寻找,但是有了这网站会让你方便许多。 今天,我决定重新开始做一个安利 。 这次我…

用好 ChatGPT | Prompt 编写模式:如何将思维框架赋予机器

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 人类相对于其他动物更擅长于类比、概念抽象、符号化等高级认知活动,这些认知活动可以帮助人类在面对新问题时,从已有的知识和经…

申论视频课

小马哥 申论题型 答题纸,一行25个字努力得到小题的百分之80分 一 归纳概括题 10-15分,一般放在第一题一般都是小题拉开差距不超过200字符合体干,来自材料,是否有发挥空间问啥答啥、理解语义、读出层次、富有逻辑找到到底做了啥…

申论 立意列大纲

作者:一片仙鱼儿 链接:https://www.zhihu.com/question/56957544/answer/521207352 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 最重要也最首要工作:立意列大纲 阅卷人会首先看你的文章结构,也就…

python改写文章脚本,chatgpt4.0api接口测试问题总结

大家好,我是淘小白~ 最近gpt4.0要放开了,有很多朋友想用4.0的接口来改写文章,这几天就做了一个脚本出来,在中间有些测试,趁着还有印象,来总结一下! 1、gpt4与gpt3.5比较 4.0的模型输入量更大…

web -【在线聊天】

1.WebSocket: 1.1 什么是WebSocket: WebSocket是HTML5开始提供的一种在单个TCP连接上进行双工通讯的协议。 WebSocket 使得客户端与服务器之间得数据交换变得简单,允许服务器端主动向客户端推送数据。在WebSocket API中,浏览器与服…

合理利用chatGpt之新冠阳性

🏆今日学习目标: 🍀合理利用chatGpt之新冠阳性 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入:…

基于PyQt5实现同一窗口下多界面切换

基于Python和PyQt5实现同一窗口下多界面切换 基于pyqt5控件tabWidget结合按钮点击实现同窗口下固定区域不同界面切换。每个子界面均可拓展相应的功能。 效果 pyqt5同窗口多界面切换

统计平均分:从文本读取成绩并计算平均分,将平均分写入文本文件保存

从文本读取成绩并计算平均分,将平均分写入文本文件保存。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址:htt…

x in ‘Yy‘ == x in list(‘Yy‘)? ‘‘ 空字符串是任何字符串的子串

‘’ 空字符串是任何字符串的子串。如果您也喜欢 in 的简洁美妙, in 字符串时切记谨慎操作。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础…

Python 代码打造小 AI ,罗列博文笔记总索引列表,自动生成“我的博文笔记总索引”博文 HTML5 源码文本

Python 代码打造小 AI ,获取笔记信息,自动阅读量降序编排索引列表,生成 HTML5 源码文本。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&…

Python四则运算“计算器”——整数口算练习“小程序”

设定练习题目数量、最大取值整数数,即时判定,答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简…

排位赛结果“测谎”

甲乙丙丁说的关于排位赛结果只正确一半,根据甲乙丙丁说的信息求出正确的排位赛结果顺序。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那…

阶乘求和——求1~202320232023的阶乘总和的末尾九位数字

求 1! 2! 3! … 202320232023! ,总和的末尾九位数字。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址:ht…

五分钟写一段Python代码调用ChatGPT服务

ChatGPT是现在很火的AI网站,行业里现在也有很多围绕ChatGPT进行二次开发的AI产品。今天我们来试一试,花5分钟时间,自己写一段代码来调用ChatGPT的服务。希望通过这个小任务,大家会发现ChatGPT和AI离我们并不遥远。 前提&#xff…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”,到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机,小度在短短10天时间成为市场关注的焦点。 而5月22日,其也拿出了真正的成果,这部专门为青少年打造的学习手机正…

小度即将推出智能手机产品,醉翁之意意在何为?

5月8日,智哪儿从相关渠道获悉,小度即将于5月下旬发布首款智能手机产品。小度科技通过公开渠道确认了上述信息并透露将于下周披露更详细的产品信息。根据市场调查机构Counterpoint Research公布的最新报告,2023年第一季度全球智能手机市场出货…

当 AI 冲击自动化编程,谁将成为受益者?

整理 | 明明如月 责编 | 何苗 出品 | 《开谈》(ID:CSDNnews) 在软件工程中,自动编程一直被视为圣杯。从编译器诞生时代开始,程序自动生成的目标就是将接近自然语言的高级语言翻译成低级语言,最终目标…

纯英文外刊原刊在哪看?怎么看?

.大家都知道,考研英语、雅思、托福、GRE中的文章很多都是来自外刊,它就是一个随机的阅读题库。选择哪些外刊作为备考资料很重要,下面几种外刊可以供大家参考。 时政经济类:经济学人(the Economist)、哈佛商…