Vielen Dank für die Info, an die Initialisierung habe ich nicht gedacht!
Ich habe den Code umgebaut und mit einem Schieberegister realisiert, das
funktioniert, jedoch habe ich ein ganz komisches Phänomen.
Ich gebe dem CPLD folgenden Ablauf vor:
100us Phase 0
1,5ms Pause (sEN = '0')
100us Phase 90
1,5ms Pause (sEN = '0')
100us Phase 180
1,5ms Pause (sEN = '0')
100us Phase 270
1,5ms Pause (sEN = '0')
20ms Pause
Das ganze wird in einer Endlosschleife wiederholt. Wenn ich mir den
Output am Oszi ansehe, habe ich manchmal (jeder 10. - 20. Durchlauf) ein
fehlerhaftes Signal.
11100110011... oder
10110011001... oder
00011001100... oder
10001000100... oder ähnliche
wie kann das passieren?
der CPLD läuft mit 80MHz
Vielen Dank für die Hilfe!
Roman
1 | entity clkgen is
|
2 | port (
|
3 | CLKI : in STD_LOGIC;
|
4 | RST : in STD_LOGIC;
|
5 | LEDEN : in STD_LOGIC_VECTOR(1 downto 0);
|
6 | PHSEL : in STD_LOGIC_VECTOR(1 downto 0);
|
7 | TOFO : out STD_LOGIC;
|
8 | LEDOA : out STD_LOGIC;
|
9 | LEDOB : out STD_LOGIC
|
10 | );
|
11 | end clkgen;
|
12 |
|
13 | architecture behavioural of clkgen is
|
14 | signal sPH0 : STD_LOGIC;
|
15 | signal sPH1 : STD_LOGIC;
|
16 | signal sPH2 : STD_LOGIC;
|
17 | signal sPH3 : STD_LOGIC;
|
18 | signal sINT0 : STD_LOGIC;
|
19 | signal sINT1 : STD_LOGIC;
|
20 | signal sINT2 : STD_LOGIC;
|
21 | signal sINT3 : STD_LOGIC;
|
22 | signal sEN : STD_LOGIC;
|
23 | signal sLEDO : STD_LOGIC;
|
24 | signal sREG : STD_LOGIC_VECTOR(3 downto 0);
|
25 | constant cINIT : STD_LOGIC_VECTOR(3 downto 0) := "1100";
|
26 | begin
|
27 | generate: process (CLKI, RST)
|
28 | begin
|
29 | if RST = '0' then
|
30 | sREG <= cINIT;
|
31 | sPH0 <= sREG(3);
|
32 | sPH1 <= sREG(0);
|
33 | sPH2 <= sREG(1);
|
34 | sPH3 <= sREG(2);
|
35 | else
|
36 | if rising_edge(CLKI) then
|
37 | if sEN = '1' then
|
38 | sPH0 <= sREG(3);
|
39 | sPH1 <= sREG(0);
|
40 | sPH2 <= sREG(1);
|
41 | sPH3 <= sREG(2);
|
42 | sREG <= sREG(2 downto 0) & sREG(3); -- rotate left
|
43 | else
|
44 | sREG <= cINIT;
|
45 | end if;
|
46 | end if;
|
47 | end if;
|
48 | end process;
|
49 |
|
50 | sEN <= LEDEN(1) OR LEDEN(0);
|
51 | TOFO <= sPH0 AND sEN;
|
52 | sINT0 <= NOT(PHSEL(1)) AND NOT(PHSEL(0)) AND sPH0;
|
53 | sINT1 <= NOT(PHSEL(1)) AND PHSEL(0) AND sPH1;
|
54 | sINT2 <= PHSEL(1) AND NOT(PHSEL(0)) AND sPH2;
|
55 | sINT3 <= PHSEL(1) AND PHSEL(0) AND sPH3;
|
56 | sLEDO <= sINT0 OR sINT1 OR sINT2 OR sINT3;
|
57 | LEDOA <= sLEDO AND sEN;
|
58 | LEDOB <= sLEDO AND sEN;
|
59 |
|
60 | end behavioural;
|