Ist sowas möglich? Ich habe 6 bit-Signale, die möchte ich boolisch zur Laufzeit beliebig verknüpfen will. Zum Beispiel signal b: bit_vector(1 to 6); Es gibt 6 Tasten, eine für jedes Signal. Dazu gibt es eine UND und eine ODER Taste, plus RETURN Taste. b1 Taste mit nachfolgender UND Taste und nachfolgender b3 Taste und nachfolgender RETURN Taste, heisst damit b1&b2. Ihr versteht die Idee. Das ist nur Setup, b Array ändert sich mit clock, dh zur Zeit der Eingabe interessieren nicht die eigentlichen gerade anliegende Werte, sondern die Verknüpfung an sich. Wären es 4 Signale, könnte man alle (16) möglichen Funktionen parallel berechnen, und Setupeingabe in eine Adresse umrechnen, die eine aus den 16 auswählt. Aber bei 6 wird es zu hw aufwändig. servus
> Aber bei 6 wird es zu hw aufwändig.
Warum? Das sind dann einfach 2 LUTs hintereinander.
So etwa:
1 | _____ |
2 | 0 ----| | |
3 | 1 ----| | |
4 | 2 ----| |---. |
5 | 3 ----|_____| | _____ |
6 | `---| | |
7 | 4 ------------------| | |
8 | 5 ------------------| |----- A |
9 | Und/Oder -----------|_____| |
Aber mach dir mal keine allzugroßen Sorgen: du sprichst sowieso von LUTs, d.h. du verwendest ein FPGA. Und die für die Tasteneingabe nötige SM braucht sowieso wesentlich mehr Logik als deine Kombinatorik. BTW: > die möchte ich boolisch zur Laufzeit... Lass doch die Anglizismen und schreibe kombinatorisch. Boolisch hört sich irgenwie nach Boolshit an ;-) UND: Statt > signal b: bit_vector(1 to 6); ist > signal b: bit_vector(5 downto 0); üblich. Auch in unseren üblichen Zahlensystemen (dem 2-er, 10er- und 16er-System) sind die höchstwertigen Stellen links.
Du willst also aus einer Auswahl von 6 Eingängen zur Laufzeit zwei der sechs Eingänge kombinatorisch verknüpfen, wenn ich das richtig verstehe? Dazu würde ich bei der Festlegung der Funktion mir in je ein Register Speichern, um welche beiden Eingänge es sich handelt.(Bit1 und Bit2). Diese legen die Bits aus dem Eingangsvektor fest, die verknüpft werden sollen. Dann würde ich mir die auszuführende Funktion in ein weiteres Register (gewählte_funktion) speichern. Und dann das ganze mit einem IF lösen If gewählte_funktion = UND then Ausgang <= Eingangsvektor(Bit1) AND Eingangsvektor(Bit2); else Ausgang <= Eingangsvektor(Bit1) OR Eingangsvektor(Bit2); end if; ggf. musst Bit1 und Bit2 casten, dass es geht. Aber im Prinzip wäre das recht einfach.. Den komplexeren Teil an deiner Aufgabe seh ich in dem Einlesen der Operanden und der Funktion an sich. Dazu brauchst ne FSM.
Ne Leute, so meine ich das nicht^^ Aber bei der Beschreibung habe ich mich übrigens auch selbst vertan. Im Allgemeinen kann eine black box mit 2 Eingängen 16 Funktionen realisieren. Eine mit 3 Eingängen kann schon 2**(2**3) = 256 Funktionen realisieren, usw. So wie Du Lothar vorschlägst, wird eben nur eine dieser Funktionen implementiert. Welche davon, das hängt von den 16 SRAM-Bits, mit denen die LUT4 initialisiert worden ist. Zum Beispiel eine Funktion, die alle 4 Eingänge verundet, wird mit 1000_0000_0000_0000 geladen. Eine die alle 4 Eingänge verodert => 1111_1111_1111_1110. Dazwischen gibt es alle möglichen, wie b1&&b2||b3||b4. Und das ohne Resynthese geschehen. Ich hab mir inzwischen schon etwas überlegt. Ich nehme RAM32x1S und beschreibe diesen vom PC aus, wohlgemerkt ohne die Resynthese. An die Adressen lege ich dann b1,b2,b3,b4 an. Hat jemand bedenken zu dieser Lösung? Grüsse
> b1&&b2||b3||b4 Das hat natürlich was. Wie setzt du die Prioritäten? ODER vor UND bzw. UND vor ODER bzw. von links nach rechts Muss das Ergebnis sofort da sein? Oder kannst du das Ganze in einer SM abarbeiten? > Ich hab mir inzwischen schon etwas überlegt. Ich nehme RAM32x1S > und beschreibe diesen vom PC aus, wohlgemerkt ohne die Resynthese. > An die Adressen lege ich dann b1,b2,b3,b4 an. Das kannst du als Distributed RAM machen, dann kommt die Logik in die LUTs ;-)
> Ich hab mir inzwischen schon etwas überlegt. Ich nehme RAM32x1S > und beschreibe diesen vom PC aus, wohlgemerkt ohne die Resynthese. > An die Adressen lege ich dann b1,b2,b3,b4 an. > > Hat jemand bedenken zu dieser Lösung? Schau mal ins Datenblatt wie das implementiert wird. Wie Lothar schon sagte: es sollte Distributed RAM sein - das sind nämlich genau zur Laufzeit wiederbeschreibbare LUTs. Im Zweifel kannst du explizit die wiederbeschreibbaren LUTs instanziieren.
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.