刚刚对照着wirsharp写了arp报文生成的verilog代码。
下面16进值每个字节,都会在对应的解析里面高亮说明意思。
另外我说,三屏幕的工作效率太高了。原谅我写的代码每行比较长,因为我写代码用的扁宽的带鱼屏。
/*
arp_gen arp_gen (
.clk ( ),
.rst( ) ,
.s_valid( ),
.s_ready( ),
.my_ip( ),
.dst_ip( ),
.my_mac( ),
.dst_mac( ),
.req0_rep1( ) ,
.arp_ack( ),
.arp_load( ),
.arp_data( ),
.arp_len( ),
.m_valid ( )
);
*/
module arp_gen (
input clk , rst , // 请求发送接口
input [31:0] my_ip,dst_ip,
input [47:0] my_mac,dst_mac,
input req0_rep1 ,
input arp_ack,arp_load,
output reg [7:0] arp_data, // 接mac接口
output reg arp_last
);
reg arp_ackr ; always@(posedge clk) arp_ackr <= arp_ack ;
function [7:0]get_byte0;input[47:0]in;begin get_byte0=in[7:0]; end endfunction
function [7:0]get_byte1;input[47:0]in;begin get_byte1=in[1*8+7:1*8]; end endfunction
function [7:0]get_byte2;input[47:0]in;begin get_byte2=in[2*8+7:2*8]; end endfunction
function [7:0]get_byte3;input[47:0]in;begin get_byte3=in[3*8+7:3*8]; end endfunction
function [7:0]get_byte4;input[47:0]in;begin get_byte4=in[4*8+7:4*8]; end endfunction
function [7:0]get_byte5;input[47:0]in;begin get_byte5=in[5*8+7:5*8]; end endfunction
reg [31:0] my_ipr,dst_ipr;
reg [47:0] my_macr,dst_macr;
reg req0_rep1r;
always @ (posedge clk) if (arp_load){my_ipr,dst_ipr, my_macr,dst_macr,req0_rep1r} <= {my_ip,dst_ip, my_mac,dst_mac,req0_rep1};
reg [5:0] addr ; always @ (posedge clk )if ( rst | arp_load ) addr <=0 ; else if ( arp_ackr ) addr <= addr + 1 ;
reg [7:0]st;always @ (posedge clk) if(rst)st<=0; else case(st)
0:st <=10;
10: if (1) st<=15 ;
15: if (arp_load) st<=20;
20: if (arp_ackr) st<=30 ;
30: st<=10;
default st<=0;
endcase
always @ (posedge clk) case (addr)
//0:arp_data <= 'h08;
//1:arp_data <= 'h06 ;//0806 arp
2-2:arp_data <= 'h00 ;
3-2:arp_data <= 'h01 ;//via ether
4-2:arp_data <='h08 ;
5-2:arp_data <='h00 ;//ipv4 0800
6-2:arp_data <= 'h06 ;// hardware size 6
7-2:arp_data <= 'h04 ;//protocol size 4
8-2:arp_data <= 'h00 ;
9-2:arp_data <= (req0_rep1r==0)?'h01:'h02 ;// arp reply 2
10-2:arp_data <= get_byte5 (my_macr);
11-2:arp_data <= get_byte4 (my_macr) ;
12-2:arp_data <= get_byte3 (my_macr) ;
13-2:arp_data <= get_byte2 (my_macr) ;
14-2:arp_data <= get_byte1 (my_macr) ;
15-2:arp_data <= get_byte0 (my_macr) ;//source mac
16-2:arp_data <= get_byte3(my_ipr) ;
17-2:arp_data <=get_byte2(my_ipr) ;
18-2:arp_data <=get_byte1(my_ipr) ;
19-2:arp_data <= get_byte0(my_ipr) ; //source ip
/*
20-2:arp_data <=(req0_rep1r)?get_byte5 (dst_macr) :0 ;
21-2:arp_data <=(req0_rep1r)?get_byte4 (dst_macr) :0 ;
22-2:arp_data <=(req0_rep1r)?get_byte3 (dst_macr) :0 ;
23-2:arp_data <=(req0_rep1r)?get_byte2 (dst_macr) :0 ;
24-2:arp_data <=(req0_rep1r)?get_byte1 (dst_macr) :0 ;
25-2:arp_data <=(req0_rep1r)?get_byte0 (dst_macr) :0 ; // target mac .zero if ARP request
*/
20-2:arp_data <= get_byte5 (dst_macr) ;
21-2:arp_data <= get_byte4 (dst_macr) ;
22-2:arp_data <= get_byte3 (dst_macr) ;
23-2:arp_data <= get_byte2 (dst_macr) ;
24-2:arp_data <= get_byte1 (dst_macr) ;
25-2:arp_data <= get_byte0 (dst_macr) ; // target mac .zero if ARP request
26-2:arp_data <=get_byte3(dst_ipr) ;
27-2:arp_data <=get_byte2(dst_ipr) ;
28-2:arp_data <=get_byte1(dst_ipr) ;
29-2:arp_data <=get_byte0(dst_ipr) ;// dst ip
default arp_data <=0;endcase
always @ (posedge clk) arp_last <= addr == (29-2) ; // @ addr==29
endmodule
明天全天外出,不一定有时间继续写。下步就要下FPGA跑跑,实现对arp的发送接收,这样获取物理地址,之后实现udp发送。这步实现之后就开始实现udp接收。之后再加上icmp的接收,以相应ping。
{{aAxvOXMOIvVUoXMxvoxiowMwWV8xxWTxoxOIOVIUUOvwVOUiIoUvvTMMVMwovWHWX8vOUOvOUToIwIMMvHTUXWUimMTmxHHmMUIVT8iWmwxooU8WmHMoiHIoVU8VvmvIWXTvvOvv8xvMovOWiHOvvOix8UmooOTvvwUIoTwvmWUoiTw8VmvoHWwMIUWOixiowiUoiXwiwwMMIiIXHwUmOWUVmXXwV8iHWOTUiwTU8xwOoV8HVmTWZz}}