2016-08-04 21 views
0

Ich bin gerade mitten in einer 12-Stunden-Debug-Sitzung und ich kann nicht, für das Leben von mir, diesen Buckel passieren.Kann Signalwert in VHDL nicht bestimmen

Die Art, wie mein Code eingerichtet wird, habe ich einen 8-Bit-std_logic_vector auf 8 Schalter auf der DE2-115-Platine zugeordnet. Jedes Bit entspricht dem Logikpegel, der durch den relativen Schalter (0 oder 1) aktiviert wird.

Das Ziel ist es, dass das Board darauf wartet, dass einer der 8 Schalter aktiviert wird, bevor der Timer gestartet wird. Dies wird aktiviert, wenn das Signal relative_time_enable auf den logischen Zustand 1 gesetzt ist Sobald das Signal auf 1 gesetzt ist, wird es letztlich nie auf 0 zurückgesetzt werden zurück Diese Variable initialisiert wird, wie gezeigt:

signal relative_time_enable   : STD_LOGIC := '0'; 
signal signal_in      : STD_LOGIC_VECTOR(7 downto 0); 

signal_in abgebildet wird zu "in" Ports, die in meiner Entität deklariert sind, oder umgekehrt. Es wird jedoch gesagt, dass signal_in den Schaltern entspricht. Hier ist der Code, den ich gerade habe.

Ich glaube, ich habe das Problem zu dem Schluss geführt, dass die If-Aussage immer als wahr kommt. Fast so, als ob das Signal_in innerhalb der ersten Zyklen mehrere Zustände durchläuft, wodurch der Wert sofort auf 1 gesetzt wird, konnte ich nichts Online finden, das mich in die richtige Richtung lenken könnte.

An diesem Punkt habe ich alles versucht, um zu bestimmen, was die Werte tatsächlich sind einschließlich Ersetzen "00000000" mit "11111111", "UUUUUUUU", "ZZZZZZZZ", "XXXXXXXX" und alle von ihnen immer noch durchkommen.

Ich habe auch versucht:

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 

        for i in 0 to 7 loop 
          if(signal_in(i) = '1') then 
            relative_time_enable <= '1'; 
          end if; 
        end loop; 

      end if; 
    end if; 
end process; 

Diese Methode scheint, wie es sollte ‚überprüfen‘, aber irgendwie hält sie durch immer und den Wert auf 1 gesetzt wird, bevor irgendwelche Schalter aktiviert werden. Außerdem habe ich signal_in auf dem LCD angezeigt und ändert, wenn ich Schalter und beim Start alles liest 00000000.

FYI: Ich habe nur mit diesem FPGA und VHDL für 2 Wochen gearbeitet, so ist es sehr möglich, dass ich etwas vermisse sehr grundlegend. Außerdem bin ich nicht hundertprozentig mit meinen Fähigkeiten in ModelSIM vertraut und nicht sicher, wie ich das, was ich sehe, in Probleme mit Code übersetzen würde.

Jede Hilfe würde sehr geschätzt werden. Wenn Sie mehr von dem Code sehen möchten, lassen Sie es mich wissen, ich werde gerne veröffentlichen, was auch immer benötigt wird. Ich habe einfach nicht alles aufgesetzt, weil es eine ziemlich lange Zustandsmaschine gibt, die das LCD steuert, was für diesen Beitrag nicht relevant ist.

Auch sollte ich erwähnen, dass der folgende Code wie erwartet funktioniert, aber das Problem mit diesem Code ist, dass relatives_time_enable zurück auf 0 zurückgesetzt wird, was ein großes Nein ist. Der einzige Grund, warum ich dies zeige, ist, dass es im Grunde wartet, bis ein Schalter aktiv ist, bevor die Uhr gestartet wird, aber sobald ich den Schalter deaktiviere, hört die Uhr auf zu laufen, was ein Problem darstellt.

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 
        relative_time_enable <= '1'; 
      else 
        relative_time_enable <= '0'; 
      end if; 
    end if; 
end process; 

Antwort

0

Ihr Test mit einem bit_vector funktionieren würde, weil jedes Bit entweder den '0' Wert oder den '1' Wert annehmen würde. Also, /= "00000000" würde wirklich bedeuten: mindestens ein Bit ist '1'. Aber da Sie eine std_logic_vector verwenden, kann jedes Bit 9 verschiedene Werte annehmen (std_logic ist ein 9-Werte-Aufzählungstyp). So bedeutet /= "00000000" nicht, dass mindestens ein Bit '1' ist. Es kann bedeuten, dass ein Bit auf 'U' oder einen anderen Wert als '0' gesetzt ist.Zu Beginn einer Simulation signal_in mit "UUUUUUUU "(U steht für Uninitialized) initialisiert wird. mit '0' initialisiert, weil Sie es auf diese Weise erklärt. Also Ihr Test bestanden wird auf der ersten ansteigenden Flanke von clk_1MHz_enable und wird bei '1' stecken . fast sofort

clk_1MHz_enable Unter der Annahme eine Uhr (seltsamen Namen, aber warum nicht) ist, und Sie mögen einen flankengetriggerten D-Flip-Flop, löst der folgende Code dieses Problem:

process(clk_1MHz_enable)  
begin 
    if clk_1MHz_enable = '1' and clk_1MHz_enable'event then 
    for i in signal_in'range loop 
     if signal_in(i) = '1' then 
     relative_time_enable <= '1'; 
     end if; 
    end loop; 
    end if; 
end process; 

ein d wenn Sie ein levelgetriggertes Latch anstelle eines flankengetriggerten D-Flipflops wollen:

+0

Genuis! Bit_Vector hat wunderbar funktioniert. Danke für die Hilfe. – Dylan