| `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 |