Forum: FPGA, VHDL & Co. VHDL Verständnisproblem


von Duck (Gast)


Lesenswert?

Hallo,

ich habe folgendes Konstrukt:

process (clk)
begin
  if clk'event and clk='1' then
    bla <= '1';
  end if;
end process;

Ich hab damit folgendes Problem:
Wird das so synthetisiert, dass kurz nach dem 'event "bla" auf high 
gesetzt wird, oder wird das so optimiert, dass es gleichzeitig mit dem 
Takt passiert, also dass eine nachfolgende Komponente die auf das 
"bla"-Signal hören würde, dann "bla" im selben Takt noch als high sieht?

Danke im Voraus

Mfg
Duck

von Chris (Gast)


Lesenswert?

Hallo Duck !

Ersetze doch clk'event and clk='1' then durch rising_edge(clk), dann ist 
alles klar definiert. darüber hinaus wäre es gut wenn Du in den process 
noch ein reset mit einbaust, also:

if (reset='0')then
bla <='1';
elsif rising_edge(clk) then
blub <= '1';

Über den genauen Unterschied von rising_edge zu clk'event gab es vor 
längerer Zeit mal einen Thread. Findest Du unter: 
http://www.mikrocontroller.net/articles/VHDL#CLK.3D.271.27_and_CLK.27event_oder_rising_edge.28.29.3F

Cheers Chris

von FPGA-Küchle (Gast)


Lesenswert?

#Über den genauen Unterschied von rising_edge zu clk'event gab es vor
#längerer Zeit mal einen Thread. Findest Du unter:

Da diese Anfrage immer wieder kommt, haben wir es in die VHDL-FAQ 
gesetzt:

http://www.mikrocontroller.net/articles/VHDL

www.mikrocontroller.net hat nicht nur das Forum sondern auch eine 
Artikelsammlung (wiki). Für programmierbare Logik finden sich die 
Artikel unter der Navi_leiste oben links unter CPLD,FPGA und Co. 
Vielleicht sollten wir den Titel zu FPGA,CPLD,VHDL ändern.

Zur eigentlichen Frage: mit der ersten taktflanke wird bla auf eins 
gesetzt,
ein FF dahinter ssieht das mit der zweiten Taktflanke, ein 
Kombinatorische Schaltung (AND,XOR,..) zwischen der ersten und zweiten 
Flanke. Was daraus synthetisiert wird hängt davon ab welchen Wert bla 
vor der ersten Flanke hat.
Ist es '1' (z.B. bei signal bla :std_logic := '1') könnte das synthese 
tool das mit einer festen '1' ersetzen also kein FF. Ist dagegen der 
Initwert auf '0' gesetzt (z.B. bei signal bla :std_logic := '0') wird 
sicherlich ein FF eingesetzt, das nach der ersten Flanke auf '1' 
wechselt. Hast du keinen Initwert angegeben, tja wahrscheinlich wird 
sich die Synthese für ein FF entscheiden und das FF mit '0' vorladen, 
aber das kann auch anders umgesetz werden.

von Chris (Gast)


Lesenswert?

@FPGA-Küchle - Könntest Du bitte mal in den Thread MOORE / MEALY 
reinschaun - Danke & Gruss Chris

von Duck (Gast)


Lesenswert?

@FPGA-Küchle:
Danke für die ausführliche Antwort.

Grund für die Frage ist, dass ich da ein Problem mit einem Block-RAM und 
ich find einfach irgendwie den Fehler nicht.

Und zwar läuft das so:
Ich hab einen Prozess, der reagiert auf die steigende Flanke und setzt 
dann Eine Adresse, das WE-Bit und das Datum. Wenn das jetzt so ist wie 
du sagst, dann müsste das Schreiben in das RAM erst beim nächsten 
Taktzyklus wirklich "ausgeführt" werden, weil erst dann WE gleichzeitig 
mit der steigenden Flanke vom RAM gesehen wird - in dem Fall gibts wohl 
auch keine Probleme mit der Setup-Zeit.

Aber trotzdem haut das nicht hin.

Kann es sein, dass das Schreiben in ein BlockRAM länger als 1 Taktzyklus 
dauert? Oder irgendwelche anderen Ideen was ich noch falsch machen 
könnte?

Mfg
Duck

von FPGA-Küchle (Gast)


Lesenswert?

Codeschnipsel bitte.

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.