Загрузка данных


module schotchik2(
    input reset,
    input [1:0] button,
    input clk,
    output reg [6:0] SevenSeg,
    output reg [7:0] select
);
    reg [6:0] segments [0:15];
    reg [15:0] counter;
    initial begin
        segments[0]  = 7'b1000000;
        segments[1]  = 7'b1111001;
        segments[2]  = 7'b0100100;
        segments[3]  = 7'b0110000;
        segments[4]  = 7'b0011001;
        segments[5]  = 7'b0010010;
        segments[6]  = 7'b0000010;
        segments[7]  = 7'b1111000;
        segments[8]  = 7'b0000000;
        segments[9]  = 7'b0010000;
        segments[10] = 7'b0001000;
        segments[11] = 7'b0000011;
        segments[12] = 7'b1000110;
        segments[13] = 7'b0100001;
        segments[14] = 7'b0000110;
        segments[15] = 7'b0001110;
        counter = 16'd0;
    end
    // Переключение разрядов индикатора
    reg [1:0] dynamic_temp = 2'b00;
    reg [15:0] refresh_counter = 16'd0;
    wire refresh_enable = (refresh_counter == 16'd1000);
    // Синхронизация кнопок
    reg [1:0] button_d = 2'b11;
    reg [1:0] button_d_d = 2'b11;
    // Антидребезг
    reg [19:0] debounce_cnt = 20'd0;
    reg [1:0] button_stable = 2'b11;
    reg [1:0] button_prev = 2'b11;
    always @(posedge clk) begin
        // Обновление индикатора
        if (refresh_enable) begin
            refresh_counter <= 16'd0;
            dynamic_temp <= dynamic_temp + 1'b1;
        end else begin
            refresh_counter <= refresh_counter + 1'b1;
        end
        if (refresh_enable) begin
            case (dynamic_temp)
                2'b00: begin
                    SevenSeg <= segments[(counter >> 12) & 4'hF];
                    select <= 8'b01111111;
                end
                2'b01: begin
                    SevenSeg <= segments[(counter >> 8) & 4'hF];
                    select <= 8'b10111111;
                end
                2'b10: begin
                    SevenSeg <= segments[(counter >> 4) & 4'hF];
                    select <= 8'b11011111;
                end
                2'b11: begin
                    SevenSeg <= segments[counter & 4'hF];
                    select <= 8'b11101111;
                end
            endcase
        end
        // Синхронизация кнопок
        button_d <= button;
        button_d_d <= button_d;
        // Сброс активен низким уровнем
        if (!reset) begin
            counter <= 16'd0;
            debounce_cnt <= 20'd0;
            button_stable <= 2'b11;
            button_prev <= 2'b11;
        end else begin
            // Фильтрация дребезга кнопок
            if (button_d_d == button_stable) begin
                debounce_cnt <= 20'd0;
            end else if (debounce_cnt == 20'd999999) begin
                button_stable <= button_d_d;
                debounce_cnt <= 20'd0;
            end else begin
                debounce_cnt <= debounce_cnt + 1'b1;
            end
            // Одно изменение на каждое нажатие
            if (button_stable != button_prev) begin
                // Плюс
                if (button_stable == 2'b01) begin
                    if (counter < 16'hFFFF)
                        counter <= counter + 16'd1;
                end
                // Минус
                else if (button_stable == 2'b10) begin
                    if (counter > 16'd0)
                        counter <= counter - 16'd1;
                end
            end
            button_prev <= button_stable;
        end
    end
endmodule