-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTimer.v
91 lines (83 loc) · 3.85 KB
/
Timer.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Timer 模块说明:
// 该模块用于产生多个定时脉冲信号:1秒、500毫秒、250毫秒、200毫秒、100毫秒。
// 输入信号:
// clk : 时钟信号,100Hz 时钟信号,周期为 0.01秒。
// rst_n : 低电平复位信号,复位时所有计数器和脉冲信号清零。
// 输出信号:
// timer_1s : 1秒脉冲信号,高电平持续一个时钟周期。
// timer_500ms : 500毫秒脉冲信号,高电平持续一个时钟周期。
// timer_250ms : 250毫秒脉冲信号,高电平持续一个时钟周期。
// timer_200ms : 200毫秒脉冲信号,高电平持续一个时钟周期。
// timer_100ms : 100毫秒脉冲信号,高电平持续一个时钟周期。
module Timer(
input clk, // 100Hz 时钟信号 (周期为0.01秒)
input rst_n, // 低电平复位信号
output reg timer_1s, // 1秒脉冲信号
output reg timer_500ms, // 500毫秒脉冲信号
output reg timer_250ms, // 250毫秒脉冲信号
output reg timer_200ms, // 200毫秒脉冲信号
output reg timer_100ms // 100毫秒脉冲信号
);
// 使用合适的计数器位宽
reg [6:0] counter_1s; // 最大计数值为100,需要7位
reg [5:0] counter_500ms; // 最大计数值为50,需要6位
reg [4:0] counter_250ms; // 最大计数值为25,需要5位
reg [4:0] counter_200ms; // 最大计数值为20,需要5位
reg [3:0] counter_100ms; // 最大计数值为10,需要4位
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// 复位所有计数器和定时信号
counter_1s <= 7'd0;
counter_500ms <= 6'd0;
counter_250ms <= 5'd0;
counter_200ms <= 5'd0;
counter_100ms <= 4'd0;
timer_1s <= 1'b0;
timer_500ms <= 1'b0;
timer_250ms <= 1'b0;
timer_200ms <= 1'b0;
timer_100ms <= 1'b0;
end else begin
// 1秒计数器
if (counter_1s < 100 - 1) begin
counter_1s <= counter_1s + 1;
timer_1s <= 1'b0; // 计数过程中保持低电平
end else begin
counter_1s <= 7'd0;
timer_1s <= 1'b1; // 达到计数目标,产生一个时钟周期宽度的脉冲
end
// 500毫秒计数器
if (counter_500ms < 50 - 1) begin
counter_500ms <= counter_500ms + 1;
timer_500ms <= 1'b0; // 计数过程中保持低电平
end else begin
counter_500ms <= 6'd0;
timer_500ms <= 1'b1; // 达到计数目标,产生一个时钟周期宽度的脉冲
end
// 250毫秒计数器
if (counter_250ms < 25 - 1) begin
counter_250ms <= counter_250ms + 1;
timer_250ms <= 1'b0; // 计数过程中保持低电平
end else begin
counter_250ms <= 5'd0;
timer_250ms <= 1'b1; // 达到计数目标,产生一个时钟周期宽度的脉冲
end
// 200毫秒计数器
if (counter_200ms < 20 - 1) begin
counter_200ms <= counter_200ms + 1;
timer_200ms <= 1'b0; // 计数过程中保持低电平
end else begin
counter_200ms <= 5'd0;
timer_200ms <= 1'b1; // 达到计数目标,产生一个时钟周期宽度的脉冲
end
// 100毫秒计数器
if (counter_100ms < 10 - 1) begin
counter_100ms <= counter_100ms + 1;
timer_100ms <= 1'b0; // 计数过程中保持低电平
end else begin
counter_100ms <= 4'd0;
timer_100ms <= 1'b1; // 达到计数目标,产生一个时钟周期宽度的脉冲
end
end
end
endmodule