rust_hdl_widgets/
edge_detector.rs1use rust_hdl_core::prelude::*;
2
3use crate::{dff::DFF, dff_setup};
4
5#[derive(LogicBlock)]
6pub struct EdgeDetector {
7 pub input_signal: Signal<In, Bit>,
8 pub edge_signal: Signal<Out, Bit>,
9 pub clock: Signal<In, Clock>,
10 prev: DFF<Bit>,
11 current: DFF<Bit>,
12 is_rising: Constant<Bit>,
13}
14
15impl EdgeDetector {
16 pub fn new(is_rising: bool) -> Self {
17 Self {
18 input_signal: Default::default(),
19 edge_signal: Default::default(),
20 clock: Default::default(),
21 prev: Default::default(),
22 current: Default::default(),
23 is_rising: Constant::new(is_rising),
24 }
25 }
26}
27
28impl Logic for EdgeDetector {
29 #[hdl_gen]
30 fn update(&mut self) {
31 dff_setup!(self, clock, prev, current);
32 self.prev.d.next = self.current.q.val();
33 self.current.d.next = self.is_rising.val() ^ self.input_signal.val();
34 self.edge_signal.next = !self.current.q.val() & self.prev.q.val();
35 }
36}
37
38#[test]
39fn test_edge_detector_synthesizes() {
40 let mut uut = EdgeDetector::new(false);
41 uut.connect_all();
42 yosys_validate("edge", &generate_verilog(&uut)).unwrap();
43}