summaryrefslogtreecommitdiff
path: root/homework_1/SRC/duv.sv
diff options
context:
space:
mode:
Diffstat (limited to 'homework_1/SRC/duv.sv')
-rw-r--r--homework_1/SRC/duv.sv51
1 files changed, 51 insertions, 0 deletions
diff --git a/homework_1/SRC/duv.sv b/homework_1/SRC/duv.sv
new file mode 100644
index 0000000..149f574
--- /dev/null
+++ b/homework_1/SRC/duv.sv
@@ -0,0 +1,51 @@
+module duv (
+ input logic clock,
+ input logic reset,
+ input logic input_,
+ output logic output_
+);
+ localparam S0 = 3'b000, // Initial
+ S1 = 3'b001, // Seen "1"
+ S2 = 3'b010, // Seen "11"
+ S3 = 3'b011, // Seen "10"
+ S4 = 3'b100, // Seen "110"
+ S5 = 3'b101; // Seen "101"
+
+ logic [2:0] state, next_state;
+
+ // State register with asynchronous reset
+ always_ff @(posedge clock or posedge reset) begin
+ if (reset) state <= S0;
+ else state <= next_state;
+ end
+
+ // Next state and output logic
+ always_comb begin
+ next_state = state;
+ output_ = 1'b0;
+
+ case (state)
+ S0: next_state = input_ ? S1 : S0;
+ S1: next_state = input_ ? S2 : S3;
+ S2: next_state = input_ ? S2 : S4;
+ S3: next_state = input_ ? S5 : S0;
+ S4: begin
+ if (input_) begin
+ next_state = S5;
+ end else begin
+ next_state = S0;
+ output_ = 1'b1; // Detected "1100"
+ end
+ end
+ S5: begin
+ if (input_) begin
+ next_state = S2;
+ output_ = 1'b1; // Detected "1011"
+ end else begin
+ next_state = S3;
+ end
+ end
+ default: next_state = S0;
+ endcase
+ end
+endmodule