原语笔记:A7系列的BUFR和BUFG资源与以太网DPHY

因为A7系列的资源问题,使用BUFR容易出现以下错误,请换成BUFG。

我发现我的开发板做了等长,不用Idelay也能正常采样,所以不需要做。

 

module rgmii_dphy (
    input   wire            sys_rst_n      ,
    //eth 
    input   wire            i_eth_rxc      ,//eth rx clk
    input   wire            i_eth_rx_ctl   ,
    input   wire    [3:0]   i_eth_rxd      ,

    output  wire            o_eth_rx_clk   ,
    output  wire            o_eth_rx_vaild ,
    output  wire    [7:0]   o_eth_rx_data   
);
///////////////////////////////////////////////////////////////////////////
            //BUFIO
            wire            rxc_bufio      ;
            //BUFR          
            wire            rxc_bufg       ;  
            //IBUF
            wire    [3:0]   eth_rxd_buf    ;
            wire            eth_rx_ctl_buf ;

            wire    [7:0]   eth_rxd_data   ;
            wire            eth_rxd_vaild  ;//enable
            wire            eth_rx_error   ;

            reg             r1_eth_rx_vaild;
            reg     [7:0]   r1_eth_rx_data ;
///////////////////////////////////////////////////////////////////////////

   assign   o_eth_rx_clk   = rxc_bufg       ;
   assign   o_eth_rx_vaild = r1_eth_rx_vaild;
   assign   o_eth_rx_data  = r1_eth_rx_data ;
   
   always @(posedge rxc_bufg or negedge sys_rst_n) begin
      if(sys_rst_n == 1'b0) begin
         r1_eth_rx_vaild  <= 1'd0; 
         r1_eth_rx_data   <= 8'd0;  
      end else if(eth_rxd_vaild == 1'b1) begin
         r1_eth_rx_vaild  <= eth_rxd_vaild;
         r1_eth_rx_data   <= eth_rxd_data ;
      end else begin
         r1_eth_rx_vaild  <= 1'd0; 
         r1_eth_rx_data   <= 8'd0;  
      end
   end

///////////////////////////////////////////////////////////////////////////
   BUFIO BUFIO_inst_0 (
      .O( rxc_bufio  ), // 1-bit output: Clock output (connect to I/O clock loads).
      .I( i_eth_rxc  )  // 1-bit input: Clock input (connect to an IBUF or BUFMR).
   );

   BUFG BUFG_inst (
      .O( rxc_bufg   ), // 1-bit output: Clock output
      .I( i_eth_rxc  )  // 1-bit input: Clock input
   );

///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
generate
   genvar rxd_i;
      for(rxd_i = 0;rxd_i < 4;rxd_i = rxd_i + 1)begin:iddr_block
         IBUF #(
            .IBUF_LOW_PWR( "TRUE"    ),// Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
            .IOSTANDARD  ( "DEFAULT" ) // Specify the input I/O standard
         ) IBUF_inst (
            .O( eth_rxd_buf[rxd_i] ),  // Buffer output
            .I( i_eth_rxd[rxd_i]     ) // Buffer input (connect directly to top-level port)
         );

         IDDR #(
            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                          //    or "SAME_EDGE_PIPELINED" 
            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
         ) IDDR_inst (
            .Q1 ( eth_rxd_data[rxd_i]   ), // 1-bit output for positive edge of clock
            .Q2 ( eth_rxd_data[rxd_i+4] ), // 1-bit output for negative edge of clock
            .C  ( rxc_bufio             ), // 1-bit clock input
            .CE ( 1'b1                  ), // 1-bit clock enable input
            .D  ( eth_rxd_buf[rxd_i]    ), // 1-bit DDR data input
            .R  ( 1'b0                  ), // 1-bit reset
            .S  ( 1'b0                  )  // 1-bit set
         );
   end
endgenerate

// ctrl
   IBUF #(
      .IBUF_LOW_PWR("TRUE"),     // Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
      .IOSTANDARD("DEFAULT")     // Specify the input I/O standard
   ) IBUF_inst_Ctrl (
      .O( eth_rx_ctl_buf     ),  // Buffer output
      .I( i_eth_rx_ctl       )   // Buffer input (connect directly to top-level port)
   );
   IDDR #(
      .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                      //    or "SAME_EDGE_PIPELINED" 
      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) IDDR_inst_Ctrl (
      .Q1 ( eth_rxd_vaild  ), // 1-bit output for positive edge of clock
      .Q2 ( eth_rx_error   ), // 1-bit output for negative edge of clock
      .C  ( rxc_bufio      ), // 1-bit clock input
      .CE ( 1'b1           ), // 1-bit clock enable input
      .D  ( eth_rx_ctl_buf ), // 1-bit DDR data input
      .R  ( 1'b0           ), // 1-bit reset
      .S  ( 1'b0           )  // 1-bit set
   );
///////////////////////////////////////////////////////////////////////////

endmodule

 

posted @ 2024-03-29 22:11  NoNounknow  阅读(238)  评论(0)    收藏  举报