]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/qcounter.vhdl
All SPI stuff moved to rp_spi.c
[fpga/rpi-motor-control.git] / pmsm-control / qcounter.vhdl
1 --
2 -- * Quadrature Signal Decoder *
3 -- Used for IRC sensor interfacing
4 --
5 -- (c) 2010 Marek Peca <hefaistos@gmail.com>
6 --
7 -- license: GNU LGPL and GPLv3+
8 --
9 library ieee;
10 use ieee.std_logic_1164.all;
11 use ieee.std_logic_arith.all;
12 use ieee.std_logic_unsigned.all;
13 use ieee.numeric_std.all;
14
15 entity qcounter is
16 port (
17         clock: in std_logic;
18         reset: in std_logic;
19         a0, b0: in std_logic;
20         qcount: out std_logic_vector (31 downto 0);
21         a_rise, a_fall, b_rise, b_fall, ab_event: out std_logic;
22         ab_error: out std_logic
23 );
24 end qcounter;
25
26 architecture behavioral of qcounter is
27         component dff
28         port (
29                 clock: in std_logic;
30                 d: in std_logic;
31                 q: out std_logic
32         );
33         end component;
34
35         subtype std_logic4 is std_logic_vector (3 downto 0);
36         signal a, b, a_prev, b_prev: std_logic;
37         signal count_prev: std_logic_vector (29 downto 0)
38                 := "000000000000000000000000000000";
39         signal count: std_logic_vector (29 downto 0);
40 begin
41         --ustaleni signalu a mezi tiky hodin
42         --reaguje na nabeznou hranu
43         dff_a: dff
44         port map (
45                 clock => clock,
46                 d => a0,
47                 q => a
48         );
49         
50         --ustaleni signalu b mezi tiky hodin
51         --reaguje na nabeznou hranu
52         dff_b: dff
53         port map (
54                 clock => clock,
55                 d => b0,
56                 q => b
57         );
58   
59         --prvni dva rady kombinacne
60         qcount(0) <= a xor b;
61         qcount(1) <= b;
62         qcount(31 downto 2) <= count;
63   
64         --k cemu tento prosess? jen pro prenos udalosti na piny?
65         comb_event: process (a_prev, b_prev, a, b) --proc je v sensitivity listu i stary stav?? jen kvuli nulovani?
66         begin
67                 a_rise <= '0';
68                 a_fall <= '0';
69                 b_rise <= '0';
70                 b_fall <= '0';
71                 ab_event <= '0';
72                 ab_error <= '0';
73                 if ((a xor a_prev) and (b xor b_prev)) = '1' then -- a i b se zmenily zaroven
74                         -- forbidden double transition
75                         ab_error <= '1';
76                 else
77                         a_rise <= (a xor a_prev) and a; --a nabezna
78                         a_fall <= (a xor a_prev) and not a; --a sestupna
79                         b_rise <= (b xor b_prev) and b; --b nabezna
80                         b_fall <= (b xor b_prev) and not b; --b sestupna
81                         ab_event <= (a xor a_prev) or (b xor b_prev); --a nebo b se zmenily
82                 end if;
83         end process;
84
85         --prechod do 3. radu (binarne)
86         comb_count: process (a_prev, b_prev, a, b, count,count_prev) --proc jsou v sensitivity prev stavy?
87         begin
88                 if (a_prev = '0') and (b_prev = '1') and (a = '0') and (b = '0') then --posun dopredu 
89                         count <= count_prev + 1;
90                 elsif (a_prev = '0') and (b_prev = '0') and (a = '0') and (b = '1') then --posun dozadu
91                         count <= count_prev - 1;
92                 else
93                         count <= count_prev;
94                 end if;
95         end process;
96
97         --s nabeznou hranou hodin ulozime stare (prev) hodnoty, pripadne synchronni reset
98         --proc resuteje count_prev misto count?? neprojevi se tato zmena az pri pruchodu comb_count??
99         seq: process
100         begin
101                 wait until clock'event and clock = '1';
102                 if reset = '1' then
103                         count_prev <= "000000000000000000000000000000";
104                 else
105                         count_prev <= count;
106                 end if;
107                 a_prev <= a;
108                 b_prev <= b;
109         end process;
110         
111 end behavioral;
112 --Poznamky
113         --proc pouzivan count_prev a neprirazuji rovnou do count?