Forum: FPGA, VHDL & Co. LUT ohne die Resynthese ändern


von learner (Gast)


Lesenswert?

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

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


Lesenswert?

> 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.

von Schrotty (Gast)


Lesenswert?

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.

von learner (Gast)


Lesenswert?

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

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


Lesenswert?

> 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 ;-)

von Morin (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.