2016-06-24 6 views
0

grundsätzlich habe ich ein Array von unsigneds und einen Prozess, der den ersten Wert von im Array um eins erhöht. Dies funktionierte gut, bis ich ein asynchrones Zurücksetzen implementierte, das die Elemente des Arrays auf 0 setzt. Das Seltsame ist, dass der Rest meines Codes nicht mehr funktioniert, selbst wenn der Code des asynchronen Zurücksetzens nie erreicht wird. Hier ist mein Code:VHDL seltsam Behavoir eines Arrays von unsigned

use work.datentyp.all; 

library IEEE; 
    use IEEE.std_logic_1164.all; 
    use IEEE.numeric_std.all; 
entity vektoruhr is 
    port (

     clk, reset : in std_logic ; 
    ); 
end vektoruhr; 
architecture v1 of vektoruhr is 

    signal internal_stamp : vektor := (others => (others => '0')); 

begin 

process(clk) 
    begin 
     if(rising_edge(clk)) then 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process; 

    process(reset) 
    begin 
    if(rising_edge(reset)) then 
     report "reset triggered"; 
     -- internal_stamp <= (others => (others => '0')); 
     alarm <= '0'; 
    end if; 
    end process; 
end v1; 

Wie Sie sehen können, die Linie

-- internal_stamp <= (others => (others => '0')); 

wird kommentiert werden. So funktioniert alles gut. Aber wenn ich das - lösche, ist der Wert des ersten Elements zuerst 00, wird dann nach der ersten Inkrementierung auf 0x und nach dem zweiten auf xx geändert. Danach bleibt es bei xx. Der Reset-Eingang wird von Anfang an auf '0' gesetzt und wird niemals geändert.

+1

Hatten Sie alle diesen Code geschrieben, wenn Sie zuerst Ihre Frage gestellt haben wir konnten beantwortet es viel schneller. –

+0

Der Code analysiert nicht. Es gibt ein überflüssiges Semikolon (ein Deklarationstrennzeichen nach der Port-Interface-Objektdeklaration vor dem Closing ')' in der Port-Deklaration. Keine Typangabe für Vektor (vermutlich in fehlendem Paket 'datentyp'). Das Signalzuweisungsziel "Alarm" ist nicht deklariert (und für die Frage nicht notwendig). Nicht ganz [MCVE] (http://stackoverflow.com/help/mcve), aber ausreichend, um mehrere Treiber anzuzeigen. Siehe IEEE Std 1076-2008 14.7.2 Treiber "Jede Signalzuweisungsanweisung in einer Prozessanweisung definiert eine Reihe von Treibern für bestimmte Skalarsignale." – user1155120

+0

Die Quelle für das Paket numeric_std ([-2008] (http://standards.ieee.org/downloads/1076/1076-2008/), [frühere Versionen] (http://standards.ieee.org/downloads/1076 /1076.2-1996/)) teilt uns mit, dass Typ ohne Vorzeichen ein aufgelöster Signaluntertyp oder -typ ist. 4.6 Auflösungsfunktion Abs. 3 "Die Auflösungsfunktion, die einem aufgelösten Signal zugeordnet ist, bestimmt den aufgelösten Wert des Signals als eine Funktion der Sammlung von Eingängen von seinen mehreren Quellen." Die Auflösungsfunktion "aufgelöst" befindet sich im Paket std_logic_1164. – user1155120

Antwort

2

VHDL ist eine Hardwarebeschreibungssprache. Jeder Prozess repräsentiert ein Stück Hardware. Sie steuern das Signal aus zwei Prozessen .; Du hast einen Kurzschluss. Wenn Sie die Zeile aus kommentieren

internal_stamp <= (others => (others => '0')); 

diese Ergebnisse in internal_stamp von nur einem Prozess angetrieben wird. Daher kein Kurzschluss und keine "X" -Werte.

Wenn Sie sequentielle Logik codieren, sollten Sie sich an eine Vorlage halten. Hier ist eine solche Vorlage für sequentielle Logik mit einem asynchronen Reset, die alle Synthese-Tools verstehen sollte:

process(clock, async_reset) -- nothing else should go in the sensitivity list 
begin 
    -- never put anything here 
    if async_reset ='1' then -- or '0' for an active low reset 
     -- set/reset the flip-flops here 
     -- ie drive the signals to their initial values 
    elsif rising_edge(clock) then -- or falling_edge(clock) 
     -- put the synchronous stuff here 
     -- ie the stuff that happens on the rising or falling edge of the clock 
    end if; 
    -- never put anything here 
end process;   

Hier ist eine Vorlage für sequentielle Logik ohne eine asynchrone Reset:

process(clock) -- nothing else should go in the sensitivity list 
begin 
    if rising_edge(clock) then -- or falling_edge(clock) 
     -- put the synchronous stuff here (including the reset) 
     -- ie the stuff that happens on the rising or falling edge of the clock 
    end if; 
    -- never put anything here 
end process;   

Also, sollten Sie Code deine Logik mit einem Prozess, nicht zwei. Angenommen, Sie möchten ein asynchron zurückgesetzt:

process(clk, reset) 
    begin 
     if reset = '1' then 
      report "reset triggered"; 
      internal_stamp <= (others => (others => '0')); 
      alarm <= '0'; 
     elsif(rising_edge(clk)) then 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process; 

Wenn Sie jedoch eine Synchron zurücksetzen möchten:

process(clk) 
    begin 
     if(rising_edge(clk)) then 
     if reset = '1' then 
      report "reset triggered"; 
      internal_stamp <= (others => (others => '0')); 
      alarm <= '0'; 
     else 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process;