想利用手头上的DE2-115 写一个关于以太网通信的驱动,经过了这么多天的实验调试终于有了一些认识。
1、我在观察网卡发送数据与接收数据的过程中发现,我从fpga上的一个网卡发送数据,然后另一个网卡接收数据,接收到的数据前面会有55h这8bit的数据。我从PC上发送数据,用fpga上的网卡接收数据,那么在接收到的数据前面会有55h,55h,55h,55h,55h,55h,55h,5dh这64bit的数据。那么如果55h这8bit数据是PHY发送时自动添加那么从PC上接收到的最后应该是55而不应该是5d。那么只能是网卡在接收的时候自动添加的55h这8bit位。那剩下的56bit应该是自己添加在数据中发送的。
2、我用signaltap ii设置的采样频率是50Mh,而数据的带宽是100Mhz。当我用小兵以太网测试仪设置的发送频率为1000000/次时,发现siganltap ii 中rx_data的数据很久才会变化,其余时刻都是零,但是用led通过对接收数据进行观察时就符合发送的频率,那么signal tap ii 很长时间观察不到数据的情景应该和时钟的设置有关。
3、有一段时间我从PC上发送数据,然后fpga上接收的数据,一段数据的个别位发生错误。等我把板子上两个phy的配置都设置正确时。就能正确的接收数据了。
4、signaltap 接收到的PC数据高四位与第四位颠倒,比如说如果发送的数据是56h 75h 83h 那么接收到的数据就是65h 57h 38h。说明数据在发送的过程中高先发送低四位后发送高四位。
5、88E1111 采用100M ,全双工 能从Pc接收数据的寄存器设置。
a、PHY的物理地址为10000,板子连接JP1的23.
b、读寄存器以及写寄存器。读寄存器主要是为了观察PHY配置是否正确。在调试的过程中正确的读寄存器非常重要。
代码如下
1 if(flag) begin 2 case(mdc_num) 3 0:begin RST_N<=0;mdio_reg<=mdio_reg+1;if(mdio_reg&32'hffffffff==32'hffffffff) begin RST_N<=1; mdc_num<=1;end
else mdc_num<=0;end 4 1:begin mdio_reg<=96'hffff_ffff__585a__0000_ffff_ffff;mdc_num<=2;end //选择page0 copper 5 2:begin mdc_count<=mdc_count+1; 6 if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=2;end 7 else begin mdc_num<=5;mdc_count<=0;end end 11 5:begin mdio_reg<=96'hffff_ffff__5812_0101_ffff_ffff;mdc_num<=6;end //4 100full duplex,802.3 12 6:begin mdc_count<=mdc_count+1; if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=6;end 14 else begin mdc_num<=9;mdc_count<=0;end end 9:begin mdio_reg<=96'hffff_ffff__5826__0400_ffff_ffff;mdc_num<=10;end //9自动主从,multi port device 19 10:begin mdc_count<=mdc_count+1; if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=10;end else begin mdc_num<=13;mdc_count<=0;end end 22 13:begin mdio_reg<=96'hffff_ffff__5842__0068_ffff_ffff;mdc_num<=14;end //16 power up 25 14:begin mdc_count<=mdc_count+1; if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=14;end else begin mdc_num<=17;mdc_count<=0;end end 2 17:begin mdio_reg<=96'hffff_ffff__5852_9051_ffff_ffff;mdc_num<=18;end //9051 31 18:begin mdc_count<=mdc_count+1;if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=18;end else begin mdc_num<=19;mdc_count<=0;end end 34 19:begin mdio_reg<=96'hffff_ffff__5802_a100_ffff_ffff;mdc_num<=20;end 35 20:begin mdc_count<=mdc_count+1; if(mdc_count<96)begin mdio<=mdio_reg[95]; wr_rd<=1;mdio_reg<=mdio_reg<<1;mdc_num<=20;end else begin mdc_num<=21;mdc_count<=0 ;end end 38 21:begin mdc_count<=mdc_count+1;if(mdc_count<32)begin mdio<=1'b1; wr_rd<=1;mdc_num<=21;end 46 else begin flag<=0;wr_rd<=0;end end 47 endcase
end 48 else 49 begin 50 51 case(timenum) 52 0:begin mdio_reg<=96'b11111111111111111111111111111111_01101000010001z1_zzzzzzzzzzzzzzzz_11111111111111111111111111111111;timenum<=1;wr_rd<=1;mdc_count<=0;end 53 1:begin mdc_count<=mdc_count+1; if(mdc_count<48)begin mdio<=mdio_reg[95]; mdio_reg<=mdio_reg<<1;timenum<=1;end else begin wr_rd<=0;timenum<=2;end end 54 2:begin data1[15]<=mdio_in;timenum<=3;end 55 3:begin data1[14]<=mdio_in;timenum<=4;end 56 4:begin data1[13]<=mdio_in;timenum<=5;end 57 5:begin data1[12]<=mdio_in;timenum<=6;end 58 6:begin data1[11]<=mdio_in;timenum<=7;end 59 7:begin data1[10]<=mdio_in;timenum<=8;end 60 8:begin data1[9]<=mdio_in;timenum<=9;end 61 9:begin data1[8]<=mdio_in;timenum<=10;end 62 10:begin data1[7]<=mdio_in;timenum<=11;end 63 11:begin data1[6]<=mdio_in;timenum<=12;end 64 12:begin data1[5]<=mdio_in;timenum<=13;end 65 13:begin data1[4]<=mdio_in;timenum<=14;end 66 14:begin data1[3]<=mdio_in;timenum<=15;end 67 15:begin data1[2]<=mdio_in;timenum<=16;end 68 16:begin data1[1]<=mdio_in;timenum<=17;end 69 17:begin data1[0]<=mdio_in;mdc_count<=1;timenum<=18;end 70 18:begin mdc_count<=mdc_count+1;wr_rd<=1;mdio<=1;if(mdc_count==7'h3f)mdc_count<=0;timenum<=0; end 71 endcase 72 75 end