55 lines
1.4 KiB
Verilog
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 |