最前面的话
长沙最近好热啊…为什么非得五月份才让开空调啊,学校就不能变通一下嘛?这谁受得了啊!(X)
不过接下来长沙要降温了,小伙伴们记得要加衣啊
一些关于自己的记录:这周是第三次去找老师了,之前的问题脉络逐渐清晰起来了,但是伴随而来的也有新的问题,而老师表达了她对新问题的担忧…emmm…
注意!本博客仅供参考!
实验详情
吐槽
其实有点离谱啊,因为关于Verilog语言根本是什么都没有学过,虽然给的代码里有一些注释,但可能是我愚钝吧,反正就只能看懂一部分,其余的一大堆东西不知道是要干什么的
2in3out部分
其实最早看到这个名字的时候我以为是要我们搞一个两个输入的接口和三个输出的接口,不过听了老师的解释发现是我理解错了。2in3out的意思是从2号接口进入,从3号接口出去。不过实际上我们实现的其实是2号接口和3号接口的通信,就是从2、3其中一个接口发送然后从另外一个接口接收
至于结果的话,我们从cmd上面是只能看到我们发送成功or失败的样子的,如果想让接收的结果实例化(其实应该是可视化,但是觉得实例化这个词听起来更高端一点hhh),其实是可以用我们计网的实验软件Wireshark来抓包的,有兴趣的小伙伴可以试一试
编辑代码的话,需要先选中Files,然后再点击这个UM.v
原文件里其实给我们留下了编写代码的位置
然后其实直接复制老师的那个2进3出参考代码就可以了
always@(posedge clk or negedge reset)
if(!reset)
begin
um2cdp_rule <=30'b0;
um2cdp_rule_wrreq <= 1'b0;
input_port_reg <= 4'b0;
end
else
begin
if((cdp2um_data_valid==1'b1)&&(cdp2um_data[138:136]==3'b101)) //报文头到达
input_port_reg <= cdp2um_data[131:128]; //锁存输入端口号
//定义转发规则:决定输出端口号、全文转发、摘要转发或丢弃报文。
//如果查表算法较复杂,需要一边接收报文一边查表,以在报文尾到达时产生规
//则信息。路由表可以放在UM的内部RAM中,也可以放在外部DDR2中。
//这里只实现了最简单的端口交换行为,因此未进行IP层的查表。
else if((cdp2um_data_valid==1'b1)&&(cdp2um_data[138:136]==3'b110)&&(cdp2um_rule_usedw<5'd30)) //报文尾到达
begin //端口号交换
if(input_port_reg==4'b0001) //来自外部端口2(逻辑端口1)
begin
um2cdp_rule <=30'h00000004; //送往外部端口3(逻辑端口2) //最高位固定为0,告诉CDP output_ctrl报文来自UM
um2cdp_rule_wrreq <=1'b1; //写规则
end
else if(input_port_reg==4'b0010) //来自外部端口3(逻辑端口2)
begin
um2cdp_rule <=30'h00000002; //送往外部端口2(逻辑端口1)
um2cdp_rule_wrreq <=1'b1;
end
else
um2cdp_rule_wrreq <=1'b0; //来自其它端口,不写规则
end
else
um2cdp_rule_wrreq <= 1'b0;
end
代码的核心就是判别input_port_reg来自几号端口
如果是来自2号端口
input_port_reg==4’b0001
的话就把信息发送到3号端口
um2cdp_rule <=30’h00000004
其中这个4的二进制写法是0100,从高到低分别表示4号接口、3号接口、2号接口、1号接口,由于是发送给3号接口,所以第二个位置是1
如果是来自3号端口
input_port_reg==4’b0010
的话就把信息发送到2号端口
um2cdp_rule <=30’h00000002
其中这个2的二进制写法是0010,由于是发送给2号接口,所以第三个位置是1
烧制操作和实验1基本上一样,这里提醒一下,用网线在进行接口拔插的时候是不需要断电的,但是设备和电脑连接的时候千万不要带电拔插(给学弟学妹们留点能用的设备吧)
查看自己ip地址的方法:
在cmd输入
ipconfig
即可查看自己的ip地址
补充几个在验证过程中可能出现的问题:
1.传输失败,常见故障的话可能是有一方没有关闭防火墙
2.无法访问目标主机的话可能是其中一方不是千兆网卡或者那个转换器不是千兆转换器,千兆的话连接在设备上是绿色的灯,不是千兆是黄色的灯;也可能是ping对方的ip地址写错了,或者看看是不是IPV4
NinNout部分
然后理解了2in3out代码的实现原理,我们可以很轻松的修改成NinNout的代码,主要就是分别判别是否是来自1、2、3、4接口的信息,如果是其中一个的话,就发送给另外三个即可,如果不是就不需要管了
具体代码实现:
always@(posedge clk or negedge reset)
if(!reset)
begin
um2cdp_rule<=30'b0;
um2cdp_rule_wrreq<=1'b0;
input_port_reg<=4'b0;
end
else
begin
if((cdp2um_data_valid==1'b1)&&(cdp2um_data[138:136]==3'b101))
input_port_reg<=cdp2um_data[131:128];
else if((cdp2um_data_valid==1'b1)&&(cdp2um_data[138:136]==3'b110)&&(cdp2um_rule_usedw<5'd30))
begin
if(input_port_reg==4'b0001) //来自外部端口2 (逻辑端口1)
begin
um2cdp_rule<=30'h0000000d; //送往外部端口1、3、4
um2cdp_rule_wrreq<=1'b1;
end
else if(input_port_reg==4'b0010) //来自外部端口3 (逻辑端口2)
begin
um2cdp_rule <=30'h0000000b;
um2cdp_rule_wrreq <=1'b1;
end
else if(input_port_reg==4'b0011) //来自外部端口4 (逻辑端口3)
begin
um2cdp_rule <=30'h00000007;
um2cdp_rule_wrreq <=1'b1;
end
else if(input_port_reg==4'b0000) //来自外部端口1 (逻辑端口0)
begin
um2cdp_rule <=30'h0000000e;
um2cdp_rule_wrreq <=1'b1;
end
else
um2cdp_rule_wrreq <=1'b0; //来自其它端口,不写规则
end
else
um2cdp_rule_wrreq <= 1'b0;
end
um2cdp_rule<=30’h0000000d;
的d二进制表示为1101,即发送给4、3、1号口
um2cdp_rule <=30’h0000000b;
的b二进制表示为1011,即发送给4、2、1号口
um2cdp_rule <=30’h00000007;
的7二进制表示为0111,即发送给3、2、1号口
um2cdp_rule <=30’h0000000e;
的e二进制表示为1110,即发送给4、3、2号口
实验思考
项目 2 完成后 3 号口和 4 号口能否联通?
可以,如果数据是从 3 号口发送,即
if(input_port_reg==4’b0010) 则 um2cdp_rule <=30’h0000000b;
会将信息发送到 1、2、4 号口,此时完成了 3号口到 4 号 口 的 信 息 传 递 ;
如 果 数 据 是 从 4 号 口 发 送 , 即
if(input_port_reg==4’b0011)则 um2cdp_rule <=30’h00000007;
会将信息发送到 1、2、3 号口,此时完成了 4 号口到 3 号口的信息传递。
综上,项目 2完成后 3 号口和 4 号口能够联通。