|
1 | 1 | // ***************************************************************************
|
2 | 2 | // ***************************************************************************
|
3 |
| -// Copyright (C) 2014-2024 Analog Devices, Inc. All rights reserved. |
| 3 | +// Copyright (C) 2014-2025 Analog Devices, Inc. All rights reserved. |
4 | 4 | //
|
5 | 5 | // In this HDL repository, there are many different and unique modules, consisting
|
6 | 6 | // of various HDL (Verilog or VHDL) components. The individual modules are
|
@@ -81,17 +81,20 @@ module axi_adxcvr_up #(
|
81 | 81 | reg up_wreq_d = 'd0;
|
82 | 82 | reg [31:0] up_scratch = 'd0;
|
83 | 83 | reg up_resetn = 'd0;
|
84 |
| - reg [ 3:0] up_rst_cnt = 'd8; |
85 | 84 | reg up_status_int = 'd0;
|
86 | 85 | reg up_rreq_d = 'd0;
|
87 | 86 | reg [31:0] up_rdata_d = 'd0;
|
88 | 87 |
|
89 | 88 | // internal signals
|
90 | 89 |
|
91 |
| - wire up_ready_s; |
| 90 | + wire up_all_ready_s; |
92 | 91 | wire [31:0] up_status_32_s;
|
93 | 92 | wire [31:0] up_rparam_s;
|
94 | 93 |
|
| 94 | + wire up_pll_locked_s; |
| 95 | + wire up_rx_lockedtodata_s; |
| 96 | + wire up_ready_s; |
| 97 | + |
95 | 98 | // defaults
|
96 | 99 |
|
97 | 100 | assign up_wack = up_wreq_d;
|
@@ -120,53 +123,81 @@ module axi_adxcvr_up #(
|
120 | 123 | end
|
121 | 124 | end
|
122 | 125 |
|
123 |
| - assign up_ready_s = & up_status_32_s[(NUM_OF_LANES-1):0]; |
| 126 | + generate if (FPGA_TECHNOLOGY == 105) begin |
| 127 | + sync_bits #( |
| 128 | + .NUM_OF_BITS (3), |
| 129 | + .ASYNC_CLK (1) |
| 130 | + ) i_sync_input_ctrl ( |
| 131 | + .in_bits ({up_ready, up_pll_locked, up_rx_lockedtodata}), |
| 132 | + .out_resetn (1'b1), |
| 133 | + .out_clk (up_clk), |
| 134 | + .out_bits({up_ready_s, up_pll_locked_s, up_rx_lockedtodata_s})); |
| 135 | + end else begin |
| 136 | + assign up_ready_s = up_ready; |
| 137 | + assign up_pll_locked_s = up_pll_locked; |
| 138 | + assign up_rx_lockedtodata_s = up_rx_lockedtodata; |
| 139 | + end |
| 140 | + endgenerate |
| 141 | + |
| 142 | + assign up_all_ready_s = & up_status_32_s[(NUM_OF_LANES-1):0]; |
124 | 143 | assign up_status_32_s[31:(NUM_OF_LANES+1)] = 'd0;
|
125 |
| - assign up_status_32_s[NUM_OF_LANES] = FPGA_TECHNOLOGY == 105 ? TX_OR_RX_N ? up_pll_locked : up_rx_lockedtodata : |
126 |
| - up_pll_locked; |
127 |
| - assign up_status_32_s[(NUM_OF_LANES-1):0] = FPGA_TECHNOLOGY == 105 ? {NUM_OF_LANES{up_ready}} : up_ready; |
| 144 | + assign up_status_32_s[NUM_OF_LANES] = FPGA_TECHNOLOGY == 105 ? TX_OR_RX_N ? up_pll_locked_s : up_rx_lockedtodata_s : |
| 145 | + up_pll_locked_s; |
| 146 | + assign up_status_32_s[(NUM_OF_LANES-1):0] = FPGA_TECHNOLOGY == 105 ? {NUM_OF_LANES{up_ready_s}} : up_ready_s; |
128 | 147 |
|
129 |
| - always @(negedge up_rstn or posedge up_clk) begin |
130 |
| - if (up_rstn == 0) begin |
131 |
| - up_rst_cnt <= 4'h8; |
132 |
| - up_status_int <= 1'b0; |
133 |
| - end else begin |
134 |
| - if (up_resetn == 1'b0) begin |
135 |
| - up_rst_cnt <= 4'h8; |
136 |
| - end else if (up_rst_cnt[3] == 1'b1) begin |
137 |
| - up_rst_cnt <= up_rst_cnt + 1'b1; |
138 |
| - end |
139 |
| - if (up_resetn == 1'b0) begin |
140 |
| - up_status_int <= 1'b0; |
141 |
| - end else if (up_ready_s == 1'b1) begin |
142 |
| - up_status_int <= 1'b1; |
| 148 | + generate if (FPGA_TECHNOLOGY == 105) begin |
| 149 | + wire up_reset_ack_s; |
| 150 | + reg up_rst_d; |
| 151 | + |
| 152 | + sync_bits #( |
| 153 | + .NUM_OF_BITS (1), |
| 154 | + .ASYNC_CLK (1) |
| 155 | + ) i_sync_reset_ack ( |
| 156 | + .in_bits (up_reset_ack), |
| 157 | + .out_resetn (1'b1), |
| 158 | + .out_clk (up_clk), |
| 159 | + .out_bits(up_reset_ack_s)); |
| 160 | + |
| 161 | + always @(negedge up_rstn or posedge up_clk) begin |
| 162 | + if (up_rstn == 0) begin |
| 163 | + up_rst_d <= 1'b1; |
| 164 | + end else if (up_resetn == 1'b0) begin |
| 165 | + up_rst_d <= 1'b1; |
| 166 | + end else if (up_reset_ack_s) begin |
| 167 | + up_rst_d <= 1'b0; |
143 | 168 | end
|
144 | 169 | end
|
145 |
| - end |
146 |
| - |
147 |
| - generate if (FPGA_TECHNOLOGY == 105) begin |
148 |
| - reg up_reset_ack_d = 'd0; |
| 170 | + assign up_rst = up_rst_d; |
| 171 | + end else begin |
| 172 | + reg [3:0] up_rst_cnt = 'd8; |
149 | 173 |
|
150 | 174 | always @(negedge up_rstn or posedge up_clk) begin
|
151 | 175 | if (up_rstn == 0) begin
|
152 |
| - up_reset_ack_d <= 1'b0; |
| 176 | + up_rst_cnt <= 4'h8; |
153 | 177 | end else begin
|
154 | 178 | if (up_resetn == 1'b0) begin
|
155 |
| - up_reset_ack_d <= 1'b0; |
156 |
| - end else begin |
157 |
| - if (up_reset_ack_d == 1'b0) begin |
158 |
| - up_reset_ack_d <= up_reset_ack; |
159 |
| - end |
| 179 | + up_rst_cnt <= 4'h8; |
| 180 | + end else if (up_rst_cnt[3] == 1'b1) begin |
| 181 | + up_rst_cnt <= up_rst_cnt + 1'b1; |
160 | 182 | end
|
161 | 183 | end
|
162 | 184 | end
|
163 |
| - |
164 |
| - assign up_rst = ~up_reset_ack_d; |
165 |
| - end else begin |
166 | 185 | assign up_rst = up_rst_cnt[3];
|
167 | 186 | end
|
168 | 187 | endgenerate
|
169 | 188 |
|
| 189 | + always @(negedge up_rstn or posedge up_clk) begin |
| 190 | + if (up_rstn == 0) begin |
| 191 | + up_status_int <= 1'b0; |
| 192 | + end else begin |
| 193 | + if (up_resetn == 1'b0) begin |
| 194 | + up_status_int <= 1'b0; |
| 195 | + end else if (up_all_ready_s) begin |
| 196 | + up_status_int <= 1'b1; |
| 197 | + end |
| 198 | + end |
| 199 | + end |
| 200 | + |
170 | 201 | // Specific to Intel
|
171 | 202 |
|
172 | 203 | assign up_rparam_s[31:28] = 8'd0;
|
|
0 commit comments