Fifo Bit

Jordy

Level-1
Beiträge
123
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Kleine Denkaufgabe eher...

Habe mir einen Fifo Speicher gebaut für Bits. Also, eine Warteschleife für Bits. Nutze ich falls mehrere Sachen auf ein Aggregat zugreifen oder sonstiges, damit sie auch in der richtigen Reihenfolge drankommen.

Gelöst habe ich es mit einem FB, also in und Out Variablen wo ich jeweils 16 Bits anbinden kann (Struct). Jedem bit ist ein INT im FB zugeordnet wo drin gespeichert ist, an welcher Stelle dieses bit in der Warteschleife steht.

So... funktioniert auch und so, alles wunderbar.


Aaaaber, gestern kam mir die Idee, das es doch rein theoretisch auch mit EINEM INT funktionieren müsste. Da ich ja prinzipiell genug werte Speichern kann um jeder möglichen Reihenfolge der Bits einen Wert zuweisen zu können.

Wäre halt noch schöner, da ich nur einen FC brauche mit einem Speicher.


Nur... weiß noch nicht wie ichs umsetzen kann, das ich anhand dem Wert im INT dann ableiten kann, welches bit an welcher position ist.

Ne Idee??
 
ungetestet, aber könnte funktionieren :rolleyes:

Code:
*
      L     16                          //16 bits hat ein INT
next: T     #iLoopCount                 //in Schleifenzähler laden
      L     #iInput                     //die eine INT-Zahl
      L     W#16#1                      //mit einer 0000 0000 0000 0001
      UW                                //UND-Verknüpfen
      L     0                           //auf 0
      ==I                               //vergleichen
      SPBN  bit                         //wenn nicht 0 ist ein bit gefunden wurden
      L     #iInput                     //die eine INT-Zahl
      SRW   1                           //um eine Stelle nach rechts
      T     #iInput                     //speichern
      L     #iLoopCount                 //Schleifenzähler
      LOOP  next                        //dekrementieren und erneut durchlaufen
      SPA   end                         //kein bit gefunden - abbruch
bit:  L     #iLoopCount                 //nach bit gefunden steht hier die position
      L     -1                          //also fast
      *I                                //y = -1 * x + 17
      +     17
      T     #iBitPosition               //position speichern
end:  NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm... Nee.

Wenn ichs richtig sehe, sagt mir das Stück Programm doch nur das wieivelte BIT gerade gesetzt ist, oder?

Hat ja nichts mit meiner Warteschleife zu tun. Oder guck ich falsch?? :confused:

Ich will ja speichern, in welcher Reihenfolge welche bits gesetzt werden.

Trotzdem danke! ;)
 
Hmm... Nee.
Ich will ja speichern, in welcher Reihenfolge welche bits gesetzt werden.

:confused: das hat nichts mit einem FIFO zu tun ... oder jedenfalls nicht direkt ...
Das kann dann dein aktueller Baustein auch nicht.
Wenn du so etwas machen willst, dann mußt du dir entweder eine Struktur bauen, die die Anzahl deiner insgesamt möglichen Bits enthält und dann daraus ein ARRAY machen (ARRAY of Struct) und dies dann als FIFO verschieben ...
oder ...
du machst ein ARRAY of INT und speicherst in jedem neuen Element nicht das echte Bit, sondern dessen Nummer und schaltest diese Nummer hinterher bei der Ausgabe ggf. in deine Maske hinein ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, so hatte ich deine ausführungen da oben verstanden



die reihenfolge, also: 4,8,2,3,9,11,12 ???

und du das in einem INT ablegen :confused:


Korrekt! :)

Ja, wa sone Idee gestern, weil es ja reintheoretisch gehen würde. Wenn ich für jede Mögliche Reihenfolge einen Wert zuweise gehts ja. Suche halt ne Lösung wie man es machen könnte. Natürlich ohne alles mit Hand zu schreiben für jeden Wert :rolleyes:


:confused: das hat nichts mit einem FIFO zu tun ... oder jedenfalls nicht direkt ...
Das kann dann dein aktueller Baustein auch nicht.
Wenn du so etwas machen willst, dann mußt du dir entweder eine Struktur bauen, die die Anzahl deiner insgesamt möglichen Bits enthält und dann daraus ein ARRAY machen (ARRAY of Struct) und dies dann als FIFO verschieben ...
oder ...
du machst ein ARRAY of INT und speicherst in jedem neuen Element nicht das echte Bit, sondern dessen Nummer und schaltest diese Nummer hinterher bei der Ausgabe ggf. in deine Maske hinein ...

Gruß
LL

Klar, kann er. So hab ich es ja gemacht. Sagte ich ja, für jedes Bit ein INT, worin ich die Position des Bits reinschreibe...
 
Klar, kann er. So hab ich es ja gemacht. Sagte ich ja, für jedes Bit ein INT, worin ich die Position des Bits reinschreibe...

Stimmt ... du hast recht ... ich hatte falsch gelesen.
In dem Fall ... der von dir beschrittene Weg ist auch der einzige Weg, der mir dazu einfällt (und wie ich es auch machen würde).
Du kannst (darüber hinaus) auch nicht in einer Variablen mehrere Werte hinterlegen ... Einzige Alternative : STRING - aber das ist ja im Prinzip auch wieder ein ARRAY (of Char) ...

Gruß
LL
 
die unterschiedlichen reihenfolgen passen definitiv nicht in ein INT, selbst wenn du jeder reihenfolge eine eigene nummer zuweist.

mathematik -> kombinatorik -> permutation

wir haben 16 objekte
also gibt es für das erste objekt 16 möglichkeiten, für das zweite 15, das dritte 14 ....

also insgesamt n! möglichkeiten

16! = 2.09227899 × 10^13
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, vielen Dank euch beiden!! Dann bin ich doch beruhigt!! ;)

Ja, hast recht vierlagig!!! Wie komm ich eigentlich drauf, das die Werte in EIN INT passen?? :confused: Passt ja hinten und vorne nicht! Egal... :ROFLMAO:
 
Wie komm ich eigentlich drauf, das die Werte in EIN INT passen?? :confused: Passt ja hinten und vorne nicht! Egal... :ROFLMAO:

naja, auch wenn ich nicht denke, dass es wirklich komfortabler wird als die lösung, die du jetzt hast:

wenn du byte-weise auswertest passt es in ein word: 8! = 40320 ...

wie auch immer ... es ist und bleibt unpraktikabel, dass dann wieder zusammenzusetzen und überhaupt ... nö, nö, nö, das mag nicht gefallen
 
Wieso? Ich denke es geht nur um Bits? Dann kann ich diese doch auf eine feste Position im Word schreiben und dieses Word dann durch das FIFO schicken. So aus dem Bauch würde ich mal schauen, ob man dafür nicht gar den SFB32 DRUM verwenden kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieso? Ich denke es geht nur um Bits? Dann kann ich diese doch auf eine feste Position im Word schreiben und dieses Word dann durch das FIFO schicken. So aus dem Bauch würde ich mal schauen, ob man dafür nicht gar den SFB32 DRUM verwenden kann.

also brauchst du wieder ein 16 word fifo ... das kommt irgendwie aufs selbe raus, wie nummern vergeben ... oder irre ich?
 
du kannst auch direkt die INT im speicher rotieren/abarbeiten lassen wobei dir ein wert "n" im integerformat aussagt welche anforderung sich in der warteschleife befindet.
 
Ja, wie gesagt, jedem BIT das beim FB angebunden ist (als IN-Variable) ist ein INT zugeordnet. Darin wird gespeichert an wievielter Stelle dieses Bit gesetzt wird.

Beispiel:

Erst kommt "Bit 3"
dann "Bit 7"
dann "Bit 15"


dann schreibe ich in das zugehörige INT von Bit 3 eine "1" rein. Also wird bei diesem direkt der Ausgang geschaltet.

Die anderen beiden Bits befinden sich solange in der Warteschleife, bis Bit 1 fertig ist und rückgesetzt wird. Bis dahin steht in Bit 7 (also im zugehörigen INT) eine 2 drinnen. Und im Bit 15 (zugehöriges INT) eine 3.

Wenn Bit 3 wegfällt, rücken die anderen Bits eins auf und Bit 7 ist an der Reihe.


Nun, schreibe keine 1, 2, 3, 4 in die INTEGER, sondern 1,2,4,8,16, da ich mit SRW, SLW arbeite, aber ist ja gehopst wie gesprungen...
 
Zurück
Oben