www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Counter mit pos/neg Integer Zahlen


Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab einen Zähler der bei einer Flanke auf dem Signal pstartcounter 
hochzählen soll. Ist dirin pos, soll der Ausgangswert pos sein.
Funtkionieren tut das auch wunderbar, nur macht er bei der Synthes ca 30 
Gatter extra für das Vorzeichen. In meiner Vorstellung sollte das 
Vorzeichen 1 einem FF abgespeichert werden und nur minimal mehr Gatter 
erzeugen.
Also lautet die Frage, warum soviele Gatter mehr?
taktzaehler: process (pstartcounter,reset,takt2)
 variable i: integer range -(Vervielfacher * 4) to (Vervielfacher * 4):= 
0;
 variable pstartcounterold : std_logic := '0';
 Begin
  if Reset = '0' then
     Ringzaehler <= 0;
     i := 0;
     pstartcounterold := '0';
  elsif   rising_edge (takt2) then
       if pstartcounter = '1' and pstartcounterold = '0' then
          i := Ringzaehler;
          if abs(i) <(Vervielfacher * 4) then
            i := abs(i) + Vervielfacher;
          else
              i := Vervielfacher;
          end if;

          If dirin = '1' then
            i := -i;
          else
            i := i;
          end if;
          Ringzaehler <= i;
    end if;
    pstartcounterold := pstartcounter;
  end if;
end process;

Danke
Malte

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du solltest bedenken, dass 2er-Komplementzahlen verwendet werden.
Bei i := -i wird nicht einfach nur ein Vorzeichenbit gesetzt, sondern i 
wird invertiert und dann incrementiert (oder erst decrementiert und dann 
invertiert, was auf das selbe rauskommt).

Beispiel:  i = 2
2 binaer:      0010
invertiert:    1101
incrementiert: 1110
das entspricht dann -2.

hier mit auch noch mit Decrementierung zuerst:
2 binaer     : 0010
decrementiert: 0001
invertiert:    1110

Der Besucher

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
also diese Mixtur von signalen und variablen, von integern und 
std_logic[_vectoren] macht das ganze fuer mich fast unleserlich. Das 
geht doch denke ich mit normalen signal:hugo std_logic[_vector] 
einfacher...

Und den pstartcounter kannst du aus deiner sensitivity Liste auch 
rausnehmen, du hast nur asynchronen reset und takt.

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch mal ich,

wenn du aber die Vorzeichen-Betrags-Darstellung bevorzugst, dann 
vereinfacht sich deine Schaltung erheblich. Der Betrag steht dann im 
Ringzähler und das Vorzeichenbit steckt ja schon in dirin drin. Auch 
entfallen die abs-Berechnungen, die sicherlich auch nicht so ganz billig 
sind.

Wenn wir genau wissen was du haben willst, kann man ja mal was halbwegs 
optimales zusammenstricken.

Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also lautet die Frage, warum soviele Gatter mehr?
Mir stellt sich da eher die Frage, was der ganze Aufwand eigentlich 
soll...
Willst du einen umschaltbaren Auf- und Ab-Zähler bauen?

Falls ja:
Warum zählst du nicht von 0 bis Vervielfacher * 8 und ziehst zum Schluss 
einen Offset von Vervielfacher * 4 ab. Dann hast du beim 
Richtungswechsel nicht solche Sprünge, wie du sie mit
          If dirin = '1' then
            i := -i;
          else
            i := i;
          end if;
zwnagsläufig bekommst. Denn mal angenommen, i wäre 4. Und jetzt drehst 
du die Richtung um. Dann wird i statt 3 sofort -4.

BTW:
In dieser Liste
   taktzaehler: process (pstartcounter,reset,takt2)
ist pstartcounter unnötig.
Der Prozess ist nur auf reset und takt2 sensitiv.

Und das gibt mir auch zu denken:
  elsif   rising_edge (takt2) then
Wieviele Takte hast du?
Was ist die Zielplattform?

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Antwort vom "Besucher" war eigentlich die entscheidene. Aus 
irgendwelchen Gründen hab ich vergessen das es sich um 2 Komplement 
handelt.
Der Zähler soll nur rauf zählen, und ab einem gewissen wert wieder von 0 
anfangen.
Die Sache mit dem Vorzeichen speicher ich nun extern ab.
Gruß
Malte

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Malte:
kannst ja mal deinen fertigen Zähler posten. Gerade an solchen 
Beispielen kann man gut Optimierungstechniken für sein Synthesewerkzeug 
"erforschen".
Gerade wenn man "richtige" Gatter synthetisiert und kein FPGA als Ziel 
hat, kann sich ein wenig Aufwand schnell lohnen und wird mit weniger 
Fläche belohnt. Aber es gibt auch Fälle, wo mehr Gatter-Fläche zu einer 
ingesammt kleinere Chipfläche führen können. Je nachdem, wie das 
Place&Routing mit der Schaltung klarkommt (hängt oft mit der Anzahl der 
Netze zusammen). Wer weis, wie man das Optimum am schnellsten findet 
kann ja mal Bescheid sagen.

Der Besucher

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.