Forum: FPGA, VHDL & Co. Anfänger: VHDL Synthese: Counter


von Chris (Gast)


Lesenswert?

Hallo zusammen,

ich experimentiere erst seit kurzem mit VHDL und habe eine Frage.
Wie wird das Coding unten auf Gatterebene realisiert?
Was mir unklar ist:
Wie wird in der Schaltung sichergestellt, dass Q erst beschrieben wird 
wenn der Adder (oder eine andere Operation) ein gültiges Ergebnis 
ausgibt?
1
process(clock)
2
begin
3
  if (clock'event and clock='1') then
4
    Q <= Q + X;
5
  end if;
6
end process;


Ciao,
Chris

von Jan M. (mueschel)


Lesenswert?

In der Schaltung selbst gar nicht.
Was passiert, ist dass das Synthese-Tool (bzw. genauer die 
Timing-Analyse nach dem Place and Route process) bestimmt, wie lange der 
Addierer braucht und dir genau diese Zeit dann als maximal mögliche 
Frequenz ausgibt mit der das Design laufen darf. Wird die Freqeuenz 
überschritten, passiert genau das, was du beschrieben hast: Q übernimmt 
das Ergebnis, bevor der Addierer fertig ist.

von Chris (Gast)


Lesenswert?

Danke Jan,

ich glaube ich verstehe.
Das heißt ungefähr so? Q wäre dann also ein FF und clock hängt direkt am 
Clock-Eingang des FF?

      C
 ---| |
 |  Q--   X
 |  |     |
 |  -------
 |  |  +  |
 |  -------
 |    |
 -----|

von berndl (Gast)


Lesenswert?

jepp,

die rechte Seite der Gleichung beschreibt eine Logik, die den Ausgang 
der FFs mit deinem (hoffentlich aus FFs kommenden) Term addiert. Das 
wird dann mit der Clock wieder in die FFs geladen.

Und wenn du der Synthese noch sagst, welche Frequenz du mit dem Teil 
erreichen willst (Spezifikation der Clock), dann kriegst du in der 
Summary auch quasi ein PASS/FAIL

von Chris (Gast)


Lesenswert?

Danke für die Antworten :-)

von Chris (Gast)


Lesenswert?

Noch ein Beispiel damit ich es noch besser verstehe :-)
1
signal Q: std_logic_vector(7 downto 0);
2
3
process(clock)
4
begin
5
  if (clock'event and clock='1') then
6
    if (write_enabled = '1')
7
      Q <= Input
8
    end if;
9
  end if;
10
end process;

Würde in dieser Schaltung dann einfach die clock Leitung unterbrochen 
wenn write_enabled = '0' ist, sodass beim nächsten Takt nicht 
geschrieben wird?

Ciao
Chris

von Irgendeiner (Gast)


Lesenswert?

> Würde in dieser Schaltung dann einfach die clock Leitung unterbrochen
> wenn write_enabled = '0' ist, sodass beim nächsten Takt nicht
> geschrieben wird?

Nicht ganz.

Das Flip-Flop bekommt bzw. hat ein Clock-Enable-Eingang. Ist der 
Enable-Eingang aktive, speichert das Flip-Flop an der nächsten Flanke 
den Wert an seinem Eingang. Wenn nicht, dann nicht.

Hat das Flip-Flop kein Clock-Enable-Eingang, wird einer per Multiplexer 
realisiert. Der Multiplexer hat als Eingang den neuen Wert und den 
momentanen (alten) Flip-Flop-Wert. Der Enable-Eingang steuert den 
Multiplexer, dessen Ausgang auf den Flip-Flop-Eingang geht.

von Chris (Gast)


Lesenswert?

Danke!

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


Angehängte Dateien:

Lesenswert?

Chris schrieb:
> Noch ein Beispiel damit ich es noch besser verstehe :-)
> :
> Würde in dieser Schaltung dann einfach die clock Leitung unterbrochen
> wenn write_enabled = '0' ist, sodass beim nächsten Takt nicht
> geschrieben wird?
Ausprobieren macht schlau ;-)

Der RTL-Schaltplan sieht aus wie der Screenshot im Anhang.
Verwendet wird bei Xilinx ein D-FlipFlop mit Enable-Eingang.

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.