原语笔记: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

浙公网安备 33010602011771号