mikrocontroller.net

Forum: FPGA, VHDL & Co. Zähler bei Überlauf auf 0 setzen


Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich benutze einen integer, um damit einen Zähler zu erzeugen.

Der soll auf 0 gesetzt werden, sobald er einen Wert x erreicht hat.

Wo genau setze ich den Zähler zurück?

Ich sehe mehrere Möglichkeiten, weiß aber nicht, welche schön und welche 
hässlich ist:

[pre]1) TimeIt: process(Reset, Clock, Timer)
  begin
    if (Reset ='1') then
      Timer <= 0;
    elsif(rising_edge(Clock))
      Timer <= Timer+1;
    end if;

    --Wenn 1s um, wieder ab 0 zählen
    if (Timer = DesignClock) then
      Timer <= 0;
    end if;
  end process;[pre]

2) In einem eigenen Prozess, der auf Timer wartet und ihn 0 setzt, wenn 
der Wert erreicht ist

3) als Conditional Signal Assignment direkt in der architecture.

Autor: Johannes T. (johnsn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einem sequentiellen Process, niemals andere Signale als Reset & Clk 
in die Sensitivity List aufnehmen!!!
TimeIt: process(Reset, Clock)
  begin
    if (Reset ='1') then
      Timer <= 0;
    elsif(rising_edge(Clock))
      if (Timer = <Wert x>) then
        Timer <= 0;
      else
        Timer <= Timer+1;
      end if;
    end if;
  end process;

Für solche Anwendungen würd ich dir aber grundsätzlich den unsigned 
Datentyp aus numeric_std-Lib empfehlen.

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum denn unsigned und nicht integer?

Edit:
und was ist mit solchen Prozessen?

TimeIt: process(Reset, Reset2, Clock)
  begin
   if(Reset ='1' or Reset2='1') then
      ...


Darf man sowas machen?

Autor: Johannes T. (johnsn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du integer nimmst ohne den Wertebereich einzuschränken, macht die 
Synthese daraus wahrscheinlich ein 32-Bit breites Register, was sehr 
schnell die Ressourcen aufbrauchen kann.

Bei unsigned kannst du im Prinzip genausorechnen, wie mit Integer, da 
die Rechenoperationen überladen sind. Unsigned ist eigentlich ein 
std_logic_vector, dass heißt du gibst die Bitbreite vor und die Synthese 
kann keinen größeren Vektor draus machen. Dann hast du noch den Vorteil, 
dass du die Bitbreite genauso groß wählen kannst, dass der Überlauf 
automatisch durch addieren von 1 passiert, du sparst also wieder Logik.

Der TimeIt-Prozess ist nicht gut. Es gibt eigentlich nur einen globalen, 
asynchronen Reset. Wenn du nur Teile der Logik resetieren - oder besser 
- initialisieren willst, dann machs mit einem synchronen Init-Signal:

Die Sensitivity-List sequentieller Prozesse hat nur einen global Reset 
und ein Taktsignale und sonst nichts.

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun aber zwei Quellen, die für den Timer einen Reset erzeugen 
sollen.

VerODERe ich die dann außerhalb des Timers, und das daraus erzeugte 
ResetSignal in den Timer?

Macht das einen Unterschied, ob ich in der Timer-Architektur das ODER 
einbaue oder außerhalb?

Autor: Johannes T. (johnsn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die 2 Timer-Reset signale synchron zum Systemtakt sind, dann 
veroderst du die beiden in der If-Abfrage, wo ich Init stehen hatte. Die 
Synthese wird dann den Synchronen Clear-Eingang der FF-Zellen verwenden. 
Der Reset-Eingang sollte nur für den globalen FPGA-Reset verwendet 
werden.

Wenn die Timer-Reset Signale asynchron sind, dann musst du sie vorher 
mit 2 FFs einsychronisieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.