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

Subversion Repositories quadraturecount

[/] [quadraturecount/] [trunk/] [QuadratureCounter.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 franksdeve
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_SIGNED.ALL;
5
 
6
-- c2003 Franks Development, LLC
7
-- http://www.franks-development.com
8
-- !This source is distributed under the terms & conditions specified at opencores.org
9
 
10
--resource or companion to this code: 
11
        -- Xilinx Application note 12 - "Quadrature Phase Decoder" - xapp012.pdf
12
        -- no longer appears on xilinx website (to best of my knowledge), perhaps it has been superceeded?
13
 
14
--this code was origonally intended for use on Xilinx XPLA3 'coolrunner' CPLD devices
15
--origonally compiled/synthesized with Xilinx 'Webpack' 5.2 software
16
 
17
--How we 'talk' to the outside world:
18
entity QuadratureCounterPorts is
19
    Port ( clock : in std_logic;        --system clock, i.e. 10MHz oscillator
20
                 QuadA : in std_logic;  --first input from quadrature device  (i.e. optical disk encoder)
21
                 QuadB : in std_logic;  --second input from quadrature device (i.e. optical disk encoder)
22
                 CounterValue : out std_logic_vector(15 downto 0) --just an example debuggin output
23
                );
24
end QuadratureCounterPorts;
25
 
26
--What we 'do':
27
architecture QuadratureCounter of QuadratureCounterPorts is
28
 
29
        -- local 'variables' or 'registers'
30
 
31
        --This is the counter for how many quadrature ticks have gone past.
32
        --the size of this counter is dependant on how far you need to count
33
        --it was origonally used with a circular disk encoder having 2048 ticks/revolution
34
        --thus this 16-bit count could hold 2^15 ticks in either direction, or a total
35
        --of 32768/2048 = 16 revolutions in either direction.  if the disk
36
        --was turned more than 16 times in a given direction, the counter overflows
37
        --and the origonal location is lost.  If you had a linear instead of 
38
        --circular encoder that physically could not move more than 2048 ticks,
39
        --then Count would only need to be 11 downto 0, and you could count
40
        --2048 ticks in either direction, regardless of the position of the 
41
        --encoder at system bootup.
42
        signal Count : std_logic_vector(15 downto 0);
43
 
44
        --this is the signal from the quadrature logic that it is time to change
45
        --the value of the counter on this clock signal (either + or -)
46
        signal CountEnable : std_logic;
47
 
48
        --should we increment or decrement count?
49
        signal CountDirection : std_logic;
50
 
51
        --where all the 'work' is done: quadraturedecoder.vhd
52
        component QuadratureDecoderPorts
53
                Port (
54
                                clock     : in    std_logic;
55
                                QuadA     : in    std_logic;
56
                                QuadB     : in    std_logic;
57 6 franksdeve
                                Direction : out std_logic;
58 2 franksdeve
                                CountEnable : out std_logic
59
                        );
60
        end component;
61
 
62
        begin --architecture QuadratureCounter           
63
 
64
        --instanciate the decoder
65
        iQuadratureDecoder: QuadratureDecoderPorts
66
        port map        (
67
                                clock => clock,
68
                        QuadA => QuadA,
69
                                QuadB => QuadB,
70 6 franksdeve
                                Direction => CountDirection,
71 2 franksdeve
                        CountEnable => CountEnable
72
                        );
73
 
74
 
75
        -- do our actual work every clock cycle
76
        process(clock)
77
        begin
78
 
79
                --keep track of the counter
80
                if ( (clock'event) and (clock = '1') ) then
81
 
82
                        if (CountEnable = '1') then
83
 
84
                                if (CountDirection = '1') then Count <= Count + "0000000000000001"; end if;
85
                                if (CountDirection = '0') then Count <= Count - "0000000000000001"; end if;
86
 
87
                        end if;
88
 
89
                end if; --clock'event
90
 
91
                --!!!!!!!!!!!INSERT SOMETHING USEFULL HERE!!!!!!!!!!!
92
                --This is where you do actual work based on the value of the counter
93
                --for instance, I will just output the value of the counter
94
                --led's on an output like this are very useful - you can see the top
95
                --bits light when moved backwards from initial position (count goes negative)
96
                CounterValue <= Count;
97
 
98
        end process; --(clock)
99
 
100
end QuadratureCounter;

powered by: WebSVN 2.1.0

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