5363|13

2113

帖子

0

TA的资源

裸片初长成(初级)

楼主
 

MII RMII RGMII GMII [复制链接]

 
最近在学习黑金的一款FPGA中的例程,其中有一个例程是一个非IP核的千兆网的例程。想把自己的学习经验教训写一下,希望大家和气的指出问题。写之前,先说一些概念,但是这些内容都来自于网络,我自己整理了一下,也忘了出处,如果不合适,留言我来删除。

MII是英文Medium Independent Interface的缩写,翻译成中文是“介质独立接口”,该接口一般应用于以太网硬件平台的MAC层和PHY层之间,MII接口的类型有很多,常用的有MII、RMII、SMII、SSMII、SSSMII、GMII、RGMII、SGMII、TBI、RTBI、XGMII、XAUI、XLAUI等。


MII接口:
RXD(Receive Data)[3:0]:数据接收信号,共4根信号线;
TX_ER(Transmit Error):发送数据错误提示信号,同步于TX_CLK,高电平有效,表示TX_ER有效期内传输的数据无效。对于10Mbps速率下,TX_ER不起作用;
RX_ER(Receive Error):接收数据错误提示信号,同步于RX_CLK,高电平有效,表示RX_ER有效期内传输的数据无效。对于10Mbps速率下,RX_ER不起作用;
TX_EN(Transmit Enable):发送使能信号,只有在TX_EN有效期内传的数据才有效;
RX_DV(Reveive Data Valid):接收数据有效信号,作用类型于发送通道的TX_EN;
TX_CLK:发送参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。注意,TX_CLK时钟的方向是从PHY侧指向MAC侧的,因此此时钟是由PHY提供的。
RX_CLK:接收数据参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。RX_CLK也是由PHY侧提供的。
CRS:Carrier Sense,载波侦测信号,不需要同步于参考时钟,只要有数据传输,CRS就有效,另外,CRS只有PHY在半双工模式下有效;
COL:Collision Detectd,冲突检测信号,不需要同步于参考时钟,只有PHY在半双工模式下有效。
MII接口一共有16根线。

RMII接口
RXD(Receive Data)[3:0]:数据接收信号,共4根信号线;
TX_ER(Transmit Error):发送数据错误提示信号,同步于TX_CLK,高电平有效,表示TX_ER有效期内传输的数据无效。对于10Mbps速率下,TX_ER不起作用;
RX_ER(Receive Error):接收数据错误提示信号,同步于RX_CLK,高电平有效,表示RX_ER有效期内传输的数据无效。对于10Mbps速率下,RX_ER不起作用;
TX_EN(Transmit Enable):发送使能信号,只有在TX_EN有效期内传的数据才有效;
RX_DV(Reveive Data Valid):接收数据有效信号,作用类型于发送通道的TX_EN;
TX_CLK:发送参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。注意,TX_CLK时钟的方向是从PHY侧指向MAC侧的,因此此时钟是由PHY提供的。
RX_CLK:接收数据参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。RX_CLK也是由PHY侧提供的。
CRS:Carrier Sense,载波侦测信号,不需要同步于参考时钟,只要有数据传输,CRS就有效,另外,CRS只有PHY在半双工模式下有效;
COL:Collision Detectd,冲突检测信号,不需要同步于参考时钟,只有PHY在半双工模式下有效。
MII接口一共有16根线。

RMII接口
与MII接口相比,GMII的数据宽度由4位变为8位,GMII接口中的控制信号如TX_ER、TX_EN、RX_ER、RX_DV、CRS和COL的作用同MII接口中的一样,发送参考时钟GTX_CLK和接收参考时钟RX_CLK的频率均为125MHz(1000Mbps/8=125MHz)。
在这里有一点需要特别说明下,那就是发送参考时钟GTX_CLK,它和MII接口中的TX_CLK是不同的,MII接口中的TX_CLK是由PHY芯片提供给MAC芯片的,而GMII接口中的GTX_CLK是由MAC芯片提供给PHY芯片的。两者方向不一样。
在实际应用中,绝大多数GMII接口都是兼容MII接口的,所以,一般的GMII接口都有两个发送参考时钟:TX_CLK和GTX_CLK(两者的方向是不一样的,前面已经说过了),在用作MII模式时,使用TX_CLK和8根数据线中的4根。

RGMII接口
RGMII即Reduced GMII,是RGMII的简化版本,将接口信号线数量从24根减少到14根(COL/CRS端口状态指示信号,这里没有画出),时钟频率仍旧为125MHz,TX/RX数据宽度从8为变为4位,为了保持1000Mbps的传输速率不变,RGMII接口在时钟的上升沿和下降沿都采样数据。在参考时钟的上升沿发送GMII接口中的TXD[3:0]/RXD[3:0],在参考时钟的下降沿发送GMII接口中的TXD[7:4]/RXD[7:4]。RGMI同时也兼容100Mbps和10Mbps两种速率,此时参考时钟速率分别为25MHz和2.5MHz。

TX_EN信号线上传送TX_EN和TX_ER两种信息,在TX_CLK的上升沿发送TX_EN,下降沿发送TX_ER;同样的,RX_DV信号线上也传送RX_DV和RX_ER两种信息,在RX_CLK的上升沿发送RX_DV,下降沿发送RX_ER。

此帖出自FPGA/CPLD论坛

最新回复

您好,我想请问一下这是黑金哪个例程?最近在做gmii和rgmii相关的试验   详情 回复 发表于 2019-12-2 00:42
点赞 关注(2)
 

回复
举报

2113

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
本帖最后由 heningbo 于 2019-5-22 10:19 编辑

我自己整理的文档中有一些图片,但是论坛中无法直接粘贴,一格式上传有太麻烦,还不会操作,所以讲一个很重要图片没有传上来。即RMII转MII的图片。
管理员这块是否可优化。@管理员
此帖出自FPGA/CPLD论坛
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

板凳
 
