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


von Malte (Gast)


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

von Der Besucher (Gast)


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

von berndl (Gast)


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.

von Der Besucher (Gast)


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

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


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
1
          If dirin = '1' then
2
            i := -i;
3
          else
4
            i := i;
5
          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
1
   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:
1
  elsif   rising_edge (takt2) then
Wieviele Takte hast du?
Was ist die Zielplattform?

von Malte (Gast)


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

von Der Besucher (Gast)


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

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.