cmda_single.v 3.18 KB
Newer Older
Andrey Filippov's avatar
Andrey Filippov committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*******************************************************************************
 * Module: cmda_single
 * Date:2014-04-26  
 * Author: Andrey Filippov
 * Description: Single-bit CMD/address output
 *
 * Copyright (c) 2014 Elphel, Inc.
 * cmda_single.v is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  cmda_single.v 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.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/> .
 *******************************************************************************/
`timescale 1ns/1ps

module  cmda_single #(
    parameter IODELAY_GRP ="IODELAY_MEMORY",
Andrey Filippov's avatar
Andrey Filippov committed
25
    parameter integer ODELAY_VALUE = 0,
Andrey Filippov's avatar
Andrey Filippov committed
26 27 28 29 30
    parameter IOSTANDARD = "SSTL15",
    parameter SLEW = "SLOW",
    parameter real REFCLK_FREQUENCY = 300.0,
    parameter HIGH_PERFORMANCE_MODE = "FALSE"
)(
Andrey Filippov's avatar
Andrey Filippov committed
31
    output       dq,           // I/O pad (appears on the output 1/2 clk_div earlier, than DDR data)
Andrey Filippov's avatar
Andrey Filippov committed
32 33 34 35
    input        clk,          // free-running system clock, same frequency as iclk (shared for R/W)
    input        clk_div,      // free-running half clk frequency, front aligned to clk (shared for R/W)
    input        rst,
    input  [7:0] dly_data,     // delay value (3 LSB - fine delay)
Andrey Filippov's avatar
Andrey Filippov committed
36
    input  [1:0] din,          // parallel data to be sent out
Andrey Filippov's avatar
Andrey Filippov committed
37 38
//    input  [1:0] tin,          // tristate for data out (sent out earlier than data!) 
    input        tin,          // tristate for data out (sent out earlier than data!) 
Andrey Filippov's avatar
Andrey Filippov committed
39 40
    input        set_delay,    // clk_div synchronous load odelay value from dly_data
    input        ld_delay      // clk_div synchronous set odealy value from loaded
Andrey Filippov's avatar
Andrey Filippov committed
41 42 43 44 45 46 47 48 49 50 51
);
wire d_ser;
wire dq_tri;
wire dq_data_dly;

oserdes_mem#(
    .MODE_DDR("FALSE")
)  oserdes_i (
    .clk(clk),          // serial output clock
    .clk_div(clk_div),  // oclk divided by 2, front aligned
    .rst(rst),          // reset
Andrey Filippov's avatar
Andrey Filippov committed
52
    .din(din[1:0]),     // parallel data in
Andrey Filippov's avatar
Andrey Filippov committed
53
//    .tin(tin[1:0]),     // parallel tri-state in
54
    .tin(tin),          // parallel tri-state in
Andrey Filippov's avatar
Andrey Filippov committed
55 56 57 58 59 60 61
    .dout_dly(d_ser),   // data out to be connected to odelay input
    .dout_iob(),        // data out to be connected directly to the output buffer
    .tout_dly(),        // tristate out to be connected to odelay input
    .tout_iob(dq_tri)  // tristate out to be connected directly to the tristate control of the output buffer
);
odelay_fine_pipe # (
    .IODELAY_GRP(IODELAY_GRP),
Andrey Filippov's avatar
Andrey Filippov committed
62
    .DELAY_VALUE(ODELAY_VALUE),
Andrey Filippov's avatar
Andrey Filippov committed
63 64 65 66 67
    .REFCLK_FREQUENCY(REFCLK_FREQUENCY),
    .HIGH_PERFORMANCE_MODE(HIGH_PERFORMANCE_MODE)
) dqs_out_dly_i(
    .clk(clk_div),
    .rst(rst),
Andrey Filippov's avatar
Andrey Filippov committed
68 69
    .set(set_delay),
    .ld(ld_delay),
Andrey Filippov's avatar
Andrey Filippov committed
70 71 72 73 74
    .delay(dly_data[7:0]),
    .data_in(d_ser),
    .data_out(dq_data_dly)
);

Andrey Filippov's avatar
Andrey Filippov committed
75
OBUFT #(
Andrey Filippov's avatar
Andrey Filippov committed
76
    .IOSTANDARD(IOSTANDARD),
Andrey Filippov's avatar
Andrey Filippov committed
77
    .SLEW(SLEW)
Andrey Filippov's avatar
Andrey Filippov committed
78
) iobufs_dqs_i (
Andrey Filippov's avatar
Andrey Filippov committed
79 80
    .O(dq),
    .I(dq_data_dly),
Andrey Filippov's avatar
Andrey Filippov committed
81 82 83 84
    .T(dq_tri));

endmodule