2 -- * Quadrature Signal Decoder *
3 -- Used for IRC sensor interfacing
5 -- (c) 2010 Marek Peca <hefaistos@gmail.com>
7 -- license: GNU LGPL and GPLv3+
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;
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
26 architecture behavioral of qcounter is
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);
41 --ustaleni signalu a mezi tiky hodin
42 --reaguje na nabeznou hranu
50 --ustaleni signalu b mezi tiky hodin
51 --reaguje na nabeznou hranu
59 --prvni dva rady kombinacne
62 qcount(31 downto 2) <= count;
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?
73 if ((a xor a_prev) and (b xor b_prev)) = '1' then -- a i b se zmenily zaroven
74 -- forbidden double transition
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
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?
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;
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??
101 wait until clock'event and clock = '1';
103 count_prev <= "000000000000000000000000000000";
113 --proc pouzivan count_prev a neprirazuji rovnou do count?