/* threeOnes implements an FSM that outputs a 1 on the 1-bit output (detect) * when three consecutive 1's are seen on the 1-bit input stream (w). Also * takes 1-bit clock (clk) and 1-bit reset (reset) inputs. */ module threeOnes (clk, reset, w, detect); input logic clk, reset, w; output logic detect; // State encoding - state names represent how many 1's have been seen. // Signals ps = "Present State" and ns = "Next State". enum {zero, one, two} ps, ns; // Next State logic - "advance" if w == 1, otherwise "reset" to state zero. always_comb case (ps) zero: ns = w ? one : zero; one: ns = w ? two : zero; two: ns = w ? two : zero; default: ns = zero; endcase // Output logic - only if 3rd one is seen assign detect = (ps == two) && w; // Sequential logic (DFFs) - reset state is zero. always_ff @(posedge clk) ps <= reset ? zero : ns; endmodule // threeOnes