| // Copyright (C) 2017-2020 The Project X-Ray Authors. |
| // |
| // Use of this source code is governed by a ISC-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/ISC |
| // |
| // SPDX-License-Identifier: ISC |
| |
| `include "src/idelay_calibrator.v" |
| |
| `default_nettype none |
| |
| // ============================================================================ |
| |
| module top |
| ( |
| input wire clk, |
| |
| input wire rx, |
| output wire tx, |
| |
| input wire [15:0] sw, |
| output wire [15:0] led, |
| |
| input wire ja1, |
| input wire ja2, |
| input wire ja3, |
| input wire ja4, |
| input wire ja7, |
| input wire ja8, |
| input wire ja9, |
| input wire ja10, |
| |
| input wire jb1, |
| input wire jb2, |
| input wire jb3, |
| input wire jb4, |
| input wire jb7, |
| input wire jb8, |
| input wire jb9, |
| input wire jb10, |
| |
| input wire jc1, |
| input wire jc2, |
| input wire jc3, |
| input wire jc4, |
| input wire jc7, |
| input wire jc8, |
| input wire jc9, |
| input wire jc10, |
| |
| output wire xadc1_p, |
| output wire xadc2_p, |
| input wire xadc3_p, |
| input wire xadc4_p, |
| input wire xadc1_n, |
| output wire xadc2_n, |
| input wire xadc3_n, |
| input wire xadc4_n |
| ); |
| |
| // ============================================================================ |
| // Clock & reset |
| reg [3:0] rst_sr; |
| |
| initial rst_sr <= 4'hF; |
| |
| always @(posedge clk) |
| if (sw[0]) |
| rst_sr <= 4'hF; |
| else |
| rst_sr <= rst_sr >> 1; |
| |
| wire CLK = clk; |
| wire RST = rst_sr[0]; |
| |
| // ============================================================================ |
| // IDELAY calibrator |
| wire cal_rdy; |
| |
| idelay_calibrator cal |
| ( |
| .refclk (CLK), |
| .rst (RST), |
| .rdy (cal_rdy) |
| ); |
| |
| // ============================================================================ |
| // Delay selector |
| wire btn_in = sw[1]; |
| reg [3:0] btn_sr; |
| wire btn_edge; |
| reg [16:0] btn_cnt; |
| |
| always @(posedge CLK) |
| if (RST) |
| btn_sr <= (btn_in) ? 4'hF : 4'h0; |
| else |
| btn_sr <= (btn_sr >> 1) | (btn_in << 3); |
| |
| assign btn_edge = btn_sr[1] ^ btn_sr[0]; |
| |
| always @(posedge CLK) |
| if (RST) |
| btn_cnt <= -1; |
| else if (btn_edge) |
| btn_cnt <= 1000000 - 1; |
| else if (!btn_cnt[15]) |
| btn_cnt <= btn_cnt - 1; |
| |
| wire dly_ld_req = btn_edge && btn_cnt[15]; |
| |
| // ============================================================================ |
| // IDELAY path |
| reg dly_ld; |
| wire dly_out; |
| reg [4:0] dly_delay_in; |
| wire [4:0] dly_delay_out; |
| |
| always @(posedge CLK) |
| if (RST || !cal_rdy) |
| dly_ld <= 0; |
| else if ( dly_ld) |
| dly_ld <= 0; |
| else if (!dly_ld && dly_ld_req) |
| dly_ld <= 1; |
| |
| always @(posedge CLK) |
| if (RST || !cal_rdy) |
| dly_delay_in <= 0; |
| else if (!dly_ld && dly_ld_req) |
| dly_delay_in <= dly_delay_in + 1; |
| |
| (* KEEP, DONT_TOUCH *) |
| IDELAYE2 # |
| ( |
| .IDELAY_TYPE ("VAR_LOAD"), |
| .DELAY_SRC ("IDATAIN") |
| ) |
| idelay |
| ( |
| .IDATAIN (xadc1_n), |
| .DATAOUT (dly_out), |
| |
| .REGRST (RST), |
| .C (CLK), |
| .LD (dly_ld), |
| .CNTVALUEIN (dly_delay_in), |
| .CNTVALUEOUT (dly_delay_out) |
| ); |
| |
| // ============================================================================ |
| // I/O connections |
| reg O; |
| always @(posedge CLK) |
| if (RST) O <= 0; |
| else O <= ~O; |
| |
| reg [23:0] heartbeat_cnt; |
| |
| always @(posedge CLK) |
| heartbeat_cnt <= heartbeat_cnt + 1; |
| |
| assign led[ 0] = heartbeat_cnt[23]; |
| assign led[ 1] = cal_rdy; |
| assign led[ 2] = 1'b0; |
| assign led[ 3] = 1'b0; |
| assign led[ 4] = 1'b0; |
| assign led[ 5] = 1'b0; |
| assign led[ 6] = 1'b0; |
| assign led[ 7] = 1'b0; |
| assign led[ 8] = 1'b0; |
| assign led[ 9] = 1'b0; |
| assign led[10] = 1'b0; |
| assign led[11] = dly_delay_out[0]; |
| assign led[12] = dly_delay_out[1]; |
| assign led[13] = dly_delay_out[2]; |
| assign led[14] = dly_delay_out[3]; |
| assign led[15] = dly_delay_out[4]; |
| |
| assign xadc2_p = O; |
| assign xadc2_n = O; |
| assign xadc1_p = dly_out; |
| |
| endmodule |