以太网的顶层文件如下:
`timescale 1ns/1ns
module ethernet_2port(
        input                        sys_clk_p,
        input                        sys_clk_n,
        input                        key,
        output        [3:0]        led,
        input                        rst_n,
        output                        e1_reset,
        output                        e1_mdc,
        inout                        e1_mdio,
        output        [3:0]        rgmii1_txd,
        output                        rgmii1_txctl,
        output                        rgmii1_txc,
        input        [3:0]        rgmii1_rxd,
        input                        rgmii1_rxctl,
        input                        rgmii1_rxc,       
        output                        e2_reset,
        output                        e2_mdc,
        inout                        e2_mdio,
        output        [3:0]        rgmii2_txd,
        output                        rgmii2_txctl,
        output                        rgmii2_txc,
        input        [3:0]        rgmii2_rxd,
        input                        rgmii2_rxctl,
        input                        rgmii2_rxc,       
);
        wire                        sys_clk_200m;
        wire                        sys_clk;
        wire        [3:0]        led_r1;
        wire        [3:0]        led_r2;
       
        assign        led = led_r1 & led_r2;
       
        clk_ref refclk
        (
                // Clock out ports
                .clk_out1(sys_clk_200m),             // output clk_out1
                .clk_out2(sys_clk),                     // output clk_out2
                // Status and control signals
                .reset(1'b0),                                         // input reset
                .locked(),                                       // output locked
                // Clock in ports
                .clk_in1_p(sys_clk_p),                    // input clk_in1_p
                .clk_in1_n(sys_clk_n)                    // input clk_in1_n   
        );

        ethernet_test u1(
                .sys_clk_50m                        (sys_clk                ),
                .sys_clk                                (sys_clk_200m        ),
                .key_in                                        (key                        ),
                .rst_n                                        (rst_n                        ),
                .led                                        (led_r1                        ),
                .e_reset                                (e1_reset                ),         
                .e_mdc                                        (e1_mdc                        ),
                .e_mdio                                        (e1_mdio                ),               
               
                .rgmii_txd                                (rgmii1_txd                ),
                .rgmii_txctl                        (rgmii1_txctl        ),     
                .rgmii_txc                                (rgmii1_txc                ),
                .rgmii_rxd                                (rgmii1_rxd                ),     
                .rgmii_rxctl                        (rgmii1_rxctl        ),
                .rgmii_rxc                                (rgmii1_rxc                )
               
        );
                       
        ethernet_test u2(
                .sys_clk_50m                        (sys_clk                ),
                .sys_clk                                (sys_clk_200m        ),
                .key_in                                        (key                        ),
                .rst_n                                        (rst_n                        ),
                .led                                        (led_r2                        ),
                .e_reset                                (e2_reset                ),         
                .e_mdc                                        (e2_mdc                        ),
                .e_mdio                                        (e2_mdio                ),               
               
                .rgmii_txd                                (rgmii2_txd                ),
                .rgmii_txctl                        (rgmii2_txctl        ),     
                .rgmii_txc                                (rgmii2_txc                ),
                .rgmii_rxd                                (rgmii2_rxd                ),     
                .rgmii_rxctl                        (rgmii2_rxctl        ),
                .rgmii_rxc                                (rgmii2_rxc                )
               
        );           
endmodule

说明:1、查分输入,经过内部PLL之类的 核转成单端及频率改变。
         2、复位等信号就不说了。
         3、指示灯,用于显示link、网络速率等信息。
         4、MDIO接口(由于使用2个相同的千兆网接口,所以分为1和2)
         5、与phy的连接接口为EGMII
此帖出自FPGA/CPLD论坛
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

4
 
  1. `timescale 1ns/1ns
  2. module ethernet_test(
  3.         input                        sys_clk_50m                ,
  4.         input                        sys_clk                        ,
  5.         input                        key_in                        ,
  6.         input                        rst_n                        ,
  7.         output        [3:0]        led                                ,
  8.         output                        e_reset                        ,
  9.         output                        e_mdc                        ,
  10.         output                        e_mdio                        ,
  11.         output        [3:0]        rgmii_txd                ,
  12.         output                        rgmii_txctl                ,
  13.         output                        rgmii_txc                ,
  14.         input        [3:0]        rgmii_rxd                ,
  15.         input                        rgmii_rxctl                ,
  16.         input                        rgmii_rxc               
  17. );

  18.         wire                        reset_n                        ;
  19.         wire        [07:0]        gmii_txd                ;
  20.         wire                        gmii_tx_en                ;
  21.         wire                        gmii_tx_er                ;
  22.         wire                        gmii_tx_clk                ;
  23.         wire                        gmii_crs                ;
  24.         wire                        gmii_col                ;
  25.         wire        [07:0]        gmii_rxd                ;
  26.         wire                        gmii_rx_dv                ;
  27.         wire                        gmii_rx_er                ;
  28.         wire                        gmii_rx_clk                ;
  29.         wire        [01:0]        speed_selection        ;
  30.         wire                        duplex_mode                ;
  31.         wire                        rgmii_rxcpll        ;

  32.         wire        [31:0]        pack_total_len        ;
  33.         wire        [01:0]        speed                        ;
  34.         wire                        link                        ;
  35.         wire                        e_rx_dv                        ;
  36.         wire        [07:0]        e_rxd                        ;
  37.         wire                        e_tx_en                        ;
  38.         wire        [07:0]        e_txd                        ;
  39.         wire                        e_rst_n                        ;
  40.        
  41.         assign        speed_selection = 2'b10        ;
  42.         assign        duplex_mode                = 1'b1        ;
  43.          //MDIO config
  44.         smi_config  smi_config_inst
  45.         (
  46.                 .clk                                 (sys_clk_50m        ),
  47.                 .rst_n                               (e_reset            ),         
  48.                 .mdc                                 (e_mdc              ),
  49.                 .mdio                                (e_mdio             ),
  50.                 .speed                               (speed              ),
  51.                 .link                                (link               ),
  52.                 .led                                 (led                )   
  53.         );
  54.        
  55.         util_gmii_to_rgmii util_gmii_to_rgmii_m0(
  56.                 .reset                                        (1'b0                        ),
  57.                 .rgmii_td                                (rgmii_txd                ),
  58.                 .rgmii_tx_ctl                        (rgmii_txctl        ),
  59.                 .rgmii_txc                                (rgmii_txc                ),
  60.                 .rgmii_rd                                (rgmii_rxd                ),
  61.                 .rgmii_rx_ctl                        (rgmii_rxctl        ),
  62.                 .gmii_rx_clk                        (gmii_rx_clk        ),
  63.                 .gmii_txd                                (e_txd                        ),
  64.                 .gmii_tx_en                                (e_tx_en                ),
  65.                 .gmii_tx_er                                (1'b0                        ),
  66.                 .gmii_tx_clk                        (gmii_tx_clk        ),
  67.                 .gmii_crs                                (gmii_crs                ),
  68.                 .gmii_col                                (gmii_col                ),
  69.                 .gmii_rxd                                (gmii_rxd                ),
  70.                 .rgmii_rxc                                (rgmii_rxc                ),
  71.                 .gmii_rx_dv                                (gmii_rx_dv                ),
  72.                 .gmii_rx_er                                (gmii_rx_er                ),
  73.                 .speed_selection                (speed                        ),
  74.                 .duplex_mode                        (duplex_mode        )
  75.         );
  76.         gmii_arbi arbi_inst
  77.         (
  78.                 .clk                        (gmii_tx_clk    ),
  79.                 .rst_n                      (rst_n          ),
  80.                 .speed                      (speed          ),  
  81.                 .link                       (link           ),
  82.                 .pack_total_len             (pack_total_len ),
  83.                 .e_rst_n                    (e_rst_n        ),
  84.                 .gmii_rx_dv                 (gmii_rx_dv     ),
  85.                 .gmii_rxd                   (gmii_rxd       ),
  86.                 .gmii_tx_en                 (gmii_tx_en     ),
  87.                 .gmii_txd                   (gmii_txd       ),
  88.                 .e_rx_dv                    (e_rx_dv        ),
  89.                 .e_rxd                      (e_rxd          ),
  90.                 .e_tx_en                    (e_tx_en        ),
  91.                 .e_txd                      (e_txd          )
  92.         );
  93.         mac_test mac_test0
  94.         (
  95.                 .gmii_tx_clk            (gmii_tx_clk           ),
  96.                 .gmii_rx_clk            (gmii_rx_clk           ) ,
  97.                 .rst_n                  (e_rst_n               ),
  98.                 .push_button            (key_in                ),
  99.                 .pack_total_len         (pack_total_len        ),
  100.                 .gmii_rx_dv             (e_rx_dv               ),
  101.                 .gmii_rxd               (e_rxd                 ),
  102.                 .gmii_tx_en             (gmii_tx_en            ),
  103.                 .gmii_txd               (gmii_txd              )
  104.         );
  105.         reset reset_m0
  106.         (
  107.                 .clk                                        (sys_clk                ),
  108.                 .key1                                        (rst_n                        ),
  109.                 .rst_n                                        (e_reset                )
  110.         );
  111. endmodule
复制代码


这部分代码其实也可以作为顶层文件,只是设计中需要两个硬件接口,所以在他的上一层增加了一个文件。
该段代码包括RGMII与GMII互转、MDIO、MAC几个文件的映射。具体看下面
此帖出自FPGA/CPLD论坛
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

5
 
util_gmii_to_rgmii是GMII与RGMII转换代码
那问题来了,为什么要进行转换呢,原因是RGMII是在时钟上升和下降沿均采集数据的,所以对于一般编写代码的人来说,实现比较困难,所以转换成GMII。具体转换时序图如下:

[url=]具体实现代[/url][url=]码如下:[/url]
[url=]

复制代码
  1. module util_gmii_to_rgmii (
  2.   reset,
  3.   rgmii_td,
  4.   rgmii_tx_ctl,
  5.   rgmii_txc,
  6.   rgmii_rd,
  7.   rgmii_rx_ctl,
  8.   gmii_rx_clk,
  9.   rgmii_rxc,
  10.   gmii_txd,
  11.   gmii_tx_en,
  12.   gmii_tx_er,
  13.   gmii_tx_clk,
  14.   gmii_crs,
  15.   gmii_col,
  16.   gmii_rxd,
  17.   gmii_rx_dv,
  18.   gmii_rx_er,
  19.   speed_selection,
  20.   duplex_mode
  21.   );
  22.   input           rgmii_rxc;//add
  23.   input           reset;
  24.   output  [ 3:0]  rgmii_td;
  25.   output          rgmii_tx_ctl;
  26.   output          rgmii_txc;
  27.   input   [ 3:0]  rgmii_rd;
  28.   input           rgmii_rx_ctl;
  29.   output           gmii_rx_clk;
  30.   input   [ 7:0]  gmii_txd;
  31.   input           gmii_tx_en;
  32.   input           gmii_tx_er;
  33.   output          gmii_tx_clk;
  34.   output          gmii_crs;
  35.   output          gmii_col;
  36.   output  [ 7:0]  gmii_rxd;
  37.   output          gmii_rx_dv;
  38.   output          gmii_rx_er;
  39.   input  [ 1:0]   speed_selection; // 1x gigabit, 01 100Mbps, 00 10mbps
  40.   input           duplex_mode;     // 1 full, 0 half
  41.   
  42.   wire gigabit;
  43.   wire gmii_tx_clk_s;
  44.   wire gmii_rx_dv_s;

  45.   wire  [ 7:0]    gmii_rxd_s;
  46.   wire            rgmii_rx_ctl_delay;
  47.   wire            rgmii_rx_ctl_s;
  48.   // registers
  49.   reg             tx_reset_d1;
  50.   reg             tx_reset_sync;
  51.   reg             rx_reset_d1;
  52.   reg   [ 7:0]    gmii_txd_r;
  53.   reg             gmii_tx_en_r;
  54.   reg             gmii_tx_er_r;
  55.   reg   [ 7:0]    gmii_txd_r_d1;
  56.   reg             gmii_tx_en_r_d1;
  57.   reg             gmii_tx_er_r_d1;

  58.   reg             rgmii_tx_ctl_r;
  59.   reg   [ 3:0]    gmii_txd_low;
  60.   reg             gmii_col;
  61.   reg             gmii_crs;

  62.   reg  [ 7:0]     gmii_rxd;
  63.   reg             gmii_rx_dv;
  64.   reg             gmii_rx_er;

  65.   assign gigabit        = speed_selection [1];
  66.   assign gmii_tx_clk    = gmii_tx_clk_s;
  67.   assign gmii_tx_clk_s  = gmii_rx_clk;
  68.   BUFG bufmr_rgmii_rxc(
  69.     .I(rgmii_rxc),
  70.     .O(gmii_rx_clk)
  71.    );
  72.   always @(posedge gmii_rx_clk)
  73.   begin
  74.     gmii_rxd       = gmii_rxd_s;
  75.     gmii_rx_dv     = gmii_rx_dv_s;
  76.     gmii_rx_er     = gmii_rx_dv_s ^ rgmii_rx_ctl_s;
  77.   end

  78.   always @(posedge gmii_tx_clk_s) begin
  79.     tx_reset_d1    <= reset;
  80.     tx_reset_sync  <= tx_reset_d1;
  81.   end

  82.   always @(posedge gmii_tx_clk_s)
  83.   begin
  84.     rgmii_tx_ctl_r = gmii_tx_en_r ^ gmii_tx_er_r;
  85.     gmii_txd_low   = gigabit ? gmii_txd_r[7:4] :  gmii_txd_r[3:0];
  86.     gmii_col       = duplex_mode ? 1'b0 : (gmii_tx_en_r| gmii_tx_er_r) & ( gmii_rx_dv | gmii_rx_er) ;
  87.     gmii_crs       = duplex_mode ? 1'b0 : (gmii_tx_en_r| gmii_tx_er_r| gmii_rx_dv | gmii_rx_er);
  88.   end

  89.   always @(posedge gmii_tx_clk_s) begin
  90.     if (tx_reset_sync == 1'b1) begin
  91.       gmii_txd_r   <= 8'h0;
  92.       gmii_tx_en_r <= 1'b0;
  93.       gmii_tx_er_r <= 1'b0;
  94.     end
  95.     else
  96.     begin
  97.       gmii_txd_r   <= gmii_txd;
  98.       gmii_tx_en_r <= gmii_tx_en;
  99.       gmii_tx_er_r <= gmii_tx_er;
  100.       gmii_txd_r_d1   <= gmii_txd_r;
  101.       gmii_tx_en_r_d1 <= gmii_tx_en_r;
  102.       gmii_tx_er_r_d1 <= gmii_tx_er_r;
  103.     end
  104.   end


  105.   ODDR #(
  106.     .DDR_CLK_EDGE("SAME_EDGE")
  107.   ) rgmii_txc_out (
  108.     .Q (rgmii_txc),
  109.     .C (gmii_tx_clk_s),
  110.     .CE(1),
  111.     .D1(1),
  112.     .D2(0),
  113.     .R(tx_reset_sync),
  114.     .S(0));


  115.   generate
  116.   genvar i;
  117.   for (i = 0; i < 4; i = i + 1) begin : gen_tx_data
  118.     ODDR #(
  119.       .DDR_CLK_EDGE("SAME_EDGE")
  120.     ) rgmii_td_out (
  121.       .Q (rgmii_td[i]),
  122.       .C (gmii_tx_clk_s),
  123.       .CE(1),
  124.       .D1(gmii_txd_r_d1[i]),
  125.       .D2(gmii_txd_low[i]),
  126.       .R(tx_reset_sync),
  127.       .S(0));
  128.   end
  129.   endgenerate

  130.   ODDR #(
  131.     .DDR_CLK_EDGE("SAME_EDGE")
  132.   ) rgmii_tx_ctl_out (
  133.     .Q (rgmii_tx_ctl),
  134.     .C (gmii_tx_clk_s),
  135.     .CE(1),
  136.     .D1(gmii_tx_en_r_d1),
  137.     .D2(rgmii_tx_ctl_r),
  138.     .R(tx_reset_sync),
  139.     .S(0));

  140.   
  141.      
  142.       generate
  143.       for (i = 0; i < 4; i = i + 1) begin
  144.         IDDR #(
  145.           .DDR_CLK_EDGE("SAME_EDGE_PIPELINED")
  146.         ) rgmii_rx_iddr (
  147.           .Q1(gmii_rxd_s[i]),
  148.           .Q2(gmii_rxd_s[i+4]),
  149.           .C(gmii_rx_clk),
  150.           .CE(1),
  151.           .D(rgmii_rd[i]),
  152.           .R(0),
  153.           .S(0));
  154.       end
  155.       endgenerate
  156.    
  157.       IDDR #(
  158.         .DDR_CLK_EDGE("SAME_EDGE_PIPELINED")
  159.       ) rgmii_rx_ctl_iddr (
  160.         .Q1(gmii_rx_dv_s),
  161.         .Q2(rgmii_rx_ctl_s),
  162.         .C(gmii_rx_clk),
  163.         .CE(1),
  164.         .D(rgmii_rx_ctl),
  165.         .R(0),
  166.         .S(0));
  167. endmodule
