Moin!
Ich habe ein zustandsautmat von 2 zustaenden(S0,S1) in Vhdl geschrieben.
:
signal reg_bit:std_logic_vector(2 downto 0):="00";
First:process(clk)
begin
if rising_edge(clk) then
zustand<= folge_z;
end if;
end process First;
SECOND:process(x,zustand)
begin
when S0 => if x='1' then
folge_z<=S0;
else
folge_z<=S1;
end if;
when S1 =>reg_bit<= reg_bit(1 downto 0) & data;--Data im register
speichern
ausgabe<=reg_bit
folge_z<=S0;
end case;
end process Second;
:
Mein problem liegt darin, dass ich wenn im zustand S1 für erte mal bin,
kann ich kein data in meinem register speichern,aber das passiert erst
beim dem zweiten mal wenn ich S1 wieder erreiche.Was hab ich falsch vh
in meinem code gemacht?
mfg
Kommen die Daten synchron rein? Wenn nicht, musst du sie synchronisieren:
1 | process(clk) |
2 | begin
|
3 | if rising_edge(clk) then |
4 | data_synch1 <= data; |
5 | data_synch2 <= data_synch1; |
6 | end if; |
7 | end process; |
Und warum machst du die Statemachine nicht direkt synchron:
1 | process(clk) |
2 | begin
|
3 | if rising_edge(clk) then |
4 | case zustand is |
5 | |
6 | when S0 => |
7 | if x='1' then |
8 | zustand<=S0; |
9 | else
|
10 | zustand<=S1; |
11 | end if; |
12 | |
13 | when S1 => |
14 | reg_bit<= reg_bit(1 downto 0) & data_synch2;--Data speichern |
15 | ausgabe<=reg_bit |
16 | zustand<=S0; |
17 | end case; |
18 | end if; |
19 | end process; |
Das geht schon im Simulator schief, weil im SECOND-process das Signal data nicht in der Sensitivity-List steht. Das eigentliche Problem liegt aber darin, dass die Beschreibung des Schieberegisters
1 | reg_bit <= reg_bit(1 downto 0) & data; |
kombinatorisch ist und somit unendlich schnell und andauernd während zustand=S1 ausgeführt werden müsste. So eine Hardware kann nicht erzeugt werden. Eine Zuweisung in ein Schieberegister muss immer mit einem Takt erfolgen, weil ein Schieberegister ja aus FFs besteht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.