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