Files
fpga_modem/cores/primitive/clkgen/clkgen_spartan6.v

80 lines
2.0 KiB
Verilog

`timescale 1ns/1ps
// =============================================================================
// Clock generator
// Spartan-6 DCM wrapper with parameterized input and output ratios.
// =============================================================================
module clkgen_spartan6_impl #(
parameter integer CLK_IN_HZ = 100000000,
parameter integer CLKFX_DIVIDE = 20,
parameter integer CLKFX_MULTIPLY = 3,
parameter real CLKDV_DIVIDE = 2.0
)(
input wire clk_in,
output wire clk_out
);
`ifdef FPGA_SPARTAN6
localparam real CLKIN_PERIOD_NS = 1000000000.0 / CLK_IN_HZ;
wire clkfb;
wire clk0;
wire clkfx;
wire locked_unused;
wire [7:0] status_unused;
DCM_SP #(
.CLKDV_DIVIDE(CLKDV_DIVIDE),
.CLKFX_DIVIDE(CLKFX_DIVIDE),
.CLKFX_MULTIPLY(CLKFX_MULTIPLY),
.CLKIN_DIVIDE_BY_2("FALSE"),
.CLKIN_PERIOD(CLKIN_PERIOD_NS),
.CLKOUT_PHASE_SHIFT("NONE"),
.CLK_FEEDBACK("1X"),
.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),
.PHASE_SHIFT(0),
.STARTUP_WAIT("FALSE")
) dcm_sp_i (
.CLKIN(clk_in),
.CLKFB(clkfb),
.CLK0(clk0),
.CLK90(),
.CLK180(),
.CLK270(),
.CLK2X(),
.CLK2X180(),
.CLKFX(clkfx),
.CLKFX180(),
.CLKDV(),
.PSCLK(1'b0),
.PSEN(1'b0),
.PSINCDEC(1'b0),
.PSDONE(),
.LOCKED(locked_unused),
.STATUS(status_unused),
.RST(1'b0),
.DSSEN(1'b0)
);
BUFG clkfb_buf_i (
.I(clk0),
.O(clkfb)
);
BUFG clkout_buf_i (
.I(clkfx),
.O(clk_out)
);
`else
assign clk_out = 1'b0;
wire _unused_clk_in;
wire _unused_clkfx_divide;
wire _unused_clkfx_multiply;
wire _unused_clkdv_divide;
assign _unused_clk_in = clk_in;
assign _unused_clkfx_divide = CLKFX_DIVIDE[0];
assign _unused_clkfx_multiply = CLKFX_MULTIPLY[0];
assign _unused_clkdv_divide = (CLKDV_DIVIDE != 0.0);
`endif
endmodule