Hello Alle! ich will mir ein zustandsautomat in Vhdl implementieren.In einem Zustand muss ich da meine Daten in einem 16 bit register speichern.Soll ich mir in diesem Zustand ein register mit 16 als Wert intialisieren und mit jeder Positiven Flanke wird ein bit gespeichert und register wert wird verringert oder gibt es eine andere lösung.Ich hoffe,dass meine frage deutlich ist. Best regard
Wenn die 16 Bit seriell kommen, würde ich das in 16 verschiedenen Zuständen (oder sogar 32) formulieren, nicht als nur einen einzigen.
Danke erstmal für Deine Antwort.Die Bits werden seriell gekommen,aber ich muss nach jedem Bit Auslesen 4 clocks warten und da hab ich mir 4 leere zustände hinzugefügt.Das heisst ich lese ein bit dann muss ich 4 clocks warten und dann wieder Bit Auslesen .Wenn ich die 16 Bits erreiche ,gehe zum anfangszustand zurück.
Ich würde eine FSM mit 5 Zuständen machen ... 1x lesen 4x warten Zusätzlich noch einen Counter der die eingelesenen Bits zählt. Wenn der Counter den Wert 16 erreicht hat ein Flag setzen, dass die 16 Bits angekommen sind und anschließend kannst Du die Daten weiterverarbeiten ... Ansonsten müsstest du ja eine FSM mit 16 x 5 Zuständen machen ... wer will das schon ;)
ja eine sache ist mir noch nicht deutlich!ok nehmen wir an ädass ich in diesem zustand einncounter der bis 16 zaehlen soll programmiert.Aber die daten was ich bekomme,muss ich auch in einem register speichern.meine frage kann ich den register programm auch in meinen zustand schreibe.Das heisst ich lese ein bit wird in register gespeichert und counter wird inkrementiert(naechstes clock bit wird nach links geschoben und counter++..) wenn ich 16 erreiche dann wieder anfangszustand.Vielleicht war ein Algorithmus frage aber ich bin neu in der Vhdl Welt.
Ich beschränke das ganze mal auf den Zustand der das Bit ausliest.
1 | entity bits_lesen is |
2 | port( |
3 | clk : in std_logic; |
4 | bit_in : in std_logic ); |
5 | end entity |
6 | |
7 | architecture arch of bits_lesen is |
8 | |
9 | signal bit_reg_16 : std_logic_vector(15 downto 0); |
10 | signal reg_full : std_logic; -- Flag für 16 Bit gelesen; |
11 | |
12 | type state_type is (lese_bit, wait1, wait2, wait3, wait4); |
13 | signal current_state: state_type; |
14 | |
15 | begin
|
16 | ...
|
17 | process(clk) |
18 | begin
|
19 | -- hier ist die FSM drin
|
20 | case current_state is |
21 | when lese_bit => |
22 | if counter < 16 then |
23 | counter <= counter + 1; |
24 | 16_bit_reg <= 16_bit_reg(14 downto 0) & bit_in; |
25 | else
|
26 | reg_full <= '1'; |
27 | counter <= (others=>'0'); |
28 | end if; |
29 | current_state <= wait1; |
30 | -- restliche FSM
|
31 | end process; |
32 | ...
|
33 | end arch; |
Fehlt halt noch einiges, aber wenigstens ein Anfang. Das bit_reg_16 ist im Prinzip ein Schieberegister.
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.