Forum: FPGA, VHDL & Co. Moore signale Übergeben


von Flexbex (Gast)


Lesenswert?

Hallo,
In der Uni arbeiten wir mit einem Microblaze FPGA den ich leider zuhause 
nicht synthtisieren kann. Ich schreibe aber gerade zuhause an dem VHDL 
code und wollte fragen ob das von mir ausgedachte Verfahren möglich ist. 
In Modelsim gehts, aber das heißt ja nix. Ich hatte den Fall schon öfter 
das es in Modelsim geht die reale realisierung nich. Damit es nun 
funktioniert wollte/soll ich jeden Prozess als Moore Automat modelieren. 
Also was ich besonders fragen wollte ob das mit dem A0_internal<=A0 
geht. Mir ist nämlich noch nich klar wie ich sauber von einem Prozess 
zum anderen ein Signal übergeben kann.

Also der Code ist der folgende:

clock: process(clk,reset)
begin
 if reset='1' then
      zZustand<=Z0;
      A0<='0'
  elsif(clk'event and clk = '1') then
      A0<=A0_int;
      zZustand<=zZustand_folge;
...


--Ablauf für MOORE-Automat
Ablauf: process(cond1,zZustand)
begin
A0_internal<=A0 --Bei der Definition bin ich unsicher
zZustand_folge<=Z0;
case(zZustand)is
  when Z0=>
        A0_internal<='1';
        if(cond1='1') then
           zZustand_folge<=Z1;
        end if;
  when Z1=>
        zZustand_folge<=Z2;  --kann man das ohne Bedingung schreiben
  when Z2=>
       if(cond1='1') then
           zZustand_folge<=Z2;
        end if;
....

von user (Gast)


Lesenswert?

Flexbex schrieb:
>   when Z1=>
>         zZustand_folge<=Z2;  --kann man das ohne Bedingung schreiben
also diese Zeile funktioniert

von user (Gast)


Lesenswert?

stell dir vor da wär eine Bedingung und die ist immer WAHR

von Flexbex (Gast)


Lesenswert?

Na um vielleicht das problem mehr zu konkretisieren. Ich suche ne 
moeglchkeit a0 in allen faellen einen wert zuzu weisen ohne a0 immer zu 
aenderng

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> a0 in allen faellen einen wert zuzu weisen
In welchen allen Fällen?
Immer den gleichen Wert, oder jedesmal einen anderen?
Woher kommt der Wert?
Wozu die signale A0_internal und A0_int?
Was war nochmal das eigentliche Problem?

von Flexbex (Gast)


Lesenswert?

Hallo,
Entschuldigung für meine sehr verkürzte Ausdrucksweise. Ich hatte es 
Gestern vom Handy aus geschickt und da ist schreiben auf Mikrocontroller 
sehr mühselig.

Also mein Problem ist:

Ich möchte in einem als Moore Automat gestallteten Prozess ein Signal 
verändern können. Dies möchte ich aber nur in bestimmten Zuständen tun 
in anderen soll das Signal unverändert bleiben.

Mir ist bnicht klar wie ich ein Signal unverändert lassen kann. Oder 
kann ich ein Signal auch sich selbst zuweisen.
Also so(ich weiss das Programm ist vielleicht sinnfrei mir ist aber 
keine bessere Abstraktion eingefallen):

process(clk)

clock event usw....

Zustand=zustand_folge...
end process


process(Zustand,E0)
begin
A0<=A0; --A0 soll A0 bleiben außer ein Teil des Prozesses ändert A0
case(zustanda) is
when Z0 =>--A0 wird 00
      A0<="00"; --A0 wird 0
      zustand_folge<=z1
when Z1 =>--A0 behält den Wert ist zwar sinnfrei
     zustand_folge<=z2
when Z2 =>--A0 wird erhöht
      A0<=A0+1;
       if(E0='1')
         zustand_folge<=z0;
       else
         zustand_folge<=z1
        end if;
end process;

process(A0)
if(A0(1)='1') -- hier soll dann z.b. A0 abgefragt werden
...

Besser beschrieben?

lg
felix

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Flexbex schrieb:
1
process(Zustand,E0)
2
 begin
3
 A0<=A0; -- A0 soll A0 bleiben außer ein Teil des Prozesses ändert A0
4
 case(zustanda) is
5
   when Z0 => --A0 wird 00
6
       A0<="00"; --A0 wird 0
7
       zustand_folge<=z1
8
 when Z1 => --A0 behält den Wert ist zwar sinnfrei
9
      zustand_folge<=z2
10
 when Z2 => --A0 wird erhöht
11
       A0<=A0+1;    -->> (*) <<--
Ja, so stimmt das schon, nur hast du jetzt erst mal ein Latch gebaut. 
Denn wenn A0 den Wert behalten soll, aber kein Takt beteiligt ist, 
dann hast du ein Latch. Jetzt ist ein Latch an sich nichts Böses, weil 
aber der zustanda aus etlichen Flipflops besteht, wird das 
latch-enable aus Kombinatorik gebildet, und der Ausgang von 
Kombinatorik glitcht bei Änderungen am Eingang. Am Eingang sitzen die 
Zustandsflipflops und am Ausgang das latch-enable. Und jetzt rate mal, 
was das Latch tut, wenn da solche unbeabsichtigten Glitches auftreten? 
Richtig: es speichert irgendwas ab, was gerade am Eingang anliegt...

Und noch was:
(*) hier ist sie wieder: die legendäre kombinatorische Schleife...
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife

Kurz: deinem Prozess fehlt ein Takt.
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Das passiert gern wegen der Zwei-Prozess-Schreibweise:
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html

von Flexbex (Gast)


Lesenswert?

@Lothar Miller

Wollte mich nur kurz bedanken. Deine Seite hat mir die Kenntnisse 
geliefert die mir meine VHDL Vorlesung nich gebracht hat. Hab das 
Problem mit deinem RAM gelöst. Es ist glaub ich wie in anderen 
Programmiersprachen man sollte sich erstmal Beispielprogramme 
durchlesen. Mein Problem war glaub ich das ich dachte das sich die 
Prozesse Synchronisieren wenn die Eingänge der sensitivitie Liste 
synchron zum Takt sind. Aber jetzt habe ich gesehen das viele der 
Programme  den Clock mit drin haben. So jetzt aber genug des Lobes.

frohe Weihnachten
Felix

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Flexbex schrieb:
> Es ist glaub ich wie in anderen Programmiersprachen
> man sollte sich erstmal Beispielprogramme durchlesen.
Und vor allem: verstehen!

> Wollte mich nur kurz bedanken.
Keine Ursache, war eh' grad da...   ;-)

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.