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