www.mikrocontroller.net

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


Autor: netbandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity Main is
    Port ( RESET : in STD_LOGIC; 
   
     Daten_MC : inout  STD_LOGIC_VECTOR (7 downto 0);
           Adresse_MC : in  STD_LOGIC_VECTOR (1 downto 0);
           RD_MC : in  STD_LOGIC;
           WR_MC : in  STD_LOGIC;
           RDY_MC : out  STD_LOGIC;
        
           Daten_OUT : inout  STD_LOGIC_VECTOR (15 downto 0);
           Adresse_OUT : out  STD_LOGIC_VECTOR (15 downto 0);
           RD_OUT : out  STD_LOGIC;
           WR_OUT : out  STD_LOGIC;
     RDY_OUT : in STD_LOGIC
   );
end Main;

architecture Verhalten of Main is
Signal Adresse : STD_LOGIC_VECTOR (15 downto 0);
begin

HAUPTPROZESS: process(RESET, Adresse_MC, RD_MC, WR_MC, Adresse, Daten_OUT, Daten_MC, RDY_OUT)
Variable Mode : STD_LOGIC_VECTOR (3 downto 0);
  begin
    if RESET = '0' then
      Daten_MC <= (others => 'Z');
      RDY_MC <= 'Z';  
    
      Daten_OUT <= (others => 'Z');
      Adresse_OUT <= (others => 'Z');
      RD_OUT <= 'Z';
      WR_OUT <= 'Z';
    
      Adresse <= (others => '0');
    else  
      Daten_MC <= (others => 'Z');    
      Daten_OUT <= (others => '1');
      RD_OUT <= RD_MC;
      WR_OUT <= RDY_OUT;

      Mode (1 downto 0) := Adresse_MC;
      Mode(2) := WR_MC;
      Mode(3) := RD_MC;
    
      Adresse_OUT <= Adresse;

      case Mode is
        when "0100" =>
    Adresse (7 downto 0) <= Daten_MC;
    Adresse (15 downto 8) <= Adresse (15 downto 8);
    RDY_MC <= '1';
  when "0101" =>
    Adresse (7 downto 0) <= Adresse (7 downto 0);
    Adresse (15 downto 8) <= Daten_MC;
    RDY_MC <= '1';          
  when others =>
    Adresse <= Adresse;
    RDY_MC <= '0';
      end case;        
    
    end if;
  end process HAUPTPROZESS;  

end Verhalten;

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: netbandit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.