utiil_gmii_to_rgmii: registerd Rx/ Tx paths. Changed RX clock buffers to a single BUFG
parent
49f50829fa
commit
27afec5f9e
|
@ -103,13 +103,8 @@ module util_gmii_to_rgmii (
|
|||
wire clk_100msps;
|
||||
wire [ 3:0] rgmii_rd_delay;
|
||||
wire [ 7:0] gmii_rxd_s;
|
||||
wire [ 3:0] gmii_txd_low;
|
||||
wire rgmii_rx_ctl_delay;
|
||||
wire gmii_rx_er_s;
|
||||
wire rgmii_rxc_s;
|
||||
wire rgmii_rx_ctl_clk_s;
|
||||
wire rgmii_rx_ctl_s;
|
||||
wire rgmii_rxc_bufmr;
|
||||
|
||||
wire [ 1:0] speed_selection; // 1x gigabit, 01 100Mbps, 00 10mbps
|
||||
wire duplex_mode; // 1 full, 0 half
|
||||
|
@ -118,30 +113,45 @@ module util_gmii_to_rgmii (
|
|||
reg tx_reset_d1;
|
||||
reg tx_reset_sync;
|
||||
reg rx_reset_d1;
|
||||
reg rx_reset_sync;
|
||||
reg [ 7:0] gmii_txd_r;
|
||||
reg gmii_tx_en_r;
|
||||
reg gmii_tx_er_r;
|
||||
reg [ 7:0] gmii_txd_r_d1;
|
||||
reg gmii_tx_en_r_d1;
|
||||
reg gmii_tx_er_r_d1;
|
||||
|
||||
reg rgmii_tx_ctl_r;
|
||||
reg [ 3:0] gmii_txd_low;
|
||||
reg gmii_col;
|
||||
reg gmii_crs;
|
||||
|
||||
reg [ 7:0] gmii_rxd;
|
||||
reg gmii_rx_dv;
|
||||
reg gmii_rx_er;
|
||||
|
||||
// assignments
|
||||
assign gigabit = speed_selection [1];
|
||||
|
||||
assign gmii_tx_clk = gmii_tx_clk_s;
|
||||
assign rgmii_tx_ctl_r = gmii_tx_en_r ^ gmii_tx_er_r;
|
||||
assign gmii_txd_low = gigabit ? gmii_txd_r[7:4] : gmii_txd_r[3:0];
|
||||
assign gmii_col = duplex_mode ? 1'b0 : (gmii_tx_en_r | gmii_tx_er_r) & ( gmii_rx_dv_s | gmii_rx_er_s) ;
|
||||
assign gmii_crs = duplex_mode ? 1'b0 : (gmii_tx_en_r | gmii_tx_er_r | gmii_rx_dv_s | gmii_rx_er_s);
|
||||
|
||||
assign gmii_rxd = gmii_rxd_s;
|
||||
assign gmii_rx_dv = gmii_rx_dv_s;
|
||||
assign gmii_rx_er = gmii_rx_er_s;
|
||||
assign gmii_rx_er_s = gmii_rx_dv_s ^ rgmii_rx_ctl_s;
|
||||
always @(posedge gmii_rx_clk)
|
||||
begin
|
||||
gmii_rxd = gmii_rxd_s;
|
||||
gmii_rx_dv = gmii_rx_dv_s;
|
||||
gmii_rx_er = gmii_rx_dv_s ^ rgmii_rx_ctl_s;
|
||||
end
|
||||
|
||||
always @(posedge gmii_tx_clk_s) begin
|
||||
tx_reset_d1 <= reset;
|
||||
tx_reset_sync <= tx_reset_d1;
|
||||
end
|
||||
|
||||
always @(posedge gmii_tx_clk_s)
|
||||
begin
|
||||
rgmii_tx_ctl_r = gmii_tx_en_r ^ gmii_tx_er_r;
|
||||
gmii_txd_low = gigabit ? gmii_txd_r[7:4] : gmii_txd_r[3:0];
|
||||
gmii_col = duplex_mode ? 1'b0 : (gmii_tx_en_r| gmii_tx_er_r) & ( gmii_rx_dv | gmii_rx_er) ;
|
||||
gmii_crs = duplex_mode ? 1'b0 : (gmii_tx_en_r| gmii_tx_er_r| gmii_rx_dv | gmii_rx_er);
|
||||
end
|
||||
|
||||
always @(posedge gmii_tx_clk_s) begin
|
||||
if (tx_reset_sync == 1'b1) begin
|
||||
gmii_txd_r <= 8'h0;
|
||||
|
@ -153,6 +163,9 @@ module util_gmii_to_rgmii (
|
|||
gmii_txd_r <= gmii_txd;
|
||||
gmii_tx_en_r <= gmii_tx_en;
|
||||
gmii_tx_er_r <= gmii_tx_er;
|
||||
gmii_txd_r_d1 <= gmii_txd_r;
|
||||
gmii_tx_en_r_d1 <= gmii_tx_en_r;
|
||||
gmii_tx_er_r_d1 <= gmii_tx_er_r;
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -201,7 +214,7 @@ module util_gmii_to_rgmii (
|
|||
.Q (rgmii_td[i]),
|
||||
.C (gmii_tx_clk_s),
|
||||
.CE(1),
|
||||
.D1(gmii_txd_r[i]),
|
||||
.D1(gmii_txd_r_d1[i]),
|
||||
.D2(gmii_txd_low[i]),
|
||||
.R(tx_reset_sync),
|
||||
.S(0));
|
||||
|
@ -214,41 +227,13 @@ module util_gmii_to_rgmii (
|
|||
.Q (rgmii_tx_ctl),
|
||||
.C (gmii_tx_clk_s),
|
||||
.CE(1),
|
||||
.D1(gmii_tx_en_r),
|
||||
.D1(gmii_tx_en_r_d1),
|
||||
.D2(rgmii_tx_ctl_r),
|
||||
.R(tx_reset_sync),
|
||||
.S(0));
|
||||
|
||||
|
||||
always @(posedge rgmii_rxc_s) begin
|
||||
rx_reset_d1 <= reset;
|
||||
rx_reset_sync <= rx_reset_d1;
|
||||
end
|
||||
|
||||
BUFMR bufmr_rgmii_rxc(
|
||||
BUFG bufmr_rgmii_rxc(
|
||||
.I(rgmii_rxc),
|
||||
.O(rgmii_rxc_bufmr));
|
||||
|
||||
BUFR #(
|
||||
.SIM_DEVICE("7SERIES"),
|
||||
.BUFR_DIVIDE(1)
|
||||
) bufr_rgmii_rx_clk (
|
||||
.I(rgmii_rxc_bufmr),
|
||||
.CE(1),
|
||||
.CLR(0),
|
||||
.O(rgmii_rxc_s));
|
||||
|
||||
BUFR #(
|
||||
.SIM_DEVICE("7SERIES"),
|
||||
.BUFR_DIVIDE(1)
|
||||
) bufr_rgmii_rx_ctl_clk (
|
||||
.I(rgmii_rxc_bufmr),
|
||||
.CE(1),
|
||||
.CLR(0),
|
||||
.O(rgmii_rx_ctl_clk_s));
|
||||
|
||||
BUFG bufg_rgmii_rx_clk (
|
||||
.I(rgmii_rxc_s),
|
||||
.O(gmii_rx_clk));
|
||||
|
||||
IDELAYE2 #(
|
||||
|
@ -275,9 +260,9 @@ module util_gmii_to_rgmii (
|
|||
for (i = 0; i < 4; i = i + 1) begin
|
||||
IDELAYE2 #(
|
||||
.IDELAY_TYPE("FIXED"),
|
||||
.HIGH_PERFORMANCE_MODE("TRUE"),
|
||||
.REFCLK_FREQUENCY(200.0),
|
||||
.SIGNAL_PATTERN("DATA"),
|
||||
.HIGH_PERFORMANCE_MODE("TRUE"),
|
||||
.REFCLK_FREQUENCY(200.0),
|
||||
.SIGNAL_PATTERN("DATA"),
|
||||
.DELAY_SRC("IDATAIN")
|
||||
) delay_rgmii_rd (
|
||||
.IDATAIN(rgmii_rd[i]),
|
||||
|
@ -298,7 +283,7 @@ module util_gmii_to_rgmii (
|
|||
) rgmii_rx_iddr (
|
||||
.Q1(gmii_rxd_s[i]),
|
||||
.Q2(gmii_rxd_s[i+4]),
|
||||
.C(rgmii_rxc_s),
|
||||
.C(gmii_rx_clk),
|
||||
.CE(1),
|
||||
.D(rgmii_rd_delay[i]),
|
||||
.R(0),
|
||||
|
@ -311,7 +296,7 @@ module util_gmii_to_rgmii (
|
|||
) rgmii_rx_ctl_iddr (
|
||||
.Q1(gmii_rx_dv_s),
|
||||
.Q2(rgmii_rx_ctl_s),
|
||||
.C(rgmii_rx_ctl_clk_s),
|
||||
.C(gmii_rx_clk),
|
||||
.CE(1),
|
||||
.D(rgmii_rx_ctl_delay),
|
||||
.R(0),
|
||||
|
|
Loading…
Reference in New Issue