adxcvr- initial commit
parent
92c580a84d
commit
20ac95b1ec
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,567 @@
|
|||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
// Copyright 2011(c) Analog Devices, Inc.
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
// - Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// - Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in
|
||||
// the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// - Neither the name of Analog Devices, Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
// - The use of this software may or may not infringe the patent rights
|
||||
// of one or more patent holders. This license does not release you
|
||||
// from the requirement that you obtain separate licenses from these
|
||||
// patent holders to use this software.
|
||||
// - Use of the software either in source or binary form, must be run
|
||||
// on or directly connected to an Analog Devices Inc. component.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
// INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
|
||||
// PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
//
|
||||
// IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
|
||||
// RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
||||
`timescale 1ns/100ps
|
||||
|
||||
module axi_adxcvr_es (
|
||||
|
||||
// up interface
|
||||
|
||||
input up_rstn,
|
||||
input up_clk,
|
||||
output up_es_enb,
|
||||
output [11:0] up_es_addr,
|
||||
output up_es_wr,
|
||||
output [15:0] up_es_wdata,
|
||||
input [15:0] up_es_rdata,
|
||||
input up_es_ready,
|
||||
input up_ch_lpm_dfe_n,
|
||||
input up_es_req,
|
||||
output up_es_ack,
|
||||
input [ 4:0] up_es_pscale,
|
||||
input [ 1:0] up_es_vrange,
|
||||
input [ 7:0] up_es_vstep,
|
||||
input [ 7:0] up_es_vmax,
|
||||
input [ 7:0] up_es_vmin,
|
||||
input [11:0] up_es_hmax,
|
||||
input [11:0] up_es_hmin,
|
||||
input [11:0] up_es_hstep,
|
||||
input [31:0] up_es_saddr,
|
||||
output up_es_status,
|
||||
|
||||
// axi interface
|
||||
|
||||
output up_axi_awvalid,
|
||||
output [31:0] up_axi_awaddr,
|
||||
output [ 2:0] up_axi_awprot,
|
||||
input up_axi_awready,
|
||||
output up_axi_wvalid,
|
||||
output [31:0] up_axi_wdata,
|
||||
output [ 3:0] up_axi_wstrb,
|
||||
input up_axi_wready,
|
||||
input up_axi_bvalid,
|
||||
input [ 1:0] up_axi_bresp,
|
||||
output up_axi_bready,
|
||||
output up_axi_arvalid,
|
||||
output [31:0] up_axi_araddr,
|
||||
output [ 2:0] up_axi_arprot,
|
||||
input up_axi_arready,
|
||||
input up_axi_rvalid,
|
||||
input [31:0] up_axi_rdata,
|
||||
input [ 1:0] up_axi_rresp,
|
||||
output up_axi_rready);
|
||||
|
||||
// parameters
|
||||
|
||||
parameter integer GTH_OR_GTX_N = 0;
|
||||
parameter integer TX_OR_RX_N = 0;
|
||||
|
||||
// addresses
|
||||
|
||||
localparam [11:0] ES_DRP_CTRL_ADDR = (GTH_OR_GTX_N == 1) ? 12'h03c : 12'h03d; // GTH-7 12'h03d
|
||||
localparam [11:0] ES_DRP_HOFFSET_ADDR = (GTH_OR_GTX_N == 1) ? 12'h04f : 12'h03c; // GTH-7 12'h03c
|
||||
localparam [11:0] ES_DRP_VOFFSET_ADDR = (GTH_OR_GTX_N == 1) ? 12'h097 : 12'h03b; // GTH-7 12'h03b
|
||||
localparam [11:0] ES_DRP_STATUS_ADDR = (GTH_OR_GTX_N == 1) ? 12'h153 : 12'h151; // GTH-7 12'h153
|
||||
localparam [11:0] ES_DRP_SCNT_ADDR = (GTH_OR_GTX_N == 1) ? 12'h152 : 12'h150; // GTH-7 12'h152
|
||||
localparam [11:0] ES_DRP_ECNT_ADDR = (GTH_OR_GTX_N == 1) ? 12'h151 : 12'h14f; // GTH-7 12'h151
|
||||
|
||||
// fsm-states
|
||||
|
||||
localparam [ 4:0] ES_FSM_IDLE = 6'h00;
|
||||
localparam [ 4:0] ES_FSM_HOFFSET_READ = 6'h01;
|
||||
localparam [ 4:0] ES_FSM_HOFFSET_RRDY = 6'h02;
|
||||
localparam [ 4:0] ES_FSM_HOFFSET_WRITE = 6'h03;
|
||||
localparam [ 4:0] ES_FSM_HOFFSET_WRDY = 6'h04;
|
||||
localparam [ 4:0] ES_FSM_VOFFSET_READ = 6'h05;
|
||||
localparam [ 4:0] ES_FSM_VOFFSET_RRDY = 6'h06;
|
||||
localparam [ 4:0] ES_FSM_VOFFSET_WRITE = 6'h07;
|
||||
localparam [ 4:0] ES_FSM_VOFFSET_WRDY = 6'h08;
|
||||
localparam [ 4:0] ES_FSM_CTRL_READ = 6'h09;
|
||||
localparam [ 4:0] ES_FSM_CTRL_RRDY = 6'h0a;
|
||||
localparam [ 4:0] ES_FSM_START_WRITE = 6'h0b;
|
||||
localparam [ 4:0] ES_FSM_START_WRDY = 6'h0c;
|
||||
localparam [ 4:0] ES_FSM_STATUS_READ = 6'h0d;
|
||||
localparam [ 4:0] ES_FSM_STATUS_RRDY = 6'h0e;
|
||||
localparam [ 4:0] ES_FSM_STOP_WRITE = 6'h0f;
|
||||
localparam [ 4:0] ES_FSM_STOP_WRDY = 6'h10;
|
||||
localparam [ 4:0] ES_FSM_SCNT_READ = 6'h11;
|
||||
localparam [ 4:0] ES_FSM_SCNT_RRDY = 6'h12;
|
||||
localparam [ 4:0] ES_FSM_ECNT_READ = 6'h13;
|
||||
localparam [ 4:0] ES_FSM_ECNT_RRDY = 6'h14;
|
||||
localparam [ 4:0] ES_FSM_AXI_WRITE = 6'h15;
|
||||
localparam [ 4:0] ES_FSM_AXI_READY = 6'h16;
|
||||
localparam [ 4:0] ES_FSM_UPDATE = 6'h17;
|
||||
|
||||
// internal registers
|
||||
|
||||
reg up_awvalid = 'd0;
|
||||
reg [31:0] up_awaddr = 'd0;
|
||||
reg up_wvalid = 'd0;
|
||||
reg [31:0] up_wdata = 'd0;
|
||||
reg up_status = 'd0;
|
||||
reg up_ut = 'd0;
|
||||
reg [31:0] up_daddr = 'd0;
|
||||
reg [11:0] up_hindex = 'd0;
|
||||
reg [ 7:0] up_vindex = 'd0;
|
||||
reg [15:0] up_hdata = 'd0;
|
||||
reg [15:0] up_vdata = 'd0;
|
||||
reg [15:0] up_cdata = 'd0;
|
||||
reg [15:0] up_sdata = 'd0;
|
||||
reg [15:0] up_edata = 'd0;
|
||||
reg up_req_d = 'd0;
|
||||
reg up_ack = 'd0;
|
||||
reg [ 4:0] up_fsm = 'd0;
|
||||
reg up_enb = 'd0;
|
||||
reg [11:0] up_addr = 'd0;
|
||||
reg up_wr = 'd0;
|
||||
reg [15:0] up_data = 'd0;
|
||||
|
||||
// internal signals
|
||||
|
||||
wire up_heos_s;
|
||||
wire up_eos_s;
|
||||
wire up_ut_s;
|
||||
wire [ 7:0] up_vindex_m_s;
|
||||
wire [ 7:0] up_vindex_n_s;
|
||||
wire [ 7:0] up_vindex_s;
|
||||
wire up_start_s;
|
||||
|
||||
// axi interface
|
||||
|
||||
generate
|
||||
if (TX_OR_RX_N == 1) begin
|
||||
assign up_axi_awvalid = 1'b0;
|
||||
assign up_axi_awaddr = 32'd0;
|
||||
assign up_axi_awprot = 3'd0;
|
||||
assign up_axi_wvalid = 1'b0;
|
||||
assign up_axi_wdata = 32'd0;
|
||||
assign up_axi_wstrb = 4'hf;
|
||||
assign up_axi_bready = 1'b1;
|
||||
assign up_axi_arvalid = 1'b0;
|
||||
assign up_axi_araddr = 32'd0;
|
||||
assign up_axi_arprot = 3'd0;
|
||||
assign up_axi_rready = 1'b1;
|
||||
end else begin
|
||||
assign up_axi_awvalid = up_awvalid;
|
||||
assign up_axi_awaddr = up_awaddr;
|
||||
assign up_axi_awprot = 3'd0;
|
||||
assign up_axi_wvalid = up_wvalid;
|
||||
assign up_axi_wdata = up_wdata;
|
||||
assign up_axi_wstrb = 4'hf;
|
||||
assign up_axi_bready = 1'b1;
|
||||
assign up_axi_arvalid = 1'b0;
|
||||
assign up_axi_araddr = 32'd0;
|
||||
assign up_axi_arprot = 3'd0;
|
||||
assign up_axi_rready = 1'b1;
|
||||
end
|
||||
endgenerate
|
||||
|
||||
// reconfig interface
|
||||
|
||||
generate
|
||||
if (TX_OR_RX_N == 1) begin
|
||||
assign up_es_ack = 1'b1;
|
||||
assign up_es_enb = 1'b0;
|
||||
assign up_es_addr = 12'd0;
|
||||
assign up_es_wr = 1'd0;
|
||||
assign up_es_wdata = 16'd0;
|
||||
assign up_es_status = 1'd0;
|
||||
end else begin
|
||||
assign up_es_ack = up_ack;
|
||||
assign up_es_enb = up_enb;
|
||||
assign up_es_addr = up_addr;
|
||||
assign up_es_wr = up_wr;
|
||||
assign up_es_wdata = up_data;
|
||||
assign up_es_status = up_status;
|
||||
end
|
||||
endgenerate
|
||||
|
||||
// axi write
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_awvalid <= 'b0;
|
||||
up_awaddr <= 'd0;
|
||||
up_wvalid <= 'b0;
|
||||
up_wdata <= 'd0;
|
||||
up_status <= 'd0;
|
||||
end else begin
|
||||
if ((up_awvalid == 1'b1) && (up_axi_awready == 1'b1)) begin
|
||||
up_awvalid <= 1'b0;
|
||||
up_awaddr <= 32'd0;
|
||||
end else if (up_fsm == ES_FSM_AXI_WRITE) begin
|
||||
up_awvalid <= 1'b1;
|
||||
up_awaddr <= up_daddr;
|
||||
end
|
||||
if ((up_wvalid == 1'b1) && (up_axi_wready == 1'b1)) begin
|
||||
up_wvalid <= 1'b0;
|
||||
up_wdata <= 32'd0;
|
||||
end else if (up_fsm == ES_FSM_AXI_WRITE) begin
|
||||
up_wvalid <= 1'b1;
|
||||
up_wdata <= {up_sdata, up_edata};
|
||||
end
|
||||
if (up_axi_bvalid == 1'b1) begin
|
||||
up_status <= | up_axi_bresp;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// prescale, horizontal and vertical offsets
|
||||
|
||||
assign up_heos_s = (up_hindex == up_es_hmax) ? up_ut : 1'b0;
|
||||
assign up_eos_s = (up_vindex == up_es_vmax) ? up_heos_s : 1'b0;
|
||||
|
||||
assign up_ut_s = up_ut & ~up_ch_lpm_dfe_n;
|
||||
assign up_vindex_m_s = ~up_vindex + 1'b1;
|
||||
assign up_vindex_n_s = {1'b1, up_vindex_m_s[6:0]};
|
||||
assign up_vindex_s = (up_vindex[7] == 1'b1) ? up_vindex_n_s : up_vindex;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_ut <= 'd0;
|
||||
up_daddr <= 'd0;
|
||||
up_hindex <= 'd0;
|
||||
up_vindex <= 'd0;
|
||||
end else begin
|
||||
if (up_fsm == ES_FSM_IDLE) begin
|
||||
up_ut <= up_ch_lpm_dfe_n;
|
||||
up_daddr <= up_es_saddr;
|
||||
up_hindex <= up_es_hmin;
|
||||
up_vindex <= up_es_vmin;
|
||||
end else if (up_fsm == ES_FSM_UPDATE) begin
|
||||
up_ut <= ~up_ut | up_ch_lpm_dfe_n;
|
||||
up_daddr <= up_daddr + 3'd4;
|
||||
if (up_heos_s == 1'b1) begin
|
||||
up_hindex <= up_es_hmin;
|
||||
end else if (up_ut == 1'b1) begin
|
||||
up_hindex <= up_hindex + up_es_hstep;
|
||||
end
|
||||
if (up_heos_s == 1'b1) begin
|
||||
up_vindex <= up_vindex + up_es_vstep;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// read-modify-write
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_hdata <= 'd0;
|
||||
up_vdata <= 'd0;
|
||||
up_cdata <= 'd0;
|
||||
up_sdata <= 'd0;
|
||||
up_edata <= 'd0;
|
||||
end else begin
|
||||
if ((up_fsm == ES_FSM_HOFFSET_RRDY) && (up_es_ready == 1'b1)) begin
|
||||
up_hdata <= up_es_rdata;
|
||||
end
|
||||
if ((up_fsm == ES_FSM_VOFFSET_RRDY) && (up_es_ready == 1'b1)) begin
|
||||
up_vdata <= up_es_rdata;
|
||||
end
|
||||
if ((up_fsm == ES_FSM_CTRL_RRDY) && (up_es_ready == 1'b1)) begin
|
||||
up_cdata <= up_es_rdata;
|
||||
end
|
||||
if ((up_fsm == ES_FSM_SCNT_RRDY) && (up_es_ready == 1'b1)) begin
|
||||
up_sdata <= up_es_rdata;
|
||||
end
|
||||
if ((up_fsm == ES_FSM_ECNT_RRDY) && (up_es_ready == 1'b1)) begin
|
||||
up_edata <= up_es_rdata;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// request, start and ack
|
||||
|
||||
assign up_start_s = up_es_req & ~up_req_d;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_req_d <= 1'b0;
|
||||
up_ack <= 1'b0;
|
||||
end else begin
|
||||
up_req_d <= up_es_req;
|
||||
if (up_fsm == ES_FSM_UPDATE) begin
|
||||
up_ack <= up_eos_s | ~up_es_req;
|
||||
end else begin
|
||||
up_ack <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// es-fsm
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_fsm <= ES_FSM_IDLE;
|
||||
end else begin
|
||||
case (up_fsm)
|
||||
ES_FSM_IDLE: begin
|
||||
if (up_start_s == 1'b1) begin
|
||||
up_fsm <= ES_FSM_HOFFSET_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_IDLE;
|
||||
end
|
||||
end
|
||||
ES_FSM_HOFFSET_READ: begin
|
||||
up_fsm <= ES_FSM_HOFFSET_RRDY;
|
||||
end
|
||||
ES_FSM_HOFFSET_RRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_HOFFSET_WRITE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_HOFFSET_RRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_HOFFSET_WRITE: begin
|
||||
up_fsm <= ES_FSM_HOFFSET_WRDY;
|
||||
end
|
||||
ES_FSM_HOFFSET_WRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_VOFFSET_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_HOFFSET_WRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_VOFFSET_READ: begin
|
||||
up_fsm <= ES_FSM_VOFFSET_RRDY;
|
||||
end
|
||||
ES_FSM_VOFFSET_RRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_VOFFSET_WRITE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_VOFFSET_RRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_VOFFSET_WRITE: begin
|
||||
up_fsm <= ES_FSM_VOFFSET_WRDY;
|
||||
end
|
||||
ES_FSM_VOFFSET_WRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_CTRL_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_VOFFSET_WRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_CTRL_READ: begin
|
||||
up_fsm <= ES_FSM_CTRL_RRDY;
|
||||
end
|
||||
ES_FSM_CTRL_RRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_START_WRITE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_CTRL_RRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_START_WRITE: begin
|
||||
up_fsm <= ES_FSM_START_WRDY;
|
||||
end
|
||||
ES_FSM_START_WRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_STATUS_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_START_WRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_STATUS_READ: begin
|
||||
up_fsm <= ES_FSM_STATUS_RRDY;
|
||||
end
|
||||
ES_FSM_STATUS_RRDY: begin
|
||||
if (up_es_ready == 1'b0) begin
|
||||
up_fsm <= ES_FSM_STATUS_RRDY;
|
||||
end else if (up_es_rdata[3:0] == 4'b0101) begin
|
||||
up_fsm <= ES_FSM_STOP_WRITE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_STATUS_READ;
|
||||
end
|
||||
end
|
||||
ES_FSM_STOP_WRITE: begin
|
||||
up_fsm <= ES_FSM_STOP_WRDY;
|
||||
end
|
||||
ES_FSM_STOP_WRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_SCNT_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_STOP_WRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_SCNT_READ: begin
|
||||
up_fsm <= ES_FSM_SCNT_RRDY;
|
||||
end
|
||||
ES_FSM_SCNT_RRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_ECNT_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_SCNT_RRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_ECNT_READ: begin
|
||||
up_fsm <= ES_FSM_ECNT_RRDY;
|
||||
end
|
||||
ES_FSM_ECNT_RRDY: begin
|
||||
if (up_es_ready == 1'b1) begin
|
||||
up_fsm <= ES_FSM_AXI_WRITE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_ECNT_RRDY;
|
||||
end
|
||||
end
|
||||
ES_FSM_AXI_WRITE: begin
|
||||
up_fsm <= ES_FSM_AXI_READY;
|
||||
end
|
||||
ES_FSM_AXI_READY: begin
|
||||
if (up_axi_bvalid == 1'b1) begin
|
||||
up_fsm <= ES_FSM_UPDATE;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_AXI_READY;
|
||||
end
|
||||
end
|
||||
ES_FSM_UPDATE: begin
|
||||
if ((up_eos_s == 1'b1) || (up_es_req == 1'b0)) begin
|
||||
up_fsm <= ES_FSM_IDLE;
|
||||
end else if (up_ut == 1'b1) begin
|
||||
up_fsm <= ES_FSM_HOFFSET_READ;
|
||||
end else begin
|
||||
up_fsm <= ES_FSM_VOFFSET_READ;
|
||||
end
|
||||
end
|
||||
default: begin
|
||||
up_fsm <= ES_FSM_IDLE;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// channel access
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_enb <= 'd0;
|
||||
up_addr <= 'd0;
|
||||
up_wr <= 'd0;
|
||||
up_data <= 'd0;
|
||||
end else begin
|
||||
case (up_fsm)
|
||||
ES_FSM_HOFFSET_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_HOFFSET_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
ES_FSM_HOFFSET_WRITE: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_HOFFSET_ADDR;
|
||||
up_wr <= 1'b1;
|
||||
if (GTH_OR_GTX_N == 1) begin
|
||||
up_data <= {up_hindex, up_hdata[3:0]};
|
||||
end else begin
|
||||
up_data <= {up_hdata[15:12], up_hindex};
|
||||
end
|
||||
end
|
||||
ES_FSM_VOFFSET_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_VOFFSET_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
ES_FSM_VOFFSET_WRITE: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_VOFFSET_ADDR;
|
||||
up_wr <= 1'b1;
|
||||
if (GTH_OR_GTX_N == 1) begin
|
||||
up_data <= {up_vdata[15:11], up_vindex_s[7], up_ut_s, up_vindex_s[6:0], up_es_vrange};
|
||||
end else begin
|
||||
up_data <= {up_es_pscale, up_vdata[10:9], up_ut_s, up_vindex_s};
|
||||
end
|
||||
end
|
||||
ES_FSM_CTRL_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_CTRL_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
ES_FSM_START_WRITE: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_CTRL_ADDR;
|
||||
up_wr <= 1'b1;
|
||||
if (GTH_OR_GTX_N == 1) begin
|
||||
up_data <= {6'd1, 2'b11, up_cdata[7:5], up_es_pscale};
|
||||
end else begin
|
||||
up_data <= {up_cdata[15:10], 2'b11, up_cdata[7:6], 6'd1};
|
||||
end
|
||||
end
|
||||
ES_FSM_STATUS_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_STATUS_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
ES_FSM_STOP_WRITE: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_CTRL_ADDR;
|
||||
up_wr <= 1'b1;
|
||||
if (GTH_OR_GTX_N == 1) begin
|
||||
up_data <= {6'd0, 2'b11, up_cdata[7:5], up_es_pscale};
|
||||
end else begin
|
||||
up_data <= {up_cdata[15:10], 2'b11, up_cdata[7:6], 6'd0};
|
||||
end
|
||||
end
|
||||
ES_FSM_SCNT_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_SCNT_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
ES_FSM_ECNT_READ: begin
|
||||
up_enb <= 1'b1;
|
||||
up_addr <= ES_DRP_ECNT_ADDR;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
default: begin
|
||||
up_enb <= 1'b0;
|
||||
up_addr <= 9'h000;
|
||||
up_wr <= 1'b0;
|
||||
up_data <= 16'h0000;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
|
@ -0,0 +1,268 @@
|
|||
## AUTO GENERATED BY axi_adxcvr.pl, DO NOT MODIFY!
|
||||
|
||||
source ../scripts/adi_env.tcl
|
||||
source $ad_hdl_dir/library/scripts/adi_ip.tcl
|
||||
|
||||
adi_ip_create axi_adxcvr
|
||||
adi_ip_files axi_adxcvr [list \
|
||||
"$ad_hdl_dir/library/common/up_axi.v" \
|
||||
"axi_adxcvr_es.v" \
|
||||
"axi_adxcvr_up.v" \
|
||||
"axi_adxcvr_mdrp.v" \
|
||||
"axi_adxcvr_mstatus.v" \
|
||||
"axi_adxcvr.v" ]
|
||||
|
||||
adi_ip_properties_lite axi_adxcvr
|
||||
|
||||
ipx::remove_all_bus_interface [ipx::current_core]
|
||||
|
||||
set_property driver_value 0 [ipx::get_ports -filter "direction==in" -of_objects [ipx::current_core]]
|
||||
|
||||
ipx::infer_bus_interface {\
|
||||
s_axi_awvalid \
|
||||
s_axi_awaddr \
|
||||
s_axi_awprot \
|
||||
s_axi_awready \
|
||||
s_axi_wvalid \
|
||||
s_axi_wdata \
|
||||
s_axi_wstrb \
|
||||
s_axi_wready \
|
||||
s_axi_bvalid \
|
||||
s_axi_bresp \
|
||||
s_axi_bready \
|
||||
s_axi_arvalid \
|
||||
s_axi_araddr \
|
||||
s_axi_arprot \
|
||||
s_axi_arready \
|
||||
s_axi_rvalid \
|
||||
s_axi_rdata \
|
||||
s_axi_rresp \
|
||||
s_axi_rready} \
|
||||
xilinx.com:interface:aximm_rtl:1.0 [ipx::current_core]
|
||||
|
||||
ipx::infer_bus_interface {\
|
||||
m_axi_awvalid \
|
||||
m_axi_awaddr \
|
||||
m_axi_awprot \
|
||||
m_axi_awready \
|
||||
m_axi_wvalid \
|
||||
m_axi_wdata \
|
||||
m_axi_wstrb \
|
||||
m_axi_wready \
|
||||
m_axi_bvalid \
|
||||
m_axi_bresp \
|
||||
m_axi_bready \
|
||||
m_axi_arvalid \
|
||||
m_axi_araddr \
|
||||
m_axi_arprot \
|
||||
m_axi_arready \
|
||||
m_axi_rvalid \
|
||||
m_axi_rdata \
|
||||
m_axi_rresp \
|
||||
m_axi_rready} \
|
||||
xilinx.com:interface:aximm_rtl:1.0 [ipx::current_core]
|
||||
|
||||
ipx::infer_bus_interface axi_clk xilinx.com:signal:clock_rtl:1.0 [ipx::current_core]
|
||||
ipx::infer_bus_interface axi_aresetn xilinx.com:signal:reset_rtl:1.0 [ipx::current_core]
|
||||
ipx::add_bus_parameter ASSOCIATED_BUSIF [ipx::get_bus_interfaces axi_clk \
|
||||
-of_objects [ipx::current_core]]
|
||||
set_property value s_axi:m_axi [ipx::get_bus_parameters ASSOCIATED_BUSIF \
|
||||
-of_objects [ipx::get_bus_interfaces axi_clk \
|
||||
-of_objects [ipx::current_core]]]
|
||||
ipx::add_memory_map {s_axi} [ipx::current_core]
|
||||
set_property slave_memory_map_ref {s_axi} [ipx::get_bus_interfaces s_axi -of_objects [ipx::current_core]]
|
||||
ipx::add_address_block {axi_lite} [ipx::get_memory_maps s_axi -of_objects [ipx::current_core]]
|
||||
set_property range {4096} [ipx::get_address_blocks axi_lite \
|
||||
-of_objects [ipx::get_memory_maps s_axi -of_objects [ipx::current_core]]]
|
||||
for {set n 0} {$n < 16} {incr n} {
|
||||
|
||||
if {($n%4) == 0} {
|
||||
adi_if_infer_bus ADI:user:if_xcvr_cm master up_cm_${n} [list \
|
||||
"sel up_cm_sel_${n} "\
|
||||
"enb up_cm_enb_${n} "\
|
||||
"addr up_cm_addr_${n} "\
|
||||
"wr up_cm_wr_${n} "\
|
||||
"wdata up_cm_wdata_${n} "\
|
||||
"rdata up_cm_rdata_${n} "\
|
||||
"ready up_cm_ready_${n} "]
|
||||
}
|
||||
|
||||
adi_if_infer_bus ADI:user:if_xcvr_cm master up_es_${n} [list \
|
||||
"sel up_es_sel_${n} "\
|
||||
"enb up_es_enb_${n} "\
|
||||
"addr up_es_addr_${n} "\
|
||||
"wr up_es_wr_${n} "\
|
||||
"wdata up_es_wdata_${n} "\
|
||||
"rdata up_es_rdata_${n} "\
|
||||
"ready up_es_ready_${n} "]
|
||||
|
||||
adi_if_infer_bus ADI:user:if_xcvr_ch master up_ch_${n} [list \
|
||||
"pll_rst up_ch_pll_rst_${n} "\
|
||||
"pll_locked up_ch_pll_locked_${n} "\
|
||||
"rst up_ch_rst_${n} "\
|
||||
"user_ready up_ch_user_ready_${n} "\
|
||||
"rst_done up_ch_rst_done_${n} "\
|
||||
"lpm_dfe_n up_ch_lpm_dfe_n_${n} "\
|
||||
"rate up_ch_rate_${n} "\
|
||||
"sys_clk_sel up_ch_sys_clk_sel_${n} "\
|
||||
"out_clk_sel up_ch_out_clk_sel_${n} "\
|
||||
"sel up_ch_sel_${n} "\
|
||||
"enb up_ch_enb_${n} "\
|
||||
"addr up_ch_addr_${n} "\
|
||||
"wr up_ch_wr_${n} "\
|
||||
"wdata up_ch_wdata_${n} "\
|
||||
"rdata up_ch_rdata_${n} "\
|
||||
"ready up_ch_ready_${n} "]
|
||||
|
||||
}
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 0))} \
|
||||
[ipx::get_bus_interfaces up_es_0 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 0} \
|
||||
[ipx::get_bus_interfaces up_ch_0 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.QPLL_ENABLE')) = 1) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 0))} \
|
||||
[ipx::get_bus_interfaces up_cm_0 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 1))} \
|
||||
[ipx::get_bus_interfaces up_es_1 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 1} \
|
||||
[ipx::get_bus_interfaces up_ch_1 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 2))} \
|
||||
[ipx::get_bus_interfaces up_es_2 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 2} \
|
||||
[ipx::get_bus_interfaces up_ch_2 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 3))} \
|
||||
[ipx::get_bus_interfaces up_es_3 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 3} \
|
||||
[ipx::get_bus_interfaces up_ch_3 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 4))} \
|
||||
[ipx::get_bus_interfaces up_es_4 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 4} \
|
||||
[ipx::get_bus_interfaces up_ch_4 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.QPLL_ENABLE')) = 1) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 4))} \
|
||||
[ipx::get_bus_interfaces up_cm_4 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 5))} \
|
||||
[ipx::get_bus_interfaces up_es_5 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 5} \
|
||||
[ipx::get_bus_interfaces up_ch_5 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 6))} \
|
||||
[ipx::get_bus_interfaces up_es_6 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 6} \
|
||||
[ipx::get_bus_interfaces up_ch_6 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 7))} \
|
||||
[ipx::get_bus_interfaces up_es_7 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 7} \
|
||||
[ipx::get_bus_interfaces up_ch_7 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 8))} \
|
||||
[ipx::get_bus_interfaces up_es_8 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 8} \
|
||||
[ipx::get_bus_interfaces up_ch_8 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.QPLL_ENABLE')) = 1) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 8))} \
|
||||
[ipx::get_bus_interfaces up_cm_8 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 9))} \
|
||||
[ipx::get_bus_interfaces up_es_9 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 9} \
|
||||
[ipx::get_bus_interfaces up_ch_9 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 10))} \
|
||||
[ipx::get_bus_interfaces up_es_10 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 10} \
|
||||
[ipx::get_bus_interfaces up_ch_10 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 11))} \
|
||||
[ipx::get_bus_interfaces up_es_11 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 11} \
|
||||
[ipx::get_bus_interfaces up_ch_11 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 12))} \
|
||||
[ipx::get_bus_interfaces up_es_12 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 12} \
|
||||
[ipx::get_bus_interfaces up_ch_12 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.QPLL_ENABLE')) = 1) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 12))} \
|
||||
[ipx::get_bus_interfaces up_cm_12 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 13))} \
|
||||
[ipx::get_bus_interfaces up_es_13 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 13} \
|
||||
[ipx::get_bus_interfaces up_ch_13 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 14))} \
|
||||
[ipx::get_bus_interfaces up_es_14 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 14} \
|
||||
[ipx::get_bus_interfaces up_ch_14 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency \
|
||||
{((spirit:decode(id('MODELPARAM_VALUE.TX_OR_RX_N')) = 0) and \
|
||||
(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 15))} \
|
||||
[ipx::get_bus_interfaces up_es_15 -of_objects [ipx::current_core]]
|
||||
|
||||
set_property enablement_dependency {spirit:decode(id('MODELPARAM_VALUE.NUM_OF_LANES')) > 15} \
|
||||
[ipx::get_bus_interfaces up_ch_15 -of_objects [ipx::current_core]]
|
||||
|
||||
ipx::save_core [ipx::current_core]
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
// Copyright 2011(c) Analog Devices, Inc.
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
// - Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// - Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in
|
||||
// the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// - Neither the name of Analog Devices, Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
// - The use of this software may or may not infringe the patent rights
|
||||
// of one or more patent holders. This license does not release you
|
||||
// from the requirement that you obtain separate licenses from these
|
||||
// patent holders to use this software.
|
||||
// - Use of the software either in source or binary form, must be run
|
||||
// on or directly connected to an Analog Devices Inc. component.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
// INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
|
||||
// PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
//
|
||||
// IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
|
||||
// RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module axi_adxcvr_mdrp (
|
||||
|
||||
input up_rstn,
|
||||
input up_clk,
|
||||
|
||||
input [ 7:0] up_sel,
|
||||
input up_enb,
|
||||
input [15:0] up_rdata_in,
|
||||
input up_ready_in,
|
||||
input [15:0] up_rdata,
|
||||
input up_ready,
|
||||
output [15:0] up_rdata_out,
|
||||
output up_ready_out);
|
||||
|
||||
// parameters
|
||||
|
||||
parameter integer XCVR_ID = 0;
|
||||
|
||||
// internal registers
|
||||
|
||||
reg up_ready_d = 'd0;
|
||||
reg [15:0] up_rdata_int = 'd0;
|
||||
reg up_ready_int = 'd0;
|
||||
reg [15:0] up_rdata_m_in = 'd0;
|
||||
reg up_ready_m_in = 'd0;
|
||||
reg [15:0] up_rdata_m = 'd0;
|
||||
reg up_ready_m = 'd0;
|
||||
|
||||
// internal signals
|
||||
|
||||
wire up_ready_s;
|
||||
wire [15:0] up_rdata_m_s;
|
||||
wire up_ready_m_s;
|
||||
|
||||
// disable if not selected
|
||||
|
||||
assign up_rdata_out = up_rdata_int;
|
||||
assign up_ready_out = up_ready_int;
|
||||
|
||||
assign up_ready_s = up_ready_m & up_ready_m_in;
|
||||
assign up_rdata_m_s = up_rdata_m | up_rdata_m_in;
|
||||
assign up_ready_m_s = up_ready_s & ~up_ready_d;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_ready_d <= 1'd0;
|
||||
up_rdata_int <= 16'd0;
|
||||
up_ready_int <= 1'b0;
|
||||
end else begin
|
||||
up_ready_d <= up_ready_s;
|
||||
case (up_sel)
|
||||
8'hff: begin
|
||||
up_rdata_int <= up_rdata_m_s;
|
||||
up_ready_int <= up_ready_m_s;
|
||||
end
|
||||
XCVR_ID: begin
|
||||
up_rdata_int <= up_rdata;
|
||||
up_ready_int <= up_ready;
|
||||
end
|
||||
default: begin
|
||||
up_rdata_int <= up_rdata_in;
|
||||
up_ready_int <= up_ready_int;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_rdata_m_in <= 16'd0;
|
||||
up_ready_m_in <= 1'b0;
|
||||
up_rdata_m <= 16'd0;
|
||||
up_ready_m <= 1'b0;
|
||||
end else begin
|
||||
if (up_ready_in == 1'b1) begin
|
||||
up_rdata_m_in <= up_rdata_in;
|
||||
up_ready_m_in <= 1'b1;
|
||||
end else if (up_enb == 1'b1) begin
|
||||
up_rdata_m_in <= 16'd0;
|
||||
up_ready_m_in <= 1'b0;
|
||||
end
|
||||
if (up_ready == 1'b1) begin
|
||||
up_rdata_m <= up_rdata;
|
||||
up_ready_m <= 1'b1;
|
||||
end else if (up_enb == 1'b1) begin
|
||||
up_rdata_m <= 16'd0;
|
||||
up_ready_m <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
// Copyright 2011(c) Analog Devices, Inc.
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
// - Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// - Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in
|
||||
// the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// - Neither the name of Analog Devices, Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
// - The use of this software may or may not infringe the patent rights
|
||||
// of one or more patent holders. This license does not release you
|
||||
// from the requirement that you obtain separate licenses from these
|
||||
// patent holders to use this software.
|
||||
// - Use of the software either in source or binary form, must be run
|
||||
// on or directly connected to an Analog Devices Inc. component.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
// INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
|
||||
// PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
//
|
||||
// IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
|
||||
// RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module axi_adxcvr_mstatus (
|
||||
|
||||
input up_rstn,
|
||||
input up_clk,
|
||||
|
||||
input up_pll_locked_in,
|
||||
input up_rst_done_in,
|
||||
input up_pll_locked,
|
||||
input up_rst_done,
|
||||
output up_pll_locked_out,
|
||||
output up_rst_done_out);
|
||||
|
||||
// internal registers
|
||||
|
||||
reg up_pll_locked_int = 'd0;
|
||||
reg up_rst_done_int = 'd0;
|
||||
|
||||
// daisy-chain the signals
|
||||
|
||||
assign up_pll_locked_out = up_pll_locked_int;
|
||||
assign up_rst_done_out = up_rst_done_int;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 1'b0) begin
|
||||
up_pll_locked_int <= 1'd0;
|
||||
up_rst_done_int <= 1'd0;
|
||||
end else begin
|
||||
up_pll_locked_int <= up_pll_locked_in & up_pll_locked;
|
||||
up_rst_done_int <= up_rst_done_in & up_rst_done;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
|
@ -0,0 +1,483 @@
|
|||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
// Copyright 2011(c) Analog Devices, Inc.
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
// - Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// - Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in
|
||||
// the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// - Neither the name of Analog Devices, Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
// - The use of this software may or may not infringe the patent rights
|
||||
// of one or more patent holders. This license does not release you
|
||||
// from the requirement that you obtain separate licenses from these
|
||||
// patent holders to use this software.
|
||||
// - Use of the software either in source or binary form, must be run
|
||||
// on or directly connected to an Analog Devices Inc. component.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
// INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
|
||||
// PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
//
|
||||
// IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
|
||||
// RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
||||
|
||||
`timescale 1ns/100ps
|
||||
|
||||
module axi_adxcvr_up (
|
||||
|
||||
// common
|
||||
|
||||
output [ 7:0] up_cm_sel,
|
||||
output up_cm_enb,
|
||||
output [11:0] up_cm_addr,
|
||||
output up_cm_wr,
|
||||
output [15:0] up_cm_wdata,
|
||||
input [15:0] up_cm_rdata,
|
||||
input up_cm_ready,
|
||||
|
||||
// channel
|
||||
|
||||
output up_ch_pll_rst,
|
||||
input up_ch_pll_locked,
|
||||
output up_ch_rst,
|
||||
output up_ch_user_ready,
|
||||
input up_ch_rst_done,
|
||||
output up_ch_lpm_dfe_n,
|
||||
output [ 2:0] up_ch_rate,
|
||||
output [ 1:0] up_ch_sys_clk_sel,
|
||||
output [ 2:0] up_ch_out_clk_sel,
|
||||
output [ 7:0] up_ch_sel,
|
||||
output up_ch_enb,
|
||||
output [11:0] up_ch_addr,
|
||||
output up_ch_wr,
|
||||
output [15:0] up_ch_wdata,
|
||||
input [15:0] up_ch_rdata,
|
||||
input up_ch_ready,
|
||||
|
||||
// eye-scan
|
||||
|
||||
output [ 7:0] up_es_sel,
|
||||
output up_es_req,
|
||||
input up_es_ack,
|
||||
output [ 4:0] up_es_pscale,
|
||||
output [ 1:0] up_es_vrange,
|
||||
output [ 7:0] up_es_vstep,
|
||||
output [ 7:0] up_es_vmax,
|
||||
output [ 7:0] up_es_vmin,
|
||||
output [11:0] up_es_hmax,
|
||||
output [11:0] up_es_hmin,
|
||||
output [11:0] up_es_hstep,
|
||||
output [31:0] up_es_saddr,
|
||||
input up_es_status,
|
||||
|
||||
// bus interface
|
||||
|
||||
input up_rstn,
|
||||
input up_clk,
|
||||
input up_wreq,
|
||||
input [ 9:0] up_waddr,
|
||||
input [31:0] up_wdata,
|
||||
output up_wack,
|
||||
input up_rreq,
|
||||
input [ 9:0] up_raddr,
|
||||
output [31:0] up_rdata,
|
||||
output up_rack);
|
||||
|
||||
// parameters
|
||||
|
||||
localparam [31:0] VERSION = 32'h00100161;
|
||||
parameter integer ID = 0;
|
||||
parameter integer TX_OR_RX_N = 0;
|
||||
parameter integer QPLL_ENABLE = 1;
|
||||
|
||||
// internal registers
|
||||
|
||||
reg up_wreq_d = 'd0;
|
||||
reg [31:0] up_scratch = 'd0;
|
||||
reg up_resetn = 'd0;
|
||||
reg [ 3:0] up_pll_rst_cnt = 'd0;
|
||||
reg [ 3:0] up_rst_cnt = 'd0;
|
||||
reg [ 6:0] up_user_ready_cnt = 'd0;
|
||||
reg up_status = 'd0;
|
||||
reg up_lpm_dfe_n = 'd0;
|
||||
reg [ 2:0] up_rate = 'd0;
|
||||
reg [ 1:0] up_sys_clk_sel = 'd0;
|
||||
reg [ 2:0] up_out_clk_sel = 'd0;
|
||||
reg [ 7:0] up_icm_sel = 'd0;
|
||||
reg up_icm_enb = 'd0;
|
||||
reg up_icm_wr = 'd0;
|
||||
reg [11:0] up_icm_addr = 'd0;
|
||||
reg [15:0] up_icm_wdata = 'd0;
|
||||
reg [15:0] up_icm_rdata = 'd0;
|
||||
reg up_icm_busy = 'd0;
|
||||
reg [ 7:0] up_ich_sel = 'd0;
|
||||
reg up_ich_enb = 'd0;
|
||||
reg up_ich_wr = 'd0;
|
||||
reg [11:0] up_ich_addr = 'd0;
|
||||
reg [15:0] up_ich_wdata = 'd0;
|
||||
reg [15:0] up_ich_rdata = 'd0;
|
||||
reg up_ich_busy = 'd0;
|
||||
reg [ 7:0] up_ies_sel = 'd0;
|
||||
reg up_ies_req = 'd0;
|
||||
reg [ 4:0] up_ies_prescale = 'd0;
|
||||
reg [ 1:0] up_ies_voffset_range = 'd0;
|
||||
reg [ 7:0] up_ies_voffset_step = 'd0;
|
||||
reg [ 7:0] up_ies_voffset_max = 'd0;
|
||||
reg [ 7:0] up_ies_voffset_min = 'd0;
|
||||
reg [11:0] up_ies_hoffset_max = 'd0;
|
||||
reg [11:0] up_ies_hoffset_min = 'd0;
|
||||
reg [11:0] up_ies_hoffset_step = 'd0;
|
||||
reg [31:0] up_ies_start_addr = 'd0;
|
||||
reg up_ies_status = 'd0;
|
||||
reg up_rreq_d = 'd0;
|
||||
reg [31:0] up_rdata_d = 'd0;
|
||||
|
||||
// defaults
|
||||
|
||||
assign up_wack = up_wreq_d;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_wreq_d <= 'd0;
|
||||
up_scratch <= 'd0;
|
||||
end else begin
|
||||
up_wreq_d <= up_wreq;
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h002)) begin
|
||||
up_scratch <= up_wdata;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// reset-controller
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_resetn <= 'd0;
|
||||
end else begin
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h004)) begin
|
||||
up_resetn <= up_wdata[0];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign up_ch_pll_rst = up_pll_rst_cnt[3];
|
||||
assign up_ch_rst = up_rst_cnt[3];
|
||||
assign up_ch_user_ready = up_user_ready_cnt[6];
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_pll_rst_cnt <= 4'h8;
|
||||
up_rst_cnt <= 4'h8;
|
||||
up_user_ready_cnt <= 7'h00;
|
||||
up_status <= 1'b0;
|
||||
end else begin
|
||||
if (up_resetn == 1'b0) begin
|
||||
up_pll_rst_cnt <= 4'h8;
|
||||
end else if (up_pll_rst_cnt[3] == 1'b1) begin
|
||||
up_pll_rst_cnt <= up_pll_rst_cnt + 1'b1;
|
||||
end
|
||||
if ((up_resetn == 1'b0) || (up_pll_rst_cnt[3] == 1'b1) ||
|
||||
(up_ch_pll_locked == 1'b0)) begin
|
||||
up_rst_cnt <= 4'h8;
|
||||
end else if (up_rst_cnt[3] == 1'b1) begin
|
||||
up_rst_cnt <= up_rst_cnt + 1'b1;
|
||||
end
|
||||
if ((up_resetn == 1'b0) || (up_rst_cnt[3] == 1'b1)) begin
|
||||
up_user_ready_cnt <= 7'h00;
|
||||
end else if (up_user_ready_cnt[6] == 1'b0) begin
|
||||
up_user_ready_cnt <= up_user_ready_cnt + 1'b1;
|
||||
end
|
||||
if (up_resetn == 1'b0) begin
|
||||
up_status <= 1'b0;
|
||||
end else if (up_ch_rst_done == 1'b1) begin
|
||||
up_status <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// control signals
|
||||
|
||||
assign up_ch_lpm_dfe_n = up_lpm_dfe_n;
|
||||
assign up_ch_rate = up_rate;
|
||||
assign up_ch_sys_clk_sel = up_sys_clk_sel;
|
||||
assign up_ch_out_clk_sel = up_out_clk_sel;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_lpm_dfe_n <= 'd0;
|
||||
up_rate <= 'd0;
|
||||
up_sys_clk_sel <= 'd0;
|
||||
up_out_clk_sel <= 'd0;
|
||||
end else begin
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h008)) begin
|
||||
up_lpm_dfe_n <= up_wdata[12];
|
||||
up_rate <= up_wdata[10:8];
|
||||
up_sys_clk_sel <= up_wdata[5:4];
|
||||
up_out_clk_sel <= up_wdata[2:0];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// common access
|
||||
|
||||
assign up_cm_sel = up_icm_sel;
|
||||
assign up_cm_enb = up_icm_enb;
|
||||
assign up_cm_wr = up_icm_wr;
|
||||
assign up_cm_addr = up_icm_addr;
|
||||
assign up_cm_wdata = up_icm_wdata;
|
||||
|
||||
generate
|
||||
if (QPLL_ENABLE == 0) begin
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_icm_sel <= 'd0;
|
||||
up_icm_enb <= 'd0;
|
||||
up_icm_wr <= 'd0;
|
||||
up_icm_addr <= 'd0;
|
||||
up_icm_wdata <= 'd0;
|
||||
up_icm_rdata <= 'd0;
|
||||
up_icm_busy <= 'd0;
|
||||
end else begin
|
||||
up_icm_sel <= 'd0;
|
||||
up_icm_enb <= 'd0;
|
||||
up_icm_wr <= 'd0;
|
||||
up_icm_addr <= 'd0;
|
||||
up_icm_wdata <= 'd0;
|
||||
up_icm_rdata <= 'd0;
|
||||
up_icm_busy <= 'd0;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_icm_sel <= 'd0;
|
||||
up_icm_enb <= 'd0;
|
||||
up_icm_wr <= 'd0;
|
||||
up_icm_addr <= 'd0;
|
||||
up_icm_wdata <= 'd0;
|
||||
up_icm_rdata <= 'd0;
|
||||
up_icm_busy <= 'd0;
|
||||
end else begin
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h010)) begin
|
||||
up_icm_sel <= up_wdata[7:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h011)) begin
|
||||
up_icm_enb <= 1'b1;
|
||||
end else begin
|
||||
up_icm_enb <= 1'b0;
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h011)) begin
|
||||
up_icm_wr <= up_wdata[28];
|
||||
up_icm_addr <= up_wdata[27:16];
|
||||
up_icm_wdata <= up_wdata[15:0];
|
||||
end
|
||||
if (up_cm_ready == 1'b1) begin
|
||||
up_icm_rdata <= up_cm_rdata;
|
||||
up_icm_busy <= 1'b0;
|
||||
end else if ((up_wreq == 1'b1) && (up_waddr == 10'h011)) begin
|
||||
up_icm_rdata <= 16'd0;
|
||||
up_icm_busy <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
|
||||
// channel access
|
||||
|
||||
assign up_ch_sel = up_ich_sel;
|
||||
assign up_ch_enb = up_ich_enb;
|
||||
assign up_ch_wr = up_ich_wr;
|
||||
assign up_ch_addr = up_ich_addr;
|
||||
assign up_ch_wdata = up_ich_wdata;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_ich_sel <= 'd0;
|
||||
up_ich_enb <= 'd0;
|
||||
up_ich_wr <= 'd0;
|
||||
up_ich_addr <= 'd0;
|
||||
up_ich_wdata <= 'd0;
|
||||
up_ich_rdata <= 'd0;
|
||||
up_ich_busy <= 'd0;
|
||||
end else begin
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h018)) begin
|
||||
up_ich_sel <= up_wdata[7:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h019)) begin
|
||||
up_ich_enb <= 1'b1;
|
||||
end else begin
|
||||
up_ich_enb <= 1'b0;
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h019)) begin
|
||||
up_ich_wr <= up_wdata[28];
|
||||
up_ich_addr <= up_wdata[27:16];
|
||||
up_ich_wdata <= up_wdata[15:0];
|
||||
end
|
||||
if (up_ch_ready == 1'b1) begin
|
||||
up_ich_rdata <= up_ch_rdata;
|
||||
up_ich_busy <= 1'b0;
|
||||
end else if ((up_wreq == 1'b1) && (up_waddr == 10'h019)) begin
|
||||
up_ich_rdata <= 16'd0;
|
||||
up_ich_busy <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// eye-scan
|
||||
|
||||
assign up_es_sel = up_ies_sel;
|
||||
assign up_es_req = up_ies_req;
|
||||
assign up_es_pscale = up_ies_prescale;
|
||||
assign up_es_vrange = up_ies_voffset_range;
|
||||
assign up_es_vstep = up_ies_voffset_step;
|
||||
assign up_es_vmax = up_ies_voffset_max;
|
||||
assign up_es_vmin = up_ies_voffset_min;
|
||||
assign up_es_hmax = up_ies_hoffset_max;
|
||||
assign up_es_hmin = up_ies_hoffset_min;
|
||||
assign up_es_hstep = up_ies_hoffset_step;
|
||||
assign up_es_saddr = up_ies_start_addr;
|
||||
|
||||
generate
|
||||
if (TX_OR_RX_N == 1) begin
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_ies_sel <= 'd0;
|
||||
up_ies_req <= 'd0;
|
||||
up_ies_prescale <= 'd0;
|
||||
up_ies_voffset_range <= 'd0;
|
||||
up_ies_voffset_step <= 'd0;
|
||||
up_ies_voffset_max <= 'd0;
|
||||
up_ies_voffset_min <= 'd0;
|
||||
up_ies_hoffset_max <= 'd0;
|
||||
up_ies_hoffset_min <= 'd0;
|
||||
up_ies_hoffset_step <= 'd0;
|
||||
up_ies_start_addr <= 'd0;
|
||||
up_ies_status <= 'd0;
|
||||
end else begin
|
||||
up_ies_sel <= 'd0;
|
||||
up_ies_req <= 'd0;
|
||||
up_ies_prescale <= 'd0;
|
||||
up_ies_voffset_range <= 'd0;
|
||||
up_ies_voffset_step <= 'd0;
|
||||
up_ies_voffset_max <= 'd0;
|
||||
up_ies_voffset_min <= 'd0;
|
||||
up_ies_hoffset_max <= 'd0;
|
||||
up_ies_hoffset_min <= 'd0;
|
||||
up_ies_hoffset_step <= 'd0;
|
||||
up_ies_start_addr <= 'd0;
|
||||
up_ies_status <= 'd0;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_ies_sel <= 'd0;
|
||||
up_ies_req <= 'd0;
|
||||
up_ies_prescale <= 'd0;
|
||||
up_ies_voffset_range <= 'd0;
|
||||
up_ies_voffset_step <= 'd0;
|
||||
up_ies_voffset_max <= 'd0;
|
||||
up_ies_voffset_min <= 'd0;
|
||||
up_ies_hoffset_max <= 'd0;
|
||||
up_ies_hoffset_min <= 'd0;
|
||||
up_ies_hoffset_step <= 'd0;
|
||||
up_ies_start_addr <= 'd0;
|
||||
up_ies_status <= 'd0;
|
||||
end else begin
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h020)) begin
|
||||
up_ies_sel <= up_wdata[7:0];
|
||||
end
|
||||
if (up_es_ack == 1'b1) begin
|
||||
up_ies_req <= 1'b0;
|
||||
end else if ((up_wreq == 1'b1) && (up_waddr == 10'h028)) begin
|
||||
up_ies_req <= up_wdata[0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h029)) begin
|
||||
up_ies_prescale <= up_wdata[4:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h02a)) begin
|
||||
up_ies_voffset_range <= up_wdata[25:24];
|
||||
up_ies_voffset_step <= up_wdata[23:16];
|
||||
up_ies_voffset_max <= up_wdata[15:8];
|
||||
up_ies_voffset_min <= up_wdata[7:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h02b)) begin
|
||||
up_ies_hoffset_max <= up_wdata[27:16];
|
||||
up_ies_hoffset_min <= up_wdata[11:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h02c)) begin
|
||||
up_ies_hoffset_step <= up_wdata[11:0];
|
||||
end
|
||||
if ((up_wreq == 1'b1) && (up_waddr == 10'h02d)) begin
|
||||
up_ies_start_addr <= up_wdata;
|
||||
end
|
||||
if (up_es_status == 1'b1) begin
|
||||
up_ies_status <= 1'b1;
|
||||
end else if ((up_wreq == 1'b1) && (up_waddr == 10'h02e)) begin
|
||||
up_ies_status <= up_ies_status & ~up_wdata[0];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
|
||||
// read interface
|
||||
|
||||
assign up_rack = up_rreq_d;
|
||||
assign up_rdata = up_rdata_d;
|
||||
|
||||
always @(negedge up_rstn or posedge up_clk) begin
|
||||
if (up_rstn == 0) begin
|
||||
up_rreq_d <= 'd0;
|
||||
up_rdata_d <= 'd0;
|
||||
end else begin
|
||||
up_rreq_d <= up_rreq;
|
||||
if (up_rreq == 1'b1) begin
|
||||
case (up_raddr)
|
||||
10'h000: up_rdata_d <= VERSION;
|
||||
10'h001: up_rdata_d <= ID;
|
||||
10'h002: up_rdata_d <= up_scratch;
|
||||
10'h004: up_rdata_d <= {31'd0, up_resetn};
|
||||
10'h005: up_rdata_d <= {31'd0, up_status};
|
||||
10'h008: up_rdata_d <= {19'd0, up_lpm_dfe_n, 1'd0, up_rate, 2'd0, up_sys_clk_sel, 1'd0, up_out_clk_sel};
|
||||
10'h010: up_rdata_d <= {24'd0, up_icm_sel};
|
||||
10'h011: up_rdata_d <= {3'd0, up_icm_wr, up_icm_addr, up_icm_wdata};
|
||||
10'h012: up_rdata_d <= {15'd0, up_icm_busy, up_icm_rdata};
|
||||
10'h018: up_rdata_d <= {24'd0, up_ich_sel};
|
||||
10'h019: up_rdata_d <= {3'd0, up_ich_wr, up_ich_addr, up_ich_wdata};
|
||||
10'h01a: up_rdata_d <= {15'd0, up_ich_busy, up_ich_rdata};
|
||||
10'h020: up_rdata_d <= {24'd0, up_ies_sel};
|
||||
10'h028: up_rdata_d <= {31'd0, up_ies_req};
|
||||
10'h029: up_rdata_d <= {27'd0, up_ies_prescale};
|
||||
10'h02a: up_rdata_d <= {6'd0, up_ies_voffset_range, up_ies_voffset_step, up_ies_voffset_max, up_ies_voffset_min};
|
||||
10'h02b: up_rdata_d <= {4'd0, up_ies_hoffset_max, 4'd0, up_ies_hoffset_min};
|
||||
10'h02c: up_rdata_d <= {20'd0, up_ies_hoffset_step};
|
||||
10'h02d: up_rdata_d <= up_ies_start_addr;
|
||||
10'h02e: up_rdata_d <= {31'd0, up_es_status};
|
||||
default: up_rdata_d <= 32'd0;
|
||||
endcase
|
||||
end else begin
|
||||
up_rdata_d <= 32'd0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// ***************************************************************************
|
||||
// ***************************************************************************
|
Loading…
Reference in New Issue