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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/// Rising Edge Trigger (R_TRIG)
///
/// Detects a rising edge (false → true transition) on the input signal.
/// The output `q` is `true` for exactly one cycle when the input `clk`
/// transitions from `false` to `true`.
///
/// This is equivalent to the IEC 61131-3 R_TRIG function block.
///
/// # Example
///
/// ```
/// use autocore_std::fb::RTrig;
///
/// let mut trigger = RTrig::new();
///
/// // No edge yet
/// assert_eq!(trigger.call(false), false);
///
/// // Rising edge detected!
/// assert_eq!(trigger.call(true), true);
///
/// // Signal still high, but edge already passed
/// assert_eq!(trigger.call(true), false);
/// assert_eq!(trigger.call(true), false);
///
/// // Signal goes low
/// assert_eq!(trigger.call(false), false);
///
/// // Another rising edge
/// assert_eq!(trigger.call(true), true);
/// ```
///
/// # Timing Diagram
///
/// ```text
/// clk: _____|‾‾‾‾‾‾‾‾‾|_____|‾‾‾‾‾
/// q: _____|‾|_____________|‾|____
/// ```
///
/// # Use Cases
///
/// - Detecting button presses (trigger on press, not hold)
/// - Counting events (increment counter on each rising edge)
/// - State machine transitions