复制代码

[/url]

无标题.png (86.12 KB, 下载次数: 0)

无标题.png
此帖出自FPGA/CPLD论坛
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

6
 
  1. `timescale 1 ns/1 ns
  2. module mac_test
  3. (
  4. input                rst_n  ,
  5. input                push_button,   
  6. input [31:0]         pack_total_len,     
  7. input                gmii_tx_clk ,
  8. input                gmii_rx_clk ,
  9. input                gmii_rx_dv,
  10. input  [7:0]         gmii_rxd,
  11. output reg           gmii_tx_en,
  12. output reg [7:0]     gmii_txd
  13. );

  14. localparam UDP_WIDTH = 32 ;
  15. localparam UDP_DEPTH = 5 ;


  16. reg                  gmii_rx_dv_d0 ;
  17. reg   [7:0]          gmii_rxd_d0 ;
  18. wire                 gmii_tx_en_tmp ;
  19. wire   [7:0]         gmii_txd_tmp ;

  20. reg   [7:0]          ram_wr_data ;
  21. reg                  ram_wr_en ;
  22. wire                 udp_ram_data_req ;
  23. reg   [15:0]         udp_send_data_length ;

  24. wire  [7:0]          tx_ram_wr_data ;
  25. wire                 tx_ram_wr_en ;
  26. wire                 udp_tx_req ;
  27. wire                 arp_request_req ;
  28. wire                 mac_send_end ;
  29. reg                  write_end ;

  30. wire [7:0]           udp_rec_ram_rdata ;
  31. reg  [10:0]          udp_rec_ram_read_addr ;
  32. wire [15:0]          udp_rec_data_length ;
  33. wire                 udp_rec_data_valid ;

  34. wire                 udp_tx_end  ;
  35. wire                 almost_full ;

  36. reg                  udp_ram_wr_en ;
  37. reg                  udp_write_end ;
  38. wire                 write_ram_end ;
  39. reg  [31:0]          wait_cnt ;
  40. reg  [UDP_WIDTH-1:0]  udp_data [UDP_DEPTH-1:0];

  41. reg  [4:0] i;
  42. reg  [1:0] j ;

  43. reg  write_sel ;

  44. wire button_negedge ;

  45. wire mac_not_exist ;
  46. wire arp_found ;

  47. parameter IDLE          = 9'b000_000_001 ;
  48. parameter ARP_REQ       = 9'b000_000_010 ;
  49. parameter ARP_SEND      = 9'b000_000_100 ;
  50. parameter ARP_WAIT      = 9'b000_001_000 ;
  51. parameter GEN_REQ       = 9'b000_010_000 ;
  52. parameter WRITE_RAM     = 9'b000_100_000 ;
  53. parameter SEND          = 9'b001_000_000 ;
  54. parameter WAIT          = 9'b010_000_000 ;
  55. parameter CHECK_ARP     = 9'b100_000_000 ;


  56. reg [8:0]    state  ;
  57. reg [8:0]    next_state ;
  58. reg  [15:0]  ram_cnt ;
  59. reg    almost_full_d0 ;
  60. reg    almost_full_d1 ;
  61. always @(posedge gmii_tx_clk or negedge rst_n)
  62.   begin
  63.     if (~rst_n)
  64.       state  <=  IDLE  ;
  65.     else
  66.       state  <= next_state ;
  67.   end
  68.   
  69. always @(*)
  70.   begin
  71.     case(state)
  72.       IDLE        :
  73.         begin
  74.         if (wait_cnt == pack_total_len)   
  75.             next_state <= ARP_REQ ;
  76.           else
  77.             next_state <= IDLE ;
  78.         end

  79.       ARP_REQ     :
  80.         next_state <= ARP_SEND ;
  81.       ARP_SEND    :
  82.         begin
  83.           if (mac_send_end)
  84.             next_state <= ARP_WAIT ;
  85.           else
  86.             next_state <= ARP_SEND ;
  87.         end
  88.       ARP_WAIT    :
  89.         begin
  90.           if (arp_found)
  91.             next_state <= WAIT ;
  92.           else if (wait_cnt == pack_total_len)
  93.             next_state <= ARP_REQ ;
  94.           else
  95.             next_state <= ARP_WAIT ;
  96.         end
  97.       GEN_REQ     :
  98.         begin
  99.           if (udp_ram_data_req)
  100.             next_state <= WRITE_RAM ;
  101.           else
  102.             next_state <= GEN_REQ ;
  103.         end
  104.       WRITE_RAM   :
  105.         begin
  106.                   `ifdef TEST_SPEED
  107.                   if (ram_cnt == udp_send_data_length - 1)
  108.                   `else
  109.           if (write_ram_end)
  110.                   `endif
  111.             next_state <= WAIT     ;
  112.           else
  113.             next_state <= WRITE_RAM ;
  114.         end
  115.         
  116.       SEND        :
  117.         begin
  118.           if (udp_tx_end)
  119.             next_state <= WAIT ;
  120.           else
  121.             next_state <= SEND ;
  122.         end
  123.         
  124.       WAIT        :
  125.         begin
  126.                   `ifdef TEST_SPEED  
  127.           if (wait_cnt == 32'd90)             //frame gap
  128.                   `else
  129.                   if (wait_cnt == pack_total_len)
  130.                   `endif
  131.             next_state <= CHECK_ARP ;
  132.           else
  133.             next_state <= WAIT ;
  134.         end
  135.       CHECK_ARP   :
  136.         begin
  137.           if (mac_not_exist)
  138.             next_state <= ARP_REQ ;
  139.           else if (almost_full_d1)
  140.             next_state <= CHECK_ARP ;
  141.           else
  142.             next_state <= GEN_REQ ;
  143.         end
  144.       default     :
  145.         next_state <= IDLE ;
  146.     endcase
  147.   end
  148.   
  149.   
  150. assign write_ram_end        = (write_sel)? udp_write_end : write_end ;
  151. assign tx_ram_wr_data       = (write_sel)? udp_rec_ram_rdata : ram_wr_data ;
  152. assign tx_ram_wr_en         = (write_sel)? udp_ram_wr_en : ram_wr_en ;


  153. always@(posedge gmii_rx_clk or negedge rst_n)
  154.   begin
  155.     if(rst_n == 1'b0)
  156.       begin
  157.         gmii_rx_dv_d0 <= 1'b0 ;
  158.         gmii_rxd_d0   <= 8'd0 ;
  159.       end
  160.     else
  161.       begin
  162.         gmii_rx_dv_d0 <= gmii_rx_dv ;
  163.         gmii_rxd_d0   <= gmii_rxd ;
  164.       end
  165.   end
  166.   
  167. always@(posedge gmii_tx_clk or negedge rst_n)
  168.   begin
  169.     if(rst_n == 1'b0)
  170.       begin
  171.         gmii_tx_en <= 1'b0 ;
  172.         gmii_txd   <= 8'd0 ;
  173.       end
  174.     else
  175.       begin
  176.         gmii_tx_en <= gmii_tx_en_tmp ;
  177.         gmii_txd   <= gmii_txd_tmp ;
  178.       end
  179.   end



  180.   
  181. mac_top mac_top0
  182. (
  183. .gmii_tx_clk                 (gmii_tx_clk)                  ,
  184. .gmii_rx_clk                 (gmii_rx_clk)                  ,
  185. .rst_n                       (rst_n)  ,

  186. .source_mac_addr             (48'h00_0a_35_01_fe_c0)   ,       //source mac address
  187. .TTL                         (8'h80),
  188. .source_ip_addr              (32'hc0a80002),
  189. .destination_ip_addr         (32'hc0a80003),
  190. .udp_send_source_port        (16'h1f90),
  191. .udp_send_destination_port   (16'h1f90),

  192. .ram_wr_data                 (tx_ram_wr_data) ,
  193. .ram_wr_en                   (tx_ram_wr_en),
  194. .udp_ram_data_req            (udp_ram_data_req),
  195. .udp_send_data_length        (udp_send_data_length),
  196. .udp_tx_end                  (udp_tx_end                 ),
  197. .almost_full                 (almost_full                ),

  198. .udp_tx_req                  (udp_tx_req),
  199. .arp_request_req             (arp_request_req ),

  200. .mac_send_end                (mac_send_end),
  201. .mac_data_valid              (gmii_tx_en_tmp),
  202. .mac_tx_data                 (gmii_txd_tmp),
  203. .rx_dv                       (gmii_rx_dv_d0   ),
  204. .mac_rx_datain               (gmii_rxd_d0 ),

  205. .udp_rec_ram_rdata           (udp_rec_ram_rdata),
  206. .udp_rec_ram_read_addr       (udp_rec_ram_read_addr),
  207. .udp_rec_data_length         (udp_rec_data_length ),

  208. .udp_rec_data_valid          (udp_rec_data_valid),
  209. .arp_found                   (arp_found ),
  210. .mac_not_exist               (mac_not_exist )
  211. ) ;

  212.         
  213. ax_debounce ax0
  214. (
  215.   .clk(gmii_rx_clk),
  216.   .rst_n(rst_n),
  217.   .button_in(push_button),
  218.   .button_posedge(),
  219.   .button_negedge(button_negedge),
  220.   .button_out()
  221. );
  222.             
  223.             
  224. always @(*)
  225.   begin
  226.     udp_data[0] <={"H","E","L","L"};
  227.     udp_data[1] <={"O"," ","A","L"};
  228.     udp_data[2] <={"I","N","X"," "};
  229.     udp_data[3] <={"H","E","I","J"};
  230.     udp_data[4] <={"I","N","\r","\n"};
  231.    
  232.   end
  233.   
  234. //reg    almost_full_d0 ;
  235. //reg    almost_full_d1 ;
  236.   
  237. always@(posedge gmii_rx_clk or negedge rst_n)
  238.   begin
  239.     if(rst_n == 1'b0)
  240.       begin
  241.         almost_full_d0   <= 1'b0 ;
  242.         almost_full_d1   <= 1'b0 ;
  243.       end
  244.     else
  245.       begin
  246.         almost_full_d0   <= almost_full ;
  247.         almost_full_d1   <= almost_full_d0 ;
  248.       end
  249.   end

  250. always@(posedge gmii_rx_clk or negedge rst_n)
  251.   begin
  252.     if(rst_n == 1'b0)
  253.            udp_send_data_length <= 16'd0 ;
  254.     else if (write_sel)         
  255.                 udp_send_data_length <= udp_rec_data_length - 8  ;
  256.          else
  257.          `ifdef TEST_SPEED
  258.        udp_send_data_length <= 16'd1000 ;         
  259.          `else         
  260.            udp_send_data_length <= 4*UDP_DEPTH ;
  261.          `endif
  262.   end
  263.   
  264.   
  265. always@(posedge gmii_tx_clk or negedge rst_n)
  266.   begin
  267.     if(rst_n == 1'b0)
  268.       write_sel <= 1'b0 ;
  269.     else if (state == WAIT)
  270.       begin
  271.         if (udp_rec_data_valid)
  272.           write_sel <= 1'b1 ;
  273.         else
  274.           write_sel <= 1'b0 ;
  275.       end
  276.   end
  277.   
  278. assign udp_tx_req    = (state == GEN_REQ) ;
  279. assign arp_request_req  = (state == ARP_REQ) ;

  280. always@(posedge gmii_tx_clk or negedge rst_n)
  281.   begin
  282.     if(rst_n == 1'b0)
  283.       wait_cnt <= 0 ;
  284.     else if ((state==IDLE||state == WAIT || state == ARP_WAIT) && state != next_state)
  285.       wait_cnt <= 0 ;
  286.     else if (state==IDLE||state == WAIT || state == ARP_WAIT)
  287.       wait_cnt <= wait_cnt + 1'b1 ;
  288.          else
  289.            wait_cnt <= 0 ;
  290.   end
  291.   

  292. `ifdef TEST_SPEED
  293. /*************************************************************/
  294. //Test ethernet speed
  295. //reg  [15:0]     ram_cnt ;
  296. always@(posedge gmii_tx_clk or negedge rst_n)
  297. begin
  298.    if(rst_n == 1'b0)
  299.      ram_cnt <= 11'd0 ;
  300.    else if (state == WRITE_RAM)
  301.      ram_cnt <= ram_cnt + 1'b1 ;
  302.    else
  303.      ram_cnt <= 11'd0 ;
  304. end

  305. always@(posedge gmii_tx_clk or negedge rst_n)
  306. begin
  307.    if(rst_n == 1'b0)
  308.      ram_wr_en <= 1'b0 ;
  309.    else if (state == WRITE_RAM)
  310.      ram_wr_en <= 1'b1 ;
  311.    else
  312.      ram_wr_en <= 1'b0 ;
  313. end  


  314. always@(posedge gmii_tx_clk or negedge rst_n)
  315. begin
  316.    if(rst_n == 1'b0)
  317.      ram_wr_data <= 8'd0 ;
  318.    else if (state == WRITE_RAM)
  319.      ram_wr_data <= ram_cnt[7:0] ;
  320.    else
  321.      ram_wr_data <= 8'd0 ;
  322. end  
  323. /*************************************************************/
  324. `else
  325. always@(posedge gmii_tx_clk or negedge rst_n)
  326.   begin
  327.     if(rst_n == 1'b0)
  328.       begin
  329.         write_end  <= 1'b0;
  330.         ram_wr_data <= 0;
  331.         ram_wr_en  <= 0 ;
  332.         i <= 0 ;
  333.         j <= 0 ;
  334.       end
  335.     else if (state == WRITE_RAM)
  336.       begin
  337.         if(i == 5)
  338.           begin
  339.             ram_wr_en <=1'b0;
  340.             write_end <= 1'b1;
  341.           end
  342.         else
  343.           begin
  344.             ram_wr_en <= 1'b1 ;
  345.             write_end <= 1'b0 ;
  346.             j <= j + 1'b1 ;
  347.             case(j)
  348.               2'd0    :  ram_wr_data <= udp_data[i][31:24] ;
  349.               2'd1    :  ram_wr_data <= udp_data[i][23:16] ;
  350.               2'd2    :  ram_wr_data <= udp_data[i][15:8] ;
  351.               2'd3    :  ram_wr_data <= udp_data[i][7:0] ;
  352.               default :  ram_wr_data <= 8'h00 ;
  353.             endcase
  354.             
  355.             if (j == 3)
  356.               begin
  357.                 j <= 0 ;
  358.                 i <= i + 1'b1;
  359.               end
  360.           end
  361.       end
  362.     else
  363.       begin
  364.         write_end  <= 1'b0;
  365.         ram_wr_data <= 0;
  366.         ram_wr_en  <= 0 ;
  367.         i <= 0 ;
  368.         j <= 0 ;
  369.       end
  370.   end
  371. `endif
  372.   
  373. //send udp received data to udp tx ram
  374. always@(posedge gmii_tx_clk or negedge rst_n)
  375.   begin
  376.     if(rst_n == 1'b0)
  377.       udp_rec_ram_read_addr <= 11'd0 ;
  378.     else if (state == WRITE_RAM)
  379.       udp_rec_ram_read_addr <= udp_rec_ram_read_addr + 1'b1 ;
  380.     else
  381.       udp_rec_ram_read_addr <= 11'd0 ;
  382.   end
  383.   
  384. always@(posedge gmii_tx_clk or negedge rst_n)
  385.   begin
  386.     if(rst_n == 1'b0)
  387.       udp_ram_wr_en <= 1'b0 ;
  388.     else if (state == WRITE_RAM && udp_rec_ram_read_addr < udp_rec_data_length - 8)
  389.       udp_ram_wr_en <= 1'b1 ;
  390.     else
  391.       udp_ram_wr_en <= 1'b0 ;
  392.   end
  393.   
  394. always@(posedge gmii_tx_clk or negedge rst_n)
  395.   begin
  396.     if(rst_n == 1'b0)
  397.       udp_write_end <= 1'b0 ;
  398.     else if (state == WRITE_RAM && udp_rec_ram_read_addr == udp_rec_data_length - 8)
  399.       udp_write_end <= 1'b1 ;
  400.     else
  401.       udp_write_end <= 1'b0 ;
  402.   end
  403.   
  404.   
  405. endmodule
复制代码



此帖出自FPGA/CPLD论坛
 
 
 

回复

935

帖子

1

TA的资源

禁止发言

7
 
此帖出自FPGA/CPLD论坛
个人签名存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

8
 
  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //Module Name : mac_rx
  3. //Description : This module is used to receive MAC layer data and verify CRC
  4. //
  5. //////////////////////////////////////////////////////////////////////////////////////
  6. `timescale 1 ns/1 ns
  7. module mac_rx
  8. (
  9. input                  clk,   
  10. input                  rst_n,   

  11. input                  rx_dv,
  12. input              [7:0]   mac_rx_datain,

  13. input              [31:0]         crc_result ,      
  14. output reg             crcen,         
  15. output reg             crcre,
  16. output reg            [7:0]   crc_din,

  17. input                  checksum_err,     //checksum error from IP layer

  18. input                  ip_rx_end,        //ip receive end
  19. input                  arp_rx_end,       //arp receive end
  20. output reg             ip_rx_req,        //ip rx request
  21. output reg             arp_rx_req,       //arp rx request

  22. output     [7:0]       mac_rx_dataout,
  23. output reg             mac_rec_error ,

  24. output reg [47:0]      mac_rx_destination_mac_addr,
  25. output reg [47:0]      mac_rx_source_mac_addr
  26. );

  27. reg [4:0]               mac_rx_cnt       ;
  28. reg [15:0]              mac_crc_cnt      ;

  29. reg [63:0]              preamble         ;           
  30. reg [3:0]               preamble_cnt     ;
  31.            
  32. reg [15:0]              frame_type       ;   //type 16'h0800 IP; 16'h0806 ARP

  33.            
  34. wire                    rx_dv_posedge    ;
  35. reg                     rx_dv_d0         ;
  36. reg                     rx_dv_d1         ;
  37.       
  38. reg [7:0]               mac_rx_data_d0   ;
  39. reg [7:0]               mac_rx_data_d1   ;
  40. reg [7:0]               mac_rx_data_d2   ;
  41.       
  42. wire                    mac_rx_head_end  ;
  43.       
  44. reg  [15:0]             timeout          ;
  45.       
  46. reg  [31:0]             crc              ;
  47. reg  [31:0]             crc_check        ;
  48. reg                     crc_error        ;
  49. reg  [31:0]             crc_rec          ;
  50. reg         [31:0]                            crc_result_d0   ;

  51. //MAC receive FSM
  52. parameter IDLE                =  8'b0000_0001 ;
  53. parameter REC_PREAMBLE        =  8'b0000_0010 ;
  54. parameter REC_MAC_HEAD        =  8'b0000_0100 ;
  55. parameter REC_IDENTIFY        =  8'b0000_1000 ;
  56. parameter REC_DATA            =  8'b0001_0000 ;
  57. parameter REC_CRC             =  8'b0010_0000 ;
  58. parameter REC_ERROR           =  8'b0100_0000 ;
  59. parameter REC_END             =  8'b1000_0000 ;

  60. reg [7:0]     rec_state      ;
  61. reg [7:0]     rec_next_state ;

  62. always @(posedge clk or negedge rst_n)
  63. begin
  64.   if (~rst_n)
  65.     rec_state <= IDLE ;
  66.   else
  67.     rec_state <= rec_next_state ;
  68. end

  69. always @(*)
  70. begin
  71.     case(rec_state)
  72.          IDLE            :  begin
  73.                               if (rx_dv_posedge == 1'b1)
  74.                                                                                                         rec_next_state <= REC_PREAMBLE ;
  75.                                                                                         else
  76.                                                                                                         rec_next_state <= IDLE ;
  77.                             end
  78.          REC_PREAMBLE    :  begin
  79.                                                                                                 if (mac_rx_cnt == 7)
  80.                                                                                                         rec_next_state <=  REC_MAC_HEAD  ;
  81.                                                                                                 else
  82.                                                                                                         rec_next_state <=  REC_PREAMBLE    ;
  83.                                                                                         end

  84.          REC_MAC_HEAD    : begin
  85.                                                                                                 if (preamble != 64'h55_55_55_55_55_55_55_d5)
  86.                                                                                                   rec_next_state <= REC_ERROR ;
  87.                                                                                                 else if ( mac_rx_cnt == 16'd21)
  88.                                                                                                         rec_next_state <= REC_IDENTIFY ;
  89.                                                                                                 else
  90.                                                                                                         rec_next_state <= REC_MAC_HEAD ;
  91.                                                                                  end
  92.          REC_IDENTIFY    : begin
  93.                               if (frame_type == 16'h0800 || frame_type == 16'h0806)
  94.                                                                                                         rec_next_state <= REC_DATA ;
  95.                                                                                                 else
  96.                                                                                                         rec_next_state <= REC_ERROR ;
  97.                                                                                  end
  98.          REC_DATA        : begin
  99.                               if (checksum_err)
  100.                                                                                                         rec_next_state <= REC_ERROR ;
  101.                                                                                                 else if (ip_rx_end|arp_rx_end)
  102.                                                                                                         rec_next_state <= REC_CRC ;
  103.                                                                                                 else if (timeout == 16'hffff)
  104.                                                                                                         rec_next_state <= REC_ERROR ;
  105.                                                                                                 else
  106.                                rec_next_state <= REC_DATA ;
  107.                                                                                  end                                                           
  108.          REC_CRC         : begin
  109.                                                                                                 if (crc_error)
  110.                                                                                                         rec_next_state <= REC_ERROR ;
  111.                                                                                                 else if (mac_rx_cnt == 7)
  112.                                                                                                         rec_next_state <= REC_END ;
  113.                                                                                                 else
  114.                                                                                                         rec_next_state <= REC_CRC ;
  115.                                                                                         end
  116.          REC_ERROR      :                         rec_next_state <= IDLE  ;
  117.          REC_END        :                         rec_next_state <= IDLE  ;
  118.          default        :                         rec_next_state <= IDLE  ;
  119.          endcase
  120. end




  121. assign mac_rx_dataout  = mac_rx_data_d2 ;                                //
  122. assign rx_dv_posedge   = ~rx_dv_d0 & rx_dv ;

  123. always @(posedge clk or negedge rst_n)
  124. begin
  125.   if (~rst_n)
  126.   begin
  127.     crcen <=         1'b0 ;
  128.                 crcre <= 1'b1 ;
  129.                 crc_din <= 8'd0 ;
  130.   end
  131.   else if (rec_state == REC_MAC_HEAD || rec_state == REC_IDENTIFY || rec_state == REC_DATA)
  132.   begin
  133.     crcen <=         1'b1 ;
  134.                 crcre <=         1'b0 ;
  135.                 crc_din <= mac_rx_data_d0 ;
  136.   end
  137.   else
  138.   begin
  139.     crcen <=         1'b0 ;
  140.                 crcre <= 1'b1 ;
  141.                 crc_din <= 8'd0 ;
  142.   end
  143. end


  144. always @(posedge clk or negedge rst_n)
  145. begin
  146.   if (~rst_n)
  147.     ip_rx_req <=         1'b0 ;
  148.   else if (rec_state == REC_IDENTIFY &&  frame_type == 16'h0800)
  149.     ip_rx_req <=  1'b1 ;
  150.   else
  151.     ip_rx_req <=  1'b0 ;
  152. end

  153. always @(posedge clk or negedge rst_n)
  154. begin
  155.   if (~rst_n)
  156.     arp_rx_req <=         1'b0 ;
  157.   else if (rec_state == REC_IDENTIFY &&  frame_type == 16'h0806)
  158.     arp_rx_req <=          1'b1 ;
  159.   else
  160.     arp_rx_req <=          1'b0 ;
  161. end

  162. //rx dv and rx data resigster
  163. always @(posedge clk or negedge rst_n)
  164. begin
  165.   if (~rst_n)
  166.   begin
  167.     rx_dv_d0       <= 1'b0 ;
  168.                 rx_dv_d1       <= 1'b0 ;
  169.     mac_rx_data_d0 <= 8'd0 ;
  170.                 mac_rx_data_d1 <= 8'd0 ;
  171.                 mac_rx_data_d2 <= 8'd0 ;
  172.   end
  173.   else
  174.   begin
  175.                 rx_dv_d0                       <= rx_dv ;
  176.                 rx_dv_d1                <= rx_dv_d0 ;
  177.                 mac_rx_data_d0                 <= mac_rx_datain ;
  178.                 mac_rx_data_d1                 <= mac_rx_data_d0 ;
  179.                 mac_rx_data_d2                 <= mac_rx_data_d1 ;
  180.   end
  181. end
  182. //timeout
  183. always @(posedge clk or negedge rst_n)
  184. begin
  185.   if (~rst_n)
  186.     timeout <= 16'd0 ;
  187.   else if (rec_state == REC_DATA)
  188.     timeout <= timeout + 1'b1 ;
  189.   else
  190.     timeout <= 16'd0 ;
  191. end

  192. always @(posedge clk or negedge rst_n)
  193. begin
  194.   if (~rst_n)
  195.     mac_rx_cnt <= 5'd0 ;
  196.   else if (rec_state == REC_PREAMBLE || rec_state == REC_MAC_HEAD || rec_state == REC_CRC)
  197.     mac_rx_cnt <= mac_rx_cnt + 1'b1 ;
  198.   else
  199.     mac_rx_cnt <= 5'd0 ;
  200. end

  201. always @(posedge clk or negedge rst_n)
  202. begin
  203.   if (~rst_n)
  204.     mac_crc_cnt <= 16'd0 ;
  205.   else if (rx_dv_d1)
  206.     mac_crc_cnt <= mac_crc_cnt + 1'b1 ;
  207.   else
  208.     mac_crc_cnt <= 16'd0 ;
  209. end

  210. always @(posedge clk or negedge rst_n)
  211. begin
  212.   if (~rst_n)
  213.     mac_rec_error <= 1'b0 ;
  214.   else if (rx_dv_posedge)
  215.     mac_rec_error <= 1'b0 ;
  216.   else if (rec_state == REC_ERROR)
  217.     mac_rec_error <= 1'b1 ;
  218. end

  219. always @(posedge clk or negedge rst_n)
  220. begin
  221.   if (~rst_n)
  222.     crc <= 32'd0 ;
  223.   else if (crcen)
  224.     crc <= crc_result_d0 ;
  225. end

  226. always @(posedge clk or negedge rst_n)
  227. begin
  228.   if (~rst_n)
  229.     crc_result_d0 <= 32'd0 ;
  230.   else
  231.     crc_result_d0 <= crc_result ;
  232. end


  233. always @(posedge clk or negedge rst_n)
  234. begin
  235.   if (~rst_n)
  236.     crc_check <= 32'd0 ;
  237.   else if (rec_state == REC_CRC)
  238.   begin
  239.     case(mac_rx_cnt)
  240.       5'd1  :  crc_check[31:24] <= {~crc[24], ~crc[25], ~crc[26], ~crc[27], ~crc[28], ~crc[29], ~crc[30], ~crc[31]} ;
  241.       5'd2  :  crc_check[23:16] <= {~crc[16], ~crc[17], ~crc[18], ~crc[19], ~crc[20], ~crc[21], ~crc[22], ~crc[23]} ;
  242.       5'd3  :  crc_check[15:8]  <= {~crc[8], ~crc[9], ~crc[10], ~crc[11], ~crc[12], ~crc[13], ~crc[14], ~crc[15]}   ;
  243.       5'd4  :  crc_check[7:0]   <= {~crc[0], ~crc[1], ~crc[2], ~crc[3], ~crc[4], ~crc[5], ~crc[6], ~crc[7]}   ;
  244.     default :  crc_check <= crc_check ;
  245.     endcase
  246.   end
  247.   else
  248.     crc_check <= 32'd0 ;
  249. end
  250. //received crc data
  251. always @(posedge clk or negedge rst_n)
  252. begin
  253.   if (~rst_n)
  254.     crc_rec  <= 48'd0 ;
  255.   else if (rec_state == REC_CRC)
  256.   begin
  257.     case(mac_rx_cnt)
  258.                         5'd0   : crc_rec[31:24]      <= mac_rx_data_d2 ;
  259.       5'd1   : crc_rec[23:16]      <= mac_rx_data_d2 ;
  260.       5'd2   : crc_rec[15:8]       <= mac_rx_data_d2 ;
  261.       5'd3   : crc_rec[7:0]        <= mac_rx_data_d2 ;
  262.       default : crc_rec             <= crc_rec     ;
  263.     endcase
  264.   end
  265.   else
  266.     crc_rec <= crc_rec ;
  267. end
  268. //check crc
  269. always @(posedge clk or negedge rst_n)
  270. begin
  271.   if (~rst_n)
  272.     crc_error <= 1'b0 ;
  273.   else if (rec_state == REC_CRC && mac_rx_cnt == 5)
  274.   begin
  275.     if (crc_check == crc_rec)
  276.        crc_error <= 1'b0 ;
  277.          else
  278.             crc_error <= 1'b1 ;
  279.   end
  280.   else
  281.     crc_error <= 1'b0 ;
  282. end


  283. always @(posedge clk or negedge rst_n)
  284. begin
  285.   if (~rst_n)
  286.     preamble_cnt  <= 4'd0 ;
  287.   else if (rx_dv)
  288.   begin
  289.     if (preamble_cnt < 8)
  290.       preamble_cnt <= preamble_cnt + 1'b1 ;
  291.   end
  292.   else
  293.     preamble_cnt <= 4'd0 ;
  294. end


  295. always @(posedge clk or negedge rst_n)
  296. begin
  297.   if (~rst_n)
  298.     preamble  <= 64'd0 ;
  299.   else if (rx_dv)
  300.   begin
  301.     if (preamble_cnt == 4'd0)
  302.       preamble[63:56] <= mac_rx_datain ;
  303.     if (preamble_cnt == 4'd1)
  304.       preamble[55:48] <= mac_rx_datain ;
  305.     if (preamble_cnt == 4'd2)
  306.       preamble[47:40] <= mac_rx_datain ;
  307.     if (preamble_cnt == 4'd3)
  308.       preamble[39:32] <= mac_rx_datain ;
  309.     if (preamble_cnt == 4'd4)
  310.       preamble[31:24] <= mac_rx_datain ;
  311.     if (preamble_cnt == 4'd5)
  312.       preamble[23:16] <= mac_rx_datain ;
  313.     if (preamble_cnt == 4'd6)
  314.       preamble[15:8] <= mac_rx_datain ;
  315.     if (preamble_cnt == 4'd7)
  316.       preamble[7:0] <= mac_rx_datain ;
  317.   end
  318.   else
  319.     preamble <= 64'd0 ;
  320. end   

  321. always @(posedge clk or negedge rst_n)
  322. begin
  323.   if (~rst_n)
  324.     mac_rx_destination_mac_addr  <= 48'd0 ;
  325.   else if (rec_state == REC_MAC_HEAD)
  326.   begin
  327.     case(mac_rx_cnt)
  328.       5'd8           : mac_rx_destination_mac_addr[47:40] <= mac_rx_data_d0 ;
  329.       5'd9    : mac_rx_destination_mac_addr[39:32] <= mac_rx_data_d0 ;
  330.       5'd10   : mac_rx_destination_mac_addr[31:24] <= mac_rx_data_d0 ;
  331.       5'd11   : mac_rx_destination_mac_addr[23:16] <= mac_rx_data_d0 ;
  332.       5'd12   : mac_rx_destination_mac_addr[15:8]  <= mac_rx_data_d0 ;
  333.       5'd13          : mac_rx_destination_mac_addr[7:0]   <= mac_rx_data_d0 ;
  334.       default : mac_rx_destination_mac_addr <= mac_rx_destination_mac_addr ;
  335.          endcase
  336.   end
  337.   else
  338.     mac_rx_destination_mac_addr <= mac_rx_destination_mac_addr ;
  339. end

  340. always @(posedge clk or negedge rst_n)
  341. begin
  342.   if (~rst_n)
  343.     mac_rx_source_mac_addr  <= 48'd0 ;
  344.   else if (rec_state == REC_MAC_HEAD)
  345.   begin
  346.     case(mac_rx_cnt)
  347.       5'd14   : mac_rx_source_mac_addr[47:40]      <= mac_rx_data_d0 ;
  348.       5'd15   : mac_rx_source_mac_addr[39:32]      <= mac_rx_data_d0 ;
  349.       5'd16   : mac_rx_source_mac_addr[31:24]      <= mac_rx_data_d0 ;
  350.       5'd17   : mac_rx_source_mac_addr[23:16]      <= mac_rx_data_d0 ;
  351.       5'd18  : mac_rx_source_mac_addr[15:8]       <= mac_rx_data_d0 ;
  352.       5'd19  : mac_rx_source_mac_addr[7:0]        <= mac_rx_data_d0 ;
  353.                 default : mac_rx_source_mac_addr             <= mac_rx_source_mac_addr ;
  354.          endcase
  355.   end
  356.   else
  357.     mac_rx_source_mac_addr <= mac_rx_source_mac_addr ;
  358. end

  359. always @(posedge clk or negedge rst_n)
  360. begin
  361.   if (~rst_n)
  362.     frame_type  <= 16'd0 ;
  363.   else if (rec_state == REC_MAC_HEAD)
  364.   begin
  365.     case(mac_rx_cnt)
  366.                         5'd20  : frame_type[15:8]                   <= mac_rx_data_d0 ;
  367.       5'd21  : frame_type[7:0]                    <= mac_rx_data_d0 ;
  368.       default : frame_type                         <= frame_type     ;
  369.     endcase
  370.   end
  371.   else
  372.     frame_type <= frame_type ;
  373. end

  374. ila_0 I_ila_0(
  375.         .clk                        (clk                                                        ),                // 01 bit
  376.         .probe0                        (rx_dv                                                        ),      // 01 bit
  377.         .probe1                        (mac_rx_datain                                        ),      // 08 bit
  378.         .probe2                        (crc_result                                                ),      // 32 bit
  379.         .probe3                        (ip_rx_end                                                ),      // 01 bit
  380.         .probe4                        (ip_rx_req                                                ),      // 01 bit
  381.         .probe5                        (arp_rx_end                                                ),      // 01 bit
  382.         .probe6                        (arp_rx_req                                                ),      // 01 bit
  383.         .probe7                        (mac_rx_dataout                                        ),      // 08 bit
  384.         .probe8                        (mac_rx_destination_mac_addr        ),      // 48 bit
  385.         .probe9                        (mac_rx_source_mac_addr                        ),      // 48 bit
  386.         .probe10                (preamble                                                ),      // 64 bit
  387.         .probe11                (rx_dv_d0                                                ),      // 01 bit
  388.         .probe12                (rx_dv_d1                                                ),      // 01 bit
  389.         .probe13                (mac_rx_data_d0                                        ),      // 08 bit
  390.         .probe14                (mac_rx_data_d1                                        ),      // 08 bit
  391.         .probe15                (mac_rx_cnt                                                ),      // 05 bit
  392.         .probe16                (rec_state                                                )       // 08 bit
  393. );

  394. endmodule
复制代码



此帖出自FPGA/CPLD论坛
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

9
 
这是通过ILA进行跟踪的波形图

mac_rx_01.png (74.98 KB, 下载次数: 0)

mac_rx_01.png

mac_rx_02.png (75.57 KB, 下载次数: 0)

mac_rx_02.png

mac_rx_03.png (73.91 KB, 下载次数: 0)

mac_rx_03.png

mac_rx_04.png (71.99 KB, 下载次数: 0)

mac_rx_04.png
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

10
 

很牛逼,受教了

此帖出自FPGA/CPLD论坛

点评

后边可能就不更新了,如果想了解,而且有条件,就自己买个板子吧!  详情 回复 发表于 2019-6-20 10:59
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

11
 

后边可能就不更新了,如果想了解,而且有条件,就自己买个板子吧!

此帖出自FPGA/CPLD论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 

您好 我想向您咨询一下千兆网代码的事情 非常着急可以加一下联系方式么 我的Q 635775767 万分感谢

此帖出自FPGA/CPLD论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 

您好,我想请问一下这是黑金哪个例程?最近在做gmii和rgmii相关的试验

此帖出自FPGA/CPLD论坛

点评

网络测试  详情 回复 发表于 2019-12-2 08:58
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

14
 
BHang03 发表于 2019-12-2 00:42 您好,我想请问一下这是黑金哪个例程?最近在做gmii和rgmii相关的试验

网络测试

此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表