LabVIEWForum.de - Problem mit Look up Table

LabVIEWForum.de

Normale Version: Problem mit Look up Table
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo

Eingesetzte Karte: 7831R
LabVIEW 2009

Ich versuche gerade eine Look-Up Tabe 1d mit einem Sinus zu füllen. Die Automatische Füllfunktion erlaubt nur einen Sinus mit einer Amplitude über den kompletten Wertebereich. D.H. bei I8 -+ 128 Digits. Ich benötige aber einen Sinus über 100 Werte und einer Amplitude von 80 Digits. Also dachte ich mir die 100 Werte kann ich selbst eingeben. Denkste... Wenn ich die Tabelle per Hand mit Werten füllen will zeigt er mir die Werte erstens nicht an und zweitens wird nur der letzte eingegebene Wert gesetzt, alle Anderen Werte gehen auf 0. Sehen kann ich das nur in dem Diagramm, das mir beim Eingeben angezeigt wird. Die Wertetabelle an sich ist leer.
Ist das ein Bug?
Kann ich die LUT noch anders Füllen?

Gruß Massa
Hi Massa,

hört sich an, als wenn du ohne shift register arbeitest oder ohne auto-indexing.

Für eine genauere Analyse könntest du ja einfach mal dein VI anhängen. Hier geht's ja schließlich um LV-Programmierung und nicht um Glaskugel-Lesen...
Hi,

was geht ist ein Memory-Bereich auf dem FPGA reservieren und den programmatisch über nen FiFo zu beschreiben. Hat den Vorteil, das man echt flexibel ist. Das mach ich auch so. Das mit dem manuellen Beschreiben der LUT probier ich gleich mal aus, dann weiß man, ob es von lv8.6 auf lv2009 einen bug gab...Wink

ch
Hallo chrissyPu, deine vorgeschlagene Vorgehensweise hört sich recht interessant an. Hättest du vielleicht ein kleines BeispielVI, wie du das genau anstellst?
Du verwendest also keine LUT sondern einen MemoryBlock mit "starrer" Größe?
Puh, das ist schon eine Weile her... Anbei mal zwei Screenshots, ich hab keine Test-VIs mehr gerade, die das ganze einfacher hätten und das ganze ist sonst eher unübersichtlich...

Zuerst muss man den Memoryblock mit starrer Größe definieren, dann noch einen Fifo, um ihn zu beschreiben. Das setz ich jetzt mal voraus... Dann:

Schreiben ist glaube ich leicht erklärt:
[attachment=38019]
Der N-Anschluss ist mit der Länge des Datenblocks belegt, man muss vor dem Schreiben in den FIFO kontrollieren, ob der Datenblock nicht größer als der vorher reservierte Speicherbereich ist. Ist aber ja eigentlich kein Problem, weil man die Sachen vorher weiß.

Lesen etwas aufwändiger:
[attachment=38018]
Die Ausgabe ist in einer zweistufigen Pipeline, um die Durchlaufzeit gering zu halten. Man kauft sich eine Latenz von einem Schleifendurchlauf ein, dafür ist die Ausgabe genau so schnell wie der DA-Wandler es kann, da die Berechnung vorher deutlich kürzer als die DA-Wandlung ist. Da in der Schleife noch ein paar andere Sachen passieren, ist das dazugehörige Schieberegister außerhalb. Nicht verwirren lassen.
Ich skaliere meine Memoryausgabe auch nochmal im Nachhinein, das sind die Multiplikation und das Shiften im rechten Teil des BD.
Um jetzt mehrmals den Speicherbereich auszugeben, setze ich das ganze in eine For-Schleife, die als Durchlaufanzahl das Produkt aus Speichertiefe und Anzahl der Ausgaben bekommt. Vor die Adressierung des Speichers setze ich jetzt eine Logische Und-Verknüpfung des Durchlaufzählers i mit der Zahl (N_Sp - 1), wobei N_Sp für die Anzahl der Werte im Speicher steht. Damit werden alle Bits die größer sind als die Speichertiefe ausgeblendet und der Speicher wird periodisch ausgegeben. Hielt ich damals für berechnungstechnisch am effektivsten, weiß nicht, ob es da mittlerweile bessere Sachen gibt.

Ach ja, die Sequenz braucht man hier wahrscheinlich nicht... Müsste der Compiler aber ausbügeln... Wink

Viel Erfolg,

ch
Danke Vielmals!
Jetzt hab ich selber immer an einer Lösung getüfftelt und nicht mehr nachgesehen, dass du schon lange was reingestellt hast :-)
Sieht ähnlich aus, hab mir aber nicht soviele Gedanken bezüglich der Geschwindigkeit gemacht.
Für alle:
Noch was:
Wenn ich in meinem Projekt den Memory-Block anlege, kann ich ihn implementieren als: 1)Block Memory & 2) als LookUpTable.
Bei beiden habe ich aber die selben Möglichkeiten, ich kann bei beiden die Größe wählen, den Datentyp festlegen, mit Werten im vorraus initialisieren etc.
Wozu die Auswahl? Wann wählt man was?
Hallo cRio

Ich könnte das jetzt ganz genau ausführen, aber ein Klick auf "Help" im Auswahldialog ist wohl der bessere Weg!
Ansonsten könnte ich böse sein und sagen: rtfm, aber das tue ich nicht.

Dennoch hier die Kurzform:
Memory als:
- Block Memory, für größere "Datenhappen", aber min. 1 Takt Lese-Verzug; "RAM"
- Look-Up-Table, für wenig Daten, wenn lesen im selben Takt geschehen soll; "Logik"
- DRAM, nicht auf allen FPGA-Boards verfügbar; "RAM"

Gruß
Referenz-URLs