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

Subversion Repositories q_rotary_enc

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Papayaved
timeunit 1ns;
2
timeprecision 100ps;
3
 
4
module rot_enc_flt_tb;
5
 
6
        bit clock = 0, sclr = 1;
7
        wire A, B;
8
        bit dir = 0;
9
        wire signed [31:0] bidir_counter;
10
        wire error;
11
        wire ready;
12
 
13
        always #10ns clock++;
14
 
15
        bit rot_dir = 0, run = 0;
16
 
17
        initial begin
18
                repeat(10) @(posedge clock);
19
 
20
                sclr = 1'b0;
21
 
22
                wait(ready);
23
 
24
                repeat(10_000) @(posedge clock);
25
 
26
                rot_dir = 0;
27
                run = 1;
28
 
29
                #1ms
30
 
31
                run = 0;
32
 
33
                #500us
34
 
35
                rot_dir = 1;
36
                run = 1;
37
 
38
                #1ms
39
 
40
                run = 0;
41
 
42
                repeat(10_000) @(posedge clock);
43
 
44
                $stop(2);
45
 
46
        end
47
 
48
        rot_enc_flt dut(.*);
49
        rotary_sensor sensor(.clock, .run, .rot_dir, .A, .B);
50
 
51
endmodule :rot_enc_flt_tb
52
 
53
module rotary_sensor(input clock, run, rot_dir, output A, B);
54
 
55
        bit[1:0] gray[4] = {2'b00, 2'b01, 2'b11, 2'b10};
56
 
57
        localparam BPS = 10_000 * 256 * 4 / 60;
58
        localparam CLOCK_MHZ = 50_000_000;
59
        localparam CNT_MAX = CLOCK_MHZ / BPS - 1;
60
 
61
        int bit_cnt = 0;
62
 
63
        always_ff @(posedge clock)
64
                if (bit_cnt == CNT_MAX)
65
                        bit_cnt <= 0;
66
                else
67
                        bit_cnt <= bit_cnt + 1;
68
 
69
        wire bit_clk = bit_cnt == CNT_MAX;
70
 
71
        bit [1:0] gray_cnt = 0;
72
        always_ff @(posedge clock)
73
                if (bit_clk && run)
74
                        if (rot_dir == 0)
75
                                gray_cnt <= gray_cnt + 1'b1;
76
                        else
77
                                gray_cnt <= gray_cnt - 1'b1;
78
 
79
        assign {B, A} = gray[gray_cnt];
80
 
81
endmodule :rotary_sensor

powered by: WebSVN 2.1.0

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