blob: f5e9197854ce912a3802dd956d6c180b9df24542 [file] [log] [blame] [edit]
`default_nettype none
// ============================================================================
module top
(
input wire clk,
input wire [7:0] sw,
output wire [7:0] led
);
// ============================================================================
// Input clock BUFG
wire CLK100;
BUFG bufgctrl(.I(clk), .O(CLK100));
// Clock times 2 divider
reg clk50_ce;
always @(posedge CLK100)
clk50_ce <= !clk50_ce;
wire CLK50;
BUFGCE bufg50 (.I(clk), .CE(clk50_ce), .O(CLK50));
// Reset pulse generator
reg [3:0] rst_sr;
initial rst_sr <= 4'hF;
always @(posedge CLK100)
if (sw[0])
rst_sr <= 4'hF;
else
rst_sr <= rst_sr >> 1;
wire RST = rst_sr[0];
// ============================================================================
// MMCM
wire [6:0] oclk;
wire [6:0] gclk;
wire clk_fb;
wire pwrdwn = sw[1];
wire clkinsel = sw[2];
wire locked;
(* LOC="MMCME2_ADV_X1Y0" *)
MMCME2_ADV #
(
.BANDWIDTH ("{{ bandwidth }}"),
.COMPENSATION ("INTERNAL"),
.CLKIN1_PERIOD (10.0), // 100MHz, actually 50MHz
.CLKIN2_PERIOD (10.0), // 100MHz
.CLKFBOUT_MULT_F ({{ clkfbout_mult |round(3) }}),
.CLKFBOUT_PHASE ({{ clkfbout_phase|round(3) }}),
.DIVCLK_DIVIDE ({{ divclk_divide }}),
{%- if clkout[0].enabled %}
.CLKOUT0_DIVIDE_F ({{ clkout[0].divide|round(3) }}),
.CLKOUT0_DUTY_CYCLE ({{ clkout[0].duty |round(3) }}),
.CLKOUT0_PHASE ({{ clkout[0].phase |round(3) }}),
{%- endif %}
{%- for clk in clkout %}
{%- if clk.enabled and clk.index != 0 %}
.CLKOUT{{ clk.index }}_DIVIDE ({{ clk.divide|round(3) }}),
.CLKOUT{{ clk.index }}_DUTY_CYCLE ({{ clk.duty |round(3) }}),
.CLKOUT{{ clk.index }}_PHASE ({{ clk.phase |round(3) }}),
{%- endif %}
{%- endfor %}
.STARTUP_WAIT ("FALSE")
)
mmcm
(
.CLKIN1 (CLK50),
.CLKIN2 (CLK100),
.CLKINSEL (clkinsel),
.RST (RST),
.PWRDWN (pwrdwn),
.LOCKED (locked),
{% for clk in clkout %}
{%- if clk.enabled %}
.CLKOUT{{ clk.index }} (oclk[{{ clk.index }}]),
{%- endif %}
{%- endfor %}
.CLKFBIN (clk_fb),
.CLKFBOUT (clk_fb)
);
// ============================================================================
// Counters
wire rst = RST || !locked;
{%- for clk in clkout %}
{% if clk.enabled %}
BUFG bufg{{ clk.index }} (.I(oclk[{{ clk.index }}]), .O(gclk[{{ clk.index }}]));
reg [23:0] counter{{ clk.index }};
always @(posedge gclk[{{ clk.index }}] or posedge rst)
if (rst) counter{{ clk.index }} <= 0;
else counter{{ clk.index }} <= counter{{ clk.index }} + 1;
assign led[{{ clk.index }}] = counter{{ clk.index }}[21];
{%- else %}
assign led[{{ clk.index }}] = 1'b0;
{%- endif %}
{%- endfor %}
// ============================================================================
endmodule