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
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
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.
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
> 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?
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.