Quartus_blink/blink.v
2026-05-13 07:54:08 +03:00

55 lines
1.4 KiB
Verilog

module blink #(
// Выбор частоты мигания (F_BLINK), Гц:
// 1 -> 1
// 2.5 -> 25 (см. ниже, делим на 10)
// 5 -> 5
// 10 -> 10
parameter integer MODE = 4 // по умолчанию 1 Гц
)(
input wire clk, // 50 MHz
output reg led,
output reg pin,
output reg pin_10
);
localparam integer F_CLK = 50_000_000;
// Предрасчитанные MAX_COUNT для половины периода:
//
// 1 Гц: T=1 c → T/2=0.5 c → 25_000_000
// 2.5 Гц: T=0.4 c → T/2=0.2 c → 10_000_000
// 5 Гц: T=0.2 c → T/2=0.1 c → 5_000_000
// 10 Гц: T=0.1 c → T/2=0.05 c → 2_500_000
localparam integer MAX_1HZ = 25_000_000 - 1;
localparam integer MAX_2_5HZ = 10_000_000 - 1;
localparam integer MAX_5HZ = 5_000_000 - 1;
localparam integer MAX_10HZ = 2_500_000 - 1;
// Выбор MAX_COUNT по MODE
// MODE:
// 1 -> 1 Гц
// 2 -> 2.5 Гц
// 3 -> 5 Гц
// 4 -> 10 Гц
localparam integer MAX_COUNT =
(MODE == 1) ? MAX_1HZ :
(MODE == 2) ? MAX_2_5HZ :
(MODE == 3) ? MAX_5HZ :
(MODE == 4) ? MAX_10HZ :
MAX_1HZ; // по умолчанию 1 Гц
reg [25:0] cnt; // хватает до > 33 млн (2^25 = 33_554_432)
always @(posedge clk) begin
if (cnt >= MAX_COUNT) begin
cnt <= 0;
led <= ~led;
pin <= led;
pin_10 <= led;
end else begin
cnt <= cnt + 1;
end
end
endmodule