生成arp报文的verilog实现

66 篇文章 23 订阅
28 篇文章 11 订阅

刚刚对照着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}}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值