blob: 2a3776c5ae65b02c1724e6213529181d7afc0d90 [file] [log] [blame]
// 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