Hallo!
Danke erst mal und tschuldigung, dass ich jetzt erst von mir hören
lasse. War krank und bin einige Tage durchgecheckt worden.
Ja, da ist mir einiges begrifflich durcheinander gekommen. :-( Lothar
Miller hat es richtig gestellt. Meinte ich allerdings auch. An berndl
kann man sehen wie ein Thread schon wegen solcher Fehler einen miesen
Start bekommt und zum scheitern verurteilt ist.
Also meine Frage ist, wie ich sinnig mit dem Modul zum Encoder einen
Zähler laufen lassen würde:
1 | ----------------------------------------------------------
|
2 | --pkg_bin2bcd
|
3 | ----------------------------------------------------------
|
4 | --PACKAGE
|
5 | ----------------------------------------------------------
|
6 | LIBRARY IEEE;
|
7 | USE IEEE.STD_LOGIC_1164.ALL;
|
8 | USE IEEE.NUMERIC_STD.ALL;
|
9 |
|
10 | package pkg_quadrature_encoder is
|
11 | component quadrature_encoder is
|
12 | Port ( isl_clk : in STD_LOGIC;
|
13 | isl_a : in STD_LOGIC;
|
14 | isl_b : in STD_LOGIC;
|
15 | osl_cout_en : out STD_LOGIC;
|
16 | osl_count_dir : out STD_LOGIC);
|
17 | end component quadrature_encoder;
|
18 | end pkg_quadrature_encoder;
|
19 | ----------------------------------------------------------
|
20 | --pkg_bin2bcd
|
21 | ----------------------------------------------------------
|
22 | --ENTITY
|
23 | ----------------------------------------------------------
|
24 | LIBRARY IEEE;
|
25 | USE IEEE.STD_LOGIC_1164.ALL;
|
26 | USE IEEE.NUMERIC_STD.ALL;
|
27 | USE pkg_quadrature_encoder.all;
|
28 |
|
29 | entity quadrature_encoder is
|
30 | Port ( isl_clk : in STD_LOGIC;
|
31 | isl_a : in STD_LOGIC;
|
32 | isl_b : in STD_LOGIC;
|
33 | osl_cout_en : out STD_LOGIC;
|
34 | osl_count_dir : out STD_LOGIC);
|
35 | end quadrature_encoder;
|
36 |
|
37 | architecture Behavioral of quadrature_encoder is
|
38 | signal slv_a_reg : std_logic_vector(2 downto 0);
|
39 | signal slv_b_reg : std_logic_vector(2 downto 0);
|
40 | begin
|
41 |
|
42 | process begin
|
43 | wait until rising_edge(isl_clk);
|
44 | slv_a_reg(2 downto 1) <= slv_a_reg(1 downto 0);
|
45 | slv_b_reg(2 downto 1) <= slv_b_reg(1 downto 0);
|
46 | slv_a_reg(0) <= isl_a;
|
47 | slv_b_reg(0) <= isl_b;
|
48 | end process;
|
49 |
|
50 | osl_cout_en <= (slv_a_reg(2) xor slv_a_reg(1)) xor (slv_b_reg(2) xor slv_b_reg(1));
|
51 | osl_count_dir <= slv_a_reg(1) xor slv_b_reg(2);
|
52 |
|
53 | end Behavioral;
|
Version a)
Bekommt ein Counter dann sinnvollerweise z.B. osl_cout_en und
osl_cout_dir als Eingangssignale und fragt die ala
1 | process begin
|
2 | if rising_edge(osl_cout_en) then
|
3 | if osl_cout_dir = '1' then
|
4 | counter_value <= counter_value + 1;
|
5 | else
|
6 | counter_value <= counter_value - 1;
|
7 | end if;
|
8 | end if;
|
9 | end process;
|
oder
Version b) isl_clk ist auch ein Eingangssignal und ich mache
1 | process begin
|
2 | wait until rising_edge(isl_clk);
|
3 |
|
4 | if osl_cout_en = 1 and osl_cout_dir = 1 then
|
5 | counter_value <= counter_value + 1;
|
6 | else if osl_cout_en = 1 and osl_cout_dir = 1 then
|
7 | counter_value <= counter_value - 1;
|
8 | end if;
|
9 | end process;
|
Bei dieser Version habe ich eine gravierende Verständnishürde! Bei einem
Takt erzeugt das Modul für die quadratur-dekodierung als Kombinatorik
die Signale osl_cout_en und osl_cout_dir. Aber bei dem selben Takt soll
dann das Ergebnis schon bei einem anderen Prozess in dem anderen Modul
counter ausgewertet werden können....aber das geht doch gar nicht. Bei
dem Takt müssen doch erst Gatter laufen und das Signal über Leitungen
flitzen!?
Ich HOFFE sehr ihr lest noch mal meinen korrigierten Thread und könnt
mir helfen!
Allerherzlichen Dank