OpenCores
URL https://opencores.org/ocsvn/q_rotary_enc/q_rotary_enc/trunk

Subversion Repositories q_rotary_enc

[/] [q_rotary_enc/] [q_rotary_enc.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Papayaved
/*
2
        Counter for quadrature rotary encoder.
3
        Module with low-pass filter for A, B signals is rot_enc_flt.sv
4
*/
5
 
6
`ifndef _q_rotary_enc_
7
`define _q_rotary_enc_
8
 
9
module q_rotary_enc(
10
        input clock, sclr, ena,
11
        input dir, // main count direction. 0 - direct count, 1 - reverse
12
        input A, B, // signals from sensor. Signals /A, /B/, Z, /Z don't use. A, /A, B, /B more good connect to optocouplers
13
        output reg signed [31:0] bidir_counter, // current relative position
14
        output reg error // A, B error. For to clear error use sclr signal
15
);
16
 
17
        localparam bit[1:0] grey_inc2[4] = '{2'b01, 2'b11, 2'b00, 2'b10};
18
        localparam bit[1:0] grey_dec2[4] = '{2'b10, 2'b00, 2'b11, 2'b01};
19
 
20
        wire [1:0] cur_code;
21
        reg [1:0] old_code = '0;
22
 
23
        assign cur_code = (dir) ? {A, B} : {B, A};
24
 
25
        always_ff @(posedge clock)
26
                old_code <= cur_code;
27
 
28
        wire cnt_ena = old_code != cur_code;
29
        wire inc = cnt_ena && cur_code == grey_inc2[old_code];
30
        wire dec = cnt_ena && cur_code == grey_dec2[old_code];
31
        wire err = cnt_ena && !(inc || dec);
32
 
33
        always_ff @(posedge clock)
34
                if (sclr)                       bidir_counter <= 'sh0;
35
                else if (ena)
36
                        if (inc)                        bidir_counter <= bidir_counter + 1'b1;
37
                        else if (dec)   bidir_counter <= bidir_counter - 1'b1;
38
 
39
        always_ff @(posedge clock)
40
                if (sclr)                               error <= 1'b0;
41
                else if (ena && err)	error <= 1'b1;
42
 
43
endmodule :q_rotary_enc
44
 
45
`endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.