chinaaetwoaini

转 xilinx的RGMII 的PHY层逻辑设计(1)

1
阅读(2853)

   啥叫加班猫,就是半夜还在加班的夜猫子。半夜还在写博客,请问在AET论坛属于什么水平。

         今天讲解是RGMII的FPGA设计。因为这边文章主要是用XILINX的约束工具,所以标记为XILINX,其实你用altera平台也可以的。设计分为2部分,一部分讲解MDIO操作和IEE802.3寄存器要求。另外一部分主要讲解PHY层的软件设计。

         RGMII是千兆网总线,但是比GMII差别在于数据发送和接受是4BIT,RGMII是双边得到数据,所以千万要注意约束双边沿的数据。观察RGMII是不是跟MII很像,所以兼容总线100,M/10M接口。

          1.jpg

       有人问我,是不是很蛋疼,为啥不用ALTERA和xilinx的 TRI-mode MAC ip核心设计。关键三模式MAC的IP只能挂在nios或者microblaze一类处理器,你还要学习这些处理器平台。而且很多工业以太网也不是基于TCP/IP协议的。所以这次有必要讲述PHY层的操作。

      对于PHY模式和MAC模式,主要差别MAC没有前导码和4个字节的CRC32校验码。而PHY层是带这些。经常使用PC软件发送是MAC层发送。

blob.png

前导码

2.jpg

      可以看出前导码是固定,CRC我们下载已经搞好。已经上传了基本CRC的算法文件。CRC32_8_CONTROL.rar ,有人问我为啥要用CRC32校验,如果你不用CRC32,你发给PC,pc不会认你的以太网包的。   注意,CRC校验是不包括前导码还有CRC32的4个字节数据。

crc32_8 crc32_8_inst
(
.crc(crc) ,        // output [7:0] crc
.d(p_data) ,        // input [7:0] d_sig
.calc(calc) ,    // input  calc_sig
.init(init) ,    // input  init_sig
.d_valid(d_valid) ,// input  d_valid_sig
.clk(clk_125mhz) ,// input  clk_125mhz
.rst_n(rst_n)     // input  rst_n
);
if((p_data == 8'hd5) &&(cnt_pre >= 4'd7)) 
begin  //开始CRC校验						
  calc <= 1'b1;
  d_valid <= 1'b1;
  init <= 1'b0;
end
else if(cnt_crc < 3'd4)   //4个字节的校验码
 begin
   d_valid <= 1'b1;
   calc <= 1'b0;
   init <= 1'b0;
   cnt_crc <= cnt_crc + 1'b1;
   cnt_pre <= 4'd0;
 end
else 
   begin             //数据无效,对校验程序设置初始化值
     d_valid <= 1'b0;
     calc <= 1'b0;
     init <= 1'b1;
   end

上述基本问题已经初步解决,关键怎么看待这个设计给用户怎么一个好的接口。初步设想使用两个读和写fifo来兼容三种不同的速度模式。在发送的fifo中提供发送fifo的空闲标示,标示可以发送数据。而接收的fifo上面提供完整帧指示,读缓冲满指示。