`timescale 1ns / 1ps
module lab09 (
input clk,
output [6:0] minuteTens,
output [6:0] minuteOnes,
output [6:0] hourOnes,
output [6:0] hourTens
);
wire clk1Hz;
fastGenerator fastGnrtr(
.clk(clk),
.clk1Hz(clk1Hz)
);
// ------------------------------------------------------------
// Единицы минут: 0..9, инкремент каждую секунду
// ------------------------------------------------------------
wire [3:0] minuteOnesOut;
wire minuteTensInc; // перенос 9 -> 0
assign minuteTensInc = (minuteOnesOut == 4'd9);
counter minuteOnesCnt (
.clk(clk1Hz),
.inc(1'b1), // считает каждую секунду
.period(4'd9), // 0..9
.out(minuteOnesOut),
.reset(1'b0)
);
display dispMinuteOnes (
.in(minuteOnesOut),
.enable(1'b1),
.mode(1'b0),
.out(minuteOnes)
);
// ------------------------------------------------------------
// Десятки минут: 0..5, инкремент по переносу от единиц минут
// ------------------------------------------------------------
wire [3:0] minuteTensOut;
wire hourOnesInc; // перенос 5 -> 0 (при 59 минутах)
assign hourOnesInc = minuteTensInc && (minuteTensOut == 4'd5);
counter minuteTensCnt (
.clk(clk1Hz),
.inc(minuteTensInc), // +1 только при 9 -> 0 единиц минут
.period(4'd5), // 0..5
.out(minuteTensOut),
.reset(1'b0)
);
display dispMinuteTens (
.in(minuteTensOut),
.enable(1'b1),
.mode(1'b0),
.out(minuteTens)
);
// ------------------------------------------------------------
// Единицы часов: 0..9, но при hourTens==2 максимум 3
// ------------------------------------------------------------
wire [3:0] hourOnesOut;
wire hourTensInc; // перенос единиц часов -> десятки часов
wire hourOnesMax; // достигнут максимум единиц часов
// максимум единиц: 9 обычно, 3 при двух десятках
assign hourOnesMax = (hourTensOut == 4'd2) ? (hourOnesOut == 4'd3)
: (hourOnesOut == 4'd9);
assign hourTensInc = hourOnesInc && hourOnesMax;
counter hourOnesCnt (
.clk(clk1Hz),
.inc(hourOnesInc), // +1 при переходе минут 59 -> 00
.period(4'd9), // базовый период 0..9
.out(hourOnesOut),
.reset(hourTensInc) // сброс при переходе на десятки часов
);
display dispHourOnes (
.in(hourOnesOut),
.enable(1'b1),
.mode(1'b0),
.out(hourOnes)
);
// ------------------------------------------------------------
// Десятки часов: 0..2
// ------------------------------------------------------------
wire [3:0] hourTensOut;
wire resetAll; // 23:59 -> 00:00
// сброс всех часов при переходе 2 -> 0 десятков часов
assign resetAll = hourTensInc && (hourTensOut == 4'd2);
counter hourTensCnt (
.clk(clk1Hz),
.inc(hourTensInc), // +1 при переносе единиц часов
.period(4'd2), // 0..2
.out(hourTensOut),
.reset(resetAll) // 2 -> 0
);
display dispHourTens (
.in(hourTensOut),
.enable(1'b1),
.mode(1'b0),
.out(hourTens)
);
endmodule