Elegante Schreibweise gesucht

Gast #4051304
Lesenswert?
• ▲
▼
Hallo,


ich habe einen "circular fifo" in VHDL (512 Byte) und  ich brauche  eine 
Bedienung für BufferFull (es wird noch 6 byte freigelassen) und 
BufferEmpty.

BufferEmpty ist  einfach:  IF(Addresse1=Adresse2)THEN Bufferempty=1;

BufferFull fällt mir nichts anderes ein , als sowas zu schreiben:
If( (Adresse1=Adresse2+7) OR (Adresse1=505 AND Adresse2=0) OR 
(Adresse1=506 AND Adresse2=1) usw...

D.h. ich muss jede Adresskombination erwähnen, weil der Nulldurchgang 
bei (Adresse1=Adresse2+7) nicht funktioniert. Das  sieht aber sehr 
unübersichtlich aus.

Gibt es eine elegante Lösung dafür?
Gast #4051354
Lesenswert?
• ▲
▼
Man könnte der Antwort von VHDL noch folgende Erklärung hinzufügen.

Der Teilsatz: "weil der Nulldurchgang ... nicht funktioniert" trifft so 
nicht zu. Stichwort ist hier die Modulo-Arithmetik. Ohne das im 
Einzelnen auszuführen, kann man sagen, dass sowohl die Differenz, als 
auch die Summe in der Modulo-Arithmetik immer stimmen. Auch in den 
Fällen wo eine Differenz auf den ersten Blick negativ ist. Denn, wenn 
die Zähler mit der Bitbreite deklariert sind, die nötig ist, dann werden 
die höherwertigen Bits der Differenz einfach "abgeschnitten". Die 
verbleibenden unteren Bits aber geben korrekt die Differenz (aber eben 
nur einen Teil davon) an.

Man kann sich das selbst leicht verdeutlichen, in dem man sich einen 
zirkularen Rechenschieber denkt. Die zirkulare Eigenschaft des 
Rechenschiebers verwirklicht die Modulo-Arithmetik.
Gast #4051401
Lesenswert?
• ▲
▼
Solange deine FIFO-Größe 2^x ist, funktioniert wie beschrieben die 
Differenz. Das liegt an dem, was man in der Arithmetik als Ring 
bezeichnet. Man kann sich das auch gut bildlich vorstellen.

Stell dir eine runde Uhr vor, mit dem Ziffernblatt 1-12. Die Differenz 
zwischen zwei Zeiten kann dann einfach über die Differenz der Uhrzeiten 
berechnet werden.

So z.B. als Trivialbeispiel, von 3 Uhr bis 4 Uhr ist eine Stunde 
Unterschied entspricht 4(Uhr) - 3(Uhr) = +1(Stunde).

Interessant wird es beim Nulldurchgang (also der 12 auf dem 
Ziffernblatt):
z.B. von 4 Uhr bis (zum nächsten) 3 Uhr sind es logisch 11 Stunden 
Unterschied, entspricht mathematisch 3(Uhr) - 4(Uhr) = -1. Jetzt gehst 
du vom Nullpunkt (12 Uhr) also 1 zurück (da -1) und landest bei: (+)11, 
der gesuchten Differenz.

Bei der Uhr klappt es ohne 2^x, im binären werden diese Ringe halt bei 
2^x aufgespannt. Der Nullpunkt ist da auch wirklich 0 ;-) .
Um komplexere Rumrechnerei zu ersparen, sollte man Eigenbau-FIFOs also 
möglichst 2^x Einträge groß machen.
Gast #4051425
Lesenswert?
• ▲
▼
Einfacher geht's, wenn du neben den Lesezeiger(LZ) und
Schreibzeiger (SZ) noch einen weiteren Full-Zeiger (FZ)
einführst: FZ = SZ + 6 (6: Deine Reserve).
FZ wird dann immer mit SZ geändert.
Damit:
Empty = (WZ equal LZ)
Full  = (FZ equal LZ)
(Firma: www.dossmatik.de) #4052555
Lesenswert?
• ▲
▼
René D. schrieb:
> Im Ringspeicher nähert er sich von hinten an den Lesezeiger. Er ist
> einer Runde rum.
>
> full when write_zeiger-1=read_zeiger

Ich muss korrigieren, ich hatte deinen Text nicht voll gelesen.

Du must den Typ unsigned nehmen.


wenn dein Adresscounter vom typ unsigend (8 downto 0) ( entspricht den 
Wertebereich 0...511) ist, kannst du den Overflow nutzen.

Dann ist 0-1=511
         1-2=511
         1-3=510

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.