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


`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