rust_hdl_widgets/
auto_reset.rs

1use crate::dff::DFF;
2use rust_hdl_core::prelude::*;
3
4#[derive(Clone, Debug, LogicBlock, Default)]
5pub struct AutoReset {
6    pub reset: Signal<Out, Bit>,
7    pub clock: Signal<In, Clock>,
8    dff: DFF<Bits<8>>,
9}
10
11impl Logic for AutoReset {
12    #[hdl_gen]
13    fn update(&mut self) {
14        self.dff.clock.next = self.clock.val();
15        self.dff.d.next = self.dff.q.val();
16        self.reset.next = false.into();
17        if !self.dff.q.val().all() {
18            self.dff.d.next = self.dff.q.val() + 1;
19            self.reset.next = true.into();
20        }
21    }
22}
23
24#[test]
25fn test_synch_reset_synchronizes() {
26    let mut uut = AutoReset::default();
27    uut.connect_all();
28    yosys_validate("sync_reset", &generate_verilog(&uut)).unwrap();
29}