package GlitchFilter; import Cntrs::*; (* always_enabled="_write",always_ready="_read" *) module mkGlitchFilter(Integer hysteresis, bit init_value, Reg#(bit) ifc); Wire#(bit) in <- mkBypassWire(); UCount cnt <- mkUCount(init_value == 0 ? 0 : hysteresis, hysteresis); Reg#(bit) out[2] <- mkCReg(2, init_value); (* no_implicit_conditions, fire_when_enabled *) rule incr (cnt.isLessThan(fromInteger(hysteresis)) && in == 1); cnt.incr(1); endrule (* no_implicit_conditions, fire_when_enabled *) rule decr (cnt.isGreaterThan(0) && in == 0); cnt.decr(1); endrule (* no_implicit_conditions, fire_when_enabled *) rule set_out (cnt.isEqual(0) || cnt.isEqual(fromInteger(hysteresis))); out[0] <= cnt.isEqual(0) ? 0 : 1; endrule method _write = in._write; method _read = out[1]._read; endmodule endpackage