`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Engineer: Niels Smidth // // Create Date: 06/01/2015 08:40:32 PM // Module Name: encoder // Project Name: CPE439 Oscope // Target Devices: Zybo // Tool Versions: 2014.4 // Description: Takes quadrature inputs of encoder and generates positive/negative // count value. RST input resets this count value. // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module encoder( input logic clk, input logic quadA, input logic quadB, input logic rst, output logic [5:0] count ); logic [1:0] state; logic [1:0] next_state; initial begin count = 0; state = 'b00; next_state = 'b00; end always @(posedge clk) begin // State : QuadA = QuadB = 0 if (state == 'b00) begin if (quadA == 1) begin next_state = 'b10; count = count + 1; end else if (quadB == 1) begin next_state = 'b01; count = count - 1; end end // State : QuadA = 0, QuadB = 1 else if (state == 'b01) begin if (quadA == 1) begin next_state = 'b11; count = count - 1; end else if (quadB == 0) begin next_state = 'b00; count = count + 1; end end // State : QuadA = 1, QuadB = 0 else if (state == 'b10) begin if (quadA == 0) begin next_state = 'b00; count = count - 1; end else if (quadB == 1) begin next_state = 'b11; count = count + 1; end end // State : QuadA = 1, QuadB = 1 else if (state == 'b11) begin if (quadA == 0) begin next_state = 'b01; count = count + 1; end else if (quadB == 0) begin next_state = 'b10; count = count - 1; end end // Reset the count if RST == 1 if (rst == 1) count = 0; // Advance states state = next_state; end endmodule