2016-05-19 33 views
1

Ich habe Probleme mit diesem Code. Es scheint, dass der Zustand S0 immer aktiv ist, auch wenn es nicht sein sollte. Es scheint, dass die Ausgabe dieses Zustands invertiert ist (aktiv, wenn es deaktiviert werden soll). Irgendwelche Ideen? Ausdruck der Simulation unten.VHDL Warum ist der Zustand S0 aktiv, wenn er nicht sein soll?

Dank
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

entity ControlUnit is 
    port(clk   : in std_logic; 
      reset   : in std_logic; 
      validTime  : in std_logic; 
      timeData  : in std_logic_vector(3 downto 0); 
      writeEnable : out std_logic; 
      writeAddress : out std_logic_vector(3 downto 0); 
      averageReady : out std_logic); 
end ControlUnit; 

architecture Behavioral of ControlUnit is 
    type TState is (S0, S1, S2, S3, S4, S5); 
    signal PState, NState: TState; 
begin 

    sync_proc: process(clk, reset) 
    begin 
     if(reset = '1') then 
      PState <= S0; 
     elsif(rising_edge(clk)) then 
      PState <= NState; 
     end if; 
    end process; 

    comb_proc: process(PState, validTime, timeData) 
    begin 
     averageReady <= '0'; 
     writeEnable <= '0'; 
     case PState is 
      when S0 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S1; 
       else 
        NState <= S0; 
       end if; 
      when S1 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S2; 
       else 
        NState <= S1; 
       end if; 
      when S2 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S3; 
       else 
        NState <= S2; 
       end if; 
      when S3 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S4; 
       else 
        NState <= S3; 
       end if; 
      when S4 => 
       if(validTime = '1') then 
        writeEnable <= '1'; 
        NState <= S5; 
       else 
        NState <= S4; 
       end if; 
      when S5 => 
       averageReady <= '1'; 
       NState <= S0; 
      when others => 
       NState <= S0; 
     end case; 
    end process; 

    with PState select 
     writeAddress <= "0000" when S0, 
          "0001" When S1, 
          "0010" when S2, 
          "0011" when S3, 
          "0100" when S4, 
          "XXXX" when others; 
end Behavioral; 

Hier ist ein Druck der Simulation:

(anklickbar)

+2

Dies scheint eine Ein-Hot-Codierung zu sein (was bedeutet, dass es sich um eine Nach-Synthese-Simulation handelt). Die Polarität von PState.S0 scheint umgekehrt zu sein, während der Rest positiv wahr erscheint. Die synthetisierte Hardware muss die Polarität aufrecht erhalten, aber PState ist keine Ausgabe, simuliert sie richtig? Sie haben kein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) bereitgestellt, das eine Simulation vor der Synthese ermöglicht. * Irgendwelche Ideen? * Ist ein bisschen breit für eine Frage. Vielleicht hättest du die Synthese anders einschränken können, wenn du hineinspähen wolltest. – user1155120

Antwort

0

Alles ist mit Ihrem Code ok. Warum vermutest du, dass der S0-Zustand immer aktiv ist? Sie können es nicht von der Wellenform sagen, weil Sie das Kodierungsschema nicht kennen. Auf der anderen Seite schreiben Sie Address Signal ändert sich ständig, was bedeutet, dass Ihre State Machine seinen Zustand ändert.

+0

Wenn du dir den S0-Zustand anschaust und denkst, dass er umgekehrt ist, sollte es nicht so aussehen, invertiert? Ich meine, S0-Status ist der "Standard" ... Wenn keiner der anderen Zustände aktiv ist, dann sollte der einzige aktive S0 sein, oder? Wenn Sie die Lücke bei ~ 100ns betrachten, gibt es keinen aktiven Zustand ... Das klingt für mich ein bisschen komisch –

+0

Vor allem. Wenn Sie genau wissen wollen, in welchem ​​Zustand Sie sich befinden, verwenden Sie nicht diese Art enum-Definition. Verwenden Sie für das Statussignal den einfachen Typ std_logic_vector und definieren Sie selbst Konstanten für die Zustände. Was wir hier tun, ist automatische Enum-Typ zu std_logic_vector Umwandlung, die dazu führen kann, dass S0-Zustand als "000000" kodiert wird, was wir bei der Wellenform direkt nach dem Reset-Signal sehen. –

+0

Auch ich darauf hinweisen, einen anderen Fehler in Ihrem Code - WriteEnable ist aktiv beim Zurücksetzen. Das liegt daran, dass, wenn das Zurücksetzen aktiv ist, Sie sich im S0-Zustand befinden und wenn in diesem Zustand validTime = 1 ist, dann ist writeEn ebenfalls 1. Das ist nicht das, was Sie wollen, nehme ich an. Ich würde vorschlagen, einen weiteren Staat namens RST_ST zu haben. Bleiben Sie dabei, wenn das Reset-Signal aktiv ist, und fahren Sie dann mit S0 fort, wenn dies nicht der Fall ist. Sie schreiben also das EnE-Signal ist während der Reset-Zeit nicht aktiv –