Forum: FPGA, VHDL & Co. State Machine implementieren ohne type Deklaration?


von Heinrich (Gast)


Lesenswert?

Hallo,

normalerweise wird ja eine State Machine mit einem Type deklariert
1
TYPE STATE_TYPE IS (s0, s1, s2);

und dann werden mit Hilfe von cases die Ausgangssignale gesetzt und der 
nächste State bestimmt.

Ich möchte hingegen eine State Machine implementieren, die ein Array von 
oben nach unten taktweise durchläuft und den Wert des Array an jeder 
Position ausgibt.

In etwa so:
1
type t_data is array(0 to 2) of std_ulogic_vector(7 downto 0);
2
...
3
variable data : t_data;
4
...
5
data(0 to 2) := (
6
  ("00101100"),
7
  ("10011100"),
8
  ("01011110")
9
  );

Im ersten Takt wird also Zeile 1 ausgegeben, im zweiten Zeile 2 und im 
dritten Zeile 3. Kann man den Synthesetools beibringen sowas als State 
Machine zu implementieren und nicht als RAM?

Heinrich

von Nase (Gast)


Lesenswert?

Wie und warum denn? Es ist ja eben garkein Zustandsautomat.

Du baust bestenfalls einen Zähler. Den kann man natürlich wieder als 
Zustandsautomat betrachten...

von Heinrich (Gast)


Lesenswert?

Nase schrieb:
> Wie und warum denn? Es ist ja eben garkein Zustandsautomat.

Warum nicht? Ich habe ja fest definierte Zustände und Übergänge.

Nase schrieb:
> Du baust bestenfalls einen Zähler. Den kann man natürlich wieder als
> Zustandsautomat betrachten...

Interessante Idee: Einfach mit einem Zähler das Array durchlaufen. Ich 
werde am Montag mal prüfen, was Quartus daraus macht. Das 
Syntheseergebnis der "richtigen" State Machine habe ich ja schon.

Das da oben ist ja nur ein Minimalbespiel. In Wirklichkeit sind das über 
1000 Zeilen, was für eine manuelle Implementierung in States zu viel 
Arbeit wäre. Bisher habe ich das in ein RAM geladen und ausgelesen, 
würde es aber alternativ auch nur mit Logikressourcen realisieren können 
wollen.

von Nase (Gast)


Lesenswert?

Heinrich schrieb:
> Nase schrieb:
>> Wie und warum denn? Es ist ja eben garkein Zustandsautomat.
>
> Warum nicht? Ich habe ja fest definierte Zustände und Übergänge.
Naja, du hast statische Übergänge, die von nichts abhängen. Und du hast 
Ausgänge, die nur vom Zustand abhängen. Damit hast du einen unbedingten 
Moore-Automaten... und eigentlich alles weggelassen, was 
Zustandsautomaten im FPGA interessant machen.

Das ist im Endeffekt eben nur ein Zähler, der ein ROM adressiert:
. Zustandsgröße ist der Zähler selbst,
. der Übergang hängt nur vom Zustand=Zähler ab (=keine Eingänge),
. das Übergangsnetzwerk ist ein Addierer, der +1 berechnet,
. die Ausgänge hängen nur vom Zustand=Zähler ab (=Moore),
. das Ausgangs-Netzwerk ist das ROM.

Es steht dir natürlich frei, jede andere Zustandskodierung mit 
entsprechendem Ausgans- und Übergangsnetzwerk zu benutzen. Die 
Binärkodierung ist nur eine der Möglichkeiten. Aber sie ist eine recht 
anschauliche in diesem Fall... und mit einem ROM möglicherweise auch 
eine recht effiziente.

von Heinrich (Gast)


Lesenswert?

Du hast mit allem Recht was du schreibst.

Vielleicht habe ich mich falsch ausgedrückt: Ich möchte nicht die 
Array-Schreibweise als alternative Beschreibung für eine beliebige 
State Machine verwenden, sondern nur für den Spezialfall, für den ich 
sonst ein ROM verwenden würde.

von Heinrich (Gast)


Lesenswert?

Nase schrieb:
> Das ist im Endeffekt eben nur ein Zähler, der ein ROM adressiert:

Ich will halt nur verhindern, dass aus dem array tatsächlich ein ROM 
synthetisiert wird. Mal schauen, ob das klappt.. ;-)

von Fpgakuechle K. (Gast)


Lesenswert?

Heinrich schrieb:
> Du hast mit allem Recht was du schreibst.
>
> Vielleicht habe ich mich falsch ausgedrückt: Ich möchte nicht die
> Array-Schreibweise als alternative Beschreibung für eine _beliebige_
> State Machine verwenden, sondern nur für den Spezialfall, für den ich
> sonst ein ROM verwenden würde.

FSM per ROM zu realisieren ist ein alter Hut:
http://www.eecs.berkeley.edu/~newton/Classes/CS150sp98/lectures/week3/sld007.htm
http://www.researchgate.net/publication/224293074_ROM-Based_Finite_State_Machine_Implementation_in_Low_Cost_FPGAs/file/79e4150f0271cd8f23.pdf

von Nase (Gast)


Lesenswert?

Heinrich schrieb:
> Ich will halt nur verhindern, dass aus dem array tatsächlich ein ROM
> synthetisiert wird. Mal schauen, ob das klappt.. ;-)

Naja, in den meisten FPGA gibts ja keine 'ROM' in eigentlichen Sinne. Da 
wird halt mal ein Block-RAM draus, oder ein LUT-RAM. Oder wenns der 
Vektor hergibt auch Kombinatorik.

Warum willst du das verhindern? Und wie synthetisiert es denn derzeit 
dein 'ROM'? Vermutlich als Block-RAM oder?

von Heinrich (Gast)


Lesenswert?

Nase schrieb:
> Und wie synthetisiert es denn derzeit
> dein 'ROM'? Vermutlich als Block-RAM oder?

Ja, ich meine natürlich Block RAM. Da zur Laufzeit aber nur davon 
gelesen wird, sage ich ROM dazu. ;-)

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
Noch kein Account? Hier anmelden.