31 lines
862 B
Plaintext
31 lines
862 B
Plaintext
|
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
|