Hallo,
für eine Testschaltung habe ich ein kleines Design entworfen wo je nach
Eingangsadresse ein 8bit Wert in einem High oder Low Latch gespeichert
wird.
Das ganze funktioniert soweit erst einmal schon, nur leider habe ich das
Problem, dass mit dem Reset was nicht hinhaut.
Lege ich die Betriebsspannung an startet das Latch mit 0 auf allen Bits,
so wie vorgegeben. Gebe ich hier 1 vor startet das Latch auch mit 1.
Wenn ich nun einen Wert im Latch speicher und dann den externen RESET
betätige schalten alle Pins so wie im Design vorgegeben. Lasse ich den
RESET wieder, dann besitzt das Latch jedoch immer noch den vorher
gespeicherten Wert, obwohl ich einen anderen RESET-Wert definiert hatte.
Erst wenn ich die Betriebsspannung abschalte und wieder einschalte ist
das Latch wirklich wieder auf 0.
Das ist jetzt erst einmal nicht besonders schlimm, an sich geht ja
bisher alles so wie gewollt, es verwundert mich jedoch. Vor allem, da
die einfache Simulation das von mir erwartete Verhalten zeigt. Erst die
Post-Fix Simulation zeigt dann das gleiche "Fehlverhalten" wie der CPLD.
Ich bin nicht besonders erfahren was VHDL angeht, habe ich vielleicht
einen Fehler gemacht? Oder ist das eventuell ein Bug in der Software?
Vielleicht kann ja mal einer von euch einen Blick drauf werfen.
Danke :)
Der Code:
1 | entity Main is
|
2 | Port ( RESET : in STD_LOGIC;
|
3 |
|
4 | Daten_MC : inout STD_LOGIC_VECTOR (7 downto 0);
|
5 | Adresse_MC : in STD_LOGIC_VECTOR (1 downto 0);
|
6 | RD_MC : in STD_LOGIC;
|
7 | WR_MC : in STD_LOGIC;
|
8 | RDY_MC : out STD_LOGIC;
|
9 |
|
10 | Daten_OUT : inout STD_LOGIC_VECTOR (15 downto 0);
|
11 | Adresse_OUT : out STD_LOGIC_VECTOR (15 downto 0);
|
12 | RD_OUT : out STD_LOGIC;
|
13 | WR_OUT : out STD_LOGIC;
|
14 | RDY_OUT : in STD_LOGIC
|
15 | );
|
16 | end Main;
|
17 |
|
18 | architecture Verhalten of Main is
|
19 | Signal Adresse : STD_LOGIC_VECTOR (15 downto 0);
|
20 | begin
|
21 |
|
22 | HAUPTPROZESS: process(RESET, Adresse_MC, RD_MC, WR_MC, Adresse, Daten_OUT, Daten_MC, RDY_OUT)
|
23 | Variable Mode : STD_LOGIC_VECTOR (3 downto 0);
|
24 | begin
|
25 | if RESET = '0' then
|
26 | Daten_MC <= (others => 'Z');
|
27 | RDY_MC <= 'Z';
|
28 |
|
29 | Daten_OUT <= (others => 'Z');
|
30 | Adresse_OUT <= (others => 'Z');
|
31 | RD_OUT <= 'Z';
|
32 | WR_OUT <= 'Z';
|
33 |
|
34 | Adresse <= (others => '0');
|
35 | else
|
36 | Daten_MC <= (others => 'Z');
|
37 | Daten_OUT <= (others => '1');
|
38 | RD_OUT <= RD_MC;
|
39 | WR_OUT <= RDY_OUT;
|
40 |
|
41 | Mode (1 downto 0) := Adresse_MC;
|
42 | Mode(2) := WR_MC;
|
43 | Mode(3) := RD_MC;
|
44 |
|
45 | Adresse_OUT <= Adresse;
|
46 |
|
47 | case Mode is
|
48 | when "0100" =>
|
49 | Adresse (7 downto 0) <= Daten_MC;
|
50 | Adresse (15 downto 8) <= Adresse (15 downto 8);
|
51 | RDY_MC <= '1';
|
52 | when "0101" =>
|
53 | Adresse (7 downto 0) <= Adresse (7 downto 0);
|
54 | Adresse (15 downto 8) <= Daten_MC;
|
55 | RDY_MC <= '1';
|
56 | when others =>
|
57 | Adresse <= Adresse;
|
58 | RDY_MC <= '0';
|
59 | end case;
|
60 |
|
61 | end if;
|
62 | end process HAUPTPROZESS;
|
63 |
|
64 | end Verhalten;
|