/* * Design: ECE 274 - Rotary Counter State Machine * Author: Varadaraj Kamath & Roman Lysecky * Copyright 2009, All Rights Reserved * * Date: September 2, 2009 * */ `timescale 1ns / 1ns module RotaryCounter(Clk, Rst, RotaryA, RotaryB, Cnt); input Clk, Rst; input RotaryA, RotaryB; output reg [4:0] Cnt; parameter S_Idle = 0, S_Clockwise = 1, S_CounterClockwise = 2, S_WaitForIdle = 3; wire RotaryA_D, RotaryB_D; reg [1:0] state; Debouncer Debouncer_A (Clk, Rst, RotaryA, RotaryA_D); Debouncer Debouncer_B (Clk, Rst, RotaryB, RotaryB_D); always @(posedge Clk) begin if (Rst == 1) begin Cnt <= 1; state <= S_Idle; end else begin case (state) S_Idle: begin if (RotaryA_D == 1 && RotaryB_D == 0) begin state <= S_Clockwise; end else if (RotaryA_D == 0 && RotaryB_D == 1) begin state <= S_CounterClockwise; end else begin state <= S_Idle; end end S_Clockwise: begin if (Cnt < 20) begin Cnt <= Cnt + 1; end state <= S_WaitForIdle; end S_CounterClockwise: begin if (Cnt > 1) begin Cnt <= Cnt - 1; end state <= S_WaitForIdle; end S_WaitForIdle: begin if (RotaryA_D == 0 && RotaryB_D == 0) begin state <= S_Idle; end else begin state <= S_WaitForIdle; end end endcase end end endmodule /* * Design: ECE 274 - Debouncer for Rotary inputs * Author: Roman Lysecky * Copyright 2009, All Rights Reserved * * Date: September 2, 2009 * */ `timescale 1ns / 1ns module Debouncer(Clk, Rst, ButtonIn, Debounced); input Clk, Rst; input ButtonIn; output reg Debounced; parameter DebounceDelayCycles = 150000; // 2.5ms at 50,000 cycles per ms parameter S_Init = 0, S_Pause = 1, S_Hold = 2, S_Pause2 = 3; reg [2:0] state; reg [18:0] Cnt; always @(posedge Clk) begin if (Rst==1) begin state <= S_Init; end else begin case (state) S_Init: begin Debounced <= 0; Cnt <= 0; if(ButtonIn) begin state <= S_Pause; Debounced <= 1; end else begin state <= S_Init; end end S_Pause: begin if (!ButtonIn) begin Cnt <= 0; state <= S_Pause; end else if (Cnt == DebounceDelayCycles) begin state <= S_Hold; end else begin Cnt <= Cnt + 1; state <= S_Pause; end end S_Hold: begin if (!ButtonIn) begin Debounced <= 0; state <= S_Pause2; Cnt <= 0; end else begin state <= S_Hold; end end S_Pause2: begin if (ButtonIn) begin Cnt <= 0; state <= S_Pause2; end else if (Cnt == DebounceDelayCycles) begin state <= S_Init; end else begin Cnt <= Cnt + 1; state <= S_Pause2; end end endcase end end endmodule