2016-09-09 15:04:41 +00:00
|
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
2017-05-17 08:44:52 +00:00
|
|
|
// Copyright 2014 - 2017 (c) Analog Devices, Inc. All rights reserved.
|
2016-09-09 15:04:41 +00:00
|
|
|
//
|
2017-05-29 06:55:41 +00:00
|
|
|
// This core is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE.
|
2016-09-09 15:04:41 +00:00
|
|
|
//
|
2017-05-29 06:55:41 +00:00
|
|
|
// Redistribution and use of source or resulting binaries, with or without modification
|
|
|
|
// of this file, are permitted under one of the following two license terms:
|
2016-09-09 15:04:41 +00:00
|
|
|
//
|
2017-05-17 08:44:52 +00:00
|
|
|
// 1. The GNU General Public License version 2 as published by the
|
2017-05-29 06:55:41 +00:00
|
|
|
// Free Software Foundation, which can be found in the top level directory of
|
|
|
|
// the repository (LICENSE_GPL2), and at: <https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
|
2017-05-17 08:44:52 +00:00
|
|
|
//
|
|
|
|
// OR
|
|
|
|
//
|
2017-05-29 06:55:41 +00:00
|
|
|
// 2. An ADI specific BSD license as noted in the top level directory, or on-line at:
|
|
|
|
// https://github.com/analogdevicesinc/hdl/blob/master/LICENSE_ADIBSD
|
|
|
|
// This will allow to generate bit files and not release the source code,
|
|
|
|
// as long as it attaches to an ADI device.
|
2016-09-09 15:04:41 +00:00
|
|
|
//
|
|
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
`timescale 1ps/1ps
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
module __ad_serdes_out__ #(
|
2016-09-15 13:38:11 +00:00
|
|
|
|
|
|
|
parameter DEVICE_TYPE = 0,
|
2016-10-28 18:09:04 +00:00
|
|
|
parameter DDR_OR_SDR_N = 1,
|
2016-10-11 14:02:46 +00:00
|
|
|
parameter SERDES_FACTOR = 8,
|
2016-09-15 13:38:11 +00:00
|
|
|
parameter DATA_WIDTH = 16) (
|
2016-09-09 15:04:41 +00:00
|
|
|
|
|
|
|
// reset and clocks
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
input rst,
|
|
|
|
input clk,
|
|
|
|
input div_clk,
|
|
|
|
input loaden,
|
|
|
|
|
|
|
|
// data interface
|
|
|
|
|
|
|
|
input [(DATA_WIDTH-1):0] data_s0,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s1,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s2,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s3,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s4,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s5,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s6,
|
|
|
|
input [(DATA_WIDTH-1):0] data_s7,
|
|
|
|
output [(DATA_WIDTH-1):0] data_out_p,
|
|
|
|
output [(DATA_WIDTH-1):0] data_out_n);
|
2016-09-09 15:04:41 +00:00
|
|
|
|
2016-10-25 17:19:39 +00:00
|
|
|
// local parameter
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
localparam ARRIA10 = 0;
|
|
|
|
localparam CYCLONE5 = 1;
|
2016-10-25 17:19:39 +00:00
|
|
|
|
2016-10-11 14:02:46 +00:00
|
|
|
// internal signals
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
wire [(DATA_WIDTH-1):0] data_samples_s[0:(SERDES_FACTOR-1)];
|
|
|
|
wire [(SERDES_FACTOR-1):0] data_in_s[0:(DATA_WIDTH-1)];
|
2016-10-11 14:02:46 +00:00
|
|
|
|
2016-09-12 15:45:23 +00:00
|
|
|
// defaults
|
2016-09-09 15:04:41 +00:00
|
|
|
|
2016-09-12 15:45:23 +00:00
|
|
|
assign data_out_n = 'd0;
|
2016-09-09 15:04:41 +00:00
|
|
|
|
|
|
|
// instantiations
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
genvar n;
|
|
|
|
genvar i;
|
2016-10-11 14:02:46 +00:00
|
|
|
|
|
|
|
generate
|
2016-10-28 18:09:04 +00:00
|
|
|
if (SERDES_FACTOR == 8) begin
|
|
|
|
assign data_samples_s[7] = data_s7;
|
|
|
|
assign data_samples_s[6] = data_s6;
|
|
|
|
assign data_samples_s[5] = data_s5;
|
|
|
|
assign data_samples_s[4] = data_s4;
|
|
|
|
end
|
2016-10-11 14:02:46 +00:00
|
|
|
endgenerate
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
assign data_samples_s[3] = data_s3;
|
|
|
|
assign data_samples_s[2] = data_s2;
|
|
|
|
assign data_samples_s[1] = data_s1;
|
|
|
|
assign data_samples_s[0] = data_s0;
|
|
|
|
|
2016-09-09 15:04:41 +00:00
|
|
|
generate
|
2016-10-28 18:09:04 +00:00
|
|
|
for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_swap
|
|
|
|
for (i = 0; i < SERDES_FACTOR; i = i + 1) begin: g_samples
|
|
|
|
assign data_in_s[n][((SERDES_FACTOR-1)-i)] = data_samples_s[i][n];
|
2016-10-25 17:19:39 +00:00
|
|
|
end
|
2016-09-09 15:04:41 +00:00
|
|
|
end
|
|
|
|
endgenerate
|
|
|
|
|
2016-10-28 18:09:04 +00:00
|
|
|
generate
|
|
|
|
for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_data
|
|
|
|
|
|
|
|
if (DEVICE_TYPE == CYCLONE5) begin
|
2016-10-31 14:54:07 +00:00
|
|
|
ad_serdes_out_core_c5 #(
|
|
|
|
.SERDES_FACTOR (SERDES_FACTOR))
|
|
|
|
i_core (
|
|
|
|
.clk (clk),
|
|
|
|
.div_clk (div_clk),
|
|
|
|
.enable (loaden),
|
|
|
|
.data_out (data_out_p[n]),
|
|
|
|
.data (data_in_s[n]));
|
2016-10-28 18:09:04 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
if (DEVICE_TYPE == ARRIA10) begin
|
|
|
|
__ad_serdes_out_1__ i_core (
|
|
|
|
.clk_export (clk),
|
|
|
|
.div_clk_export (div_clk),
|
|
|
|
.loaden_export (loaden),
|
|
|
|
.data_out_export (data_out_p[n]),
|
|
|
|
.data_s_export (data_in_s[n]));
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
endgenerate
|
|
|
|
|
2016-09-09 15:04:41 +00:00
|
|
|
endmodule
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
|
|
|
|