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