mikrocontroller.net

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


Autor: learner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber bei 6 wird es zu hw aufwändig.
Warum?  Das sind dann einfach 2 LUTs hintereinander.
So etwa:
       _____
0 ----|     |
1 ----|     |
2 ----|     |---.
3 ----|_____|   |    _____
                `---|     |
4 ------------------|     |
5 ------------------|     |----- A
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.

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: learner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.