Forum: FPGA, VHDL & Co. CPLD: XC95xx Problem mit Reset bei einem Latch


von netbandit (Gast)


Lesenswert?

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;

von Da M. (damicha)


Lesenswert?

Hallo netbandit.

Ein IO-Pin besitzt in der Regel drei Register. Ein Eingangs-, ein 
Ausgangs- und eines für die Richtung.
Ich vermute mal, dass das Reset nur die Richtung zurück setzt aber nicht 
den Inhalt.
Es ist besser die Beschreibung eines Tristate-Buffers aus den Prozessen 
zu nehmen.
Versuche mal folgendens:

signal reg_i : std_logic;

-- latch --
process(...)
begin
  if (reset = '0') then
    reg_i <= '0';
  else
    reg_i <= ...;
  end if;

end process;

-- tri-state buffer --
reg <= 'Z' when (reset = '0') else reg_i;

Also in einem FPGA würde das so funktionieren ;).

Gruß DaMicha.

von netbandit (Gast)


Lesenswert?

Hi,

ich danke dir für deine Antwort. Ich habe gestern erst einmal das 
komplette Projektdesign etwas umgedacht und konnte heute dieses oben 
genannte Teilstück umarbeiten. Ich habe jetzt hier auch einen CLK drin 
und verwende daher Taktflankengesteuerte FF's. Außerdem habe ich gleich 
darauf geachtet, dass die Signalzuweisung und -Verarbeitung besser 
getrennt ist. Jetzt klappt auch mit dem Reset.
Also danke noch einmal für den Tip :)

Ciao

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.