Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Wie bestimmt die meisten Einsteiger in die FPGA-Programmierung habe auch ich einige Probleme meines erstens FPGA-Projektes. Um das ganze vielleicht etwas anschaulicher zu gestalten hier kurz die Problemstellung:
Wir möchten in unserer Arbeitsgruppe die National Instrument Karte PCI 7811R als Pattern Generator nutzen. Genau bedeutet das, dass ich ca. 80 DIO nur für die Triggerung externer Geräte nutzen will, um so das Experiment zu steuern bzw. kontrollieren.
Von Prinzip habe ich auch einen Lösungsansatz für das Problem, aber immer wieder scheitere ich an der Größenbegrenzung der FPGA. Prinzipiell dachte ich mir, der FPGA einfach 2 Arrays zu übergeben. Der eine Array besitzt die einzelnen Pattern-Zeiten welche mir die entsprechenden Pulslängen über "Wait" erzeugen. Der 2te Array soll die Output-Informationen erhalten, quasi welcher Output ist zu dieser Zeit low und welcher high. Genau genommen soll das ganze über die Ports und nicht über einzelne Leitungen laufen. Das ganze läuft dann in einer While-Schleife bis die Arrays abgearbeitet wurden.
Das Hauptproblem meinerseits besteht nun in der Array-Größe. Da ein Experiment schon mal mit einer zweistelligen Zahl an Pattern laufen, werden beide Arrays doch ziemlich gross und in vielen Fällen scheitert man dann am kompilieren.
Da weiterhin die Experimentsteuerung in vielen Teilen zeitkristisch läuft [us bis ns] wollte ich einmal die Einstellungen an die FPGA übergeben und nicht ständig mit einem Host-VI einzelnen Werte nachliefern.
In den zahlreichen Beispielen habe ich leider nichts annäherndes gefunden, wie man sowas umsetzen kann. Darum wollte ich hier mal nachfragen, ob jemand eventuell mit sowas schon einmal zu tun hatte und seine Erfahrungen teilen möchte.
Hi Falk,
wieviel Speicher brauchst du und wie hast du denn angelegt?
Die 7811 hat glaub ich 48kB RAM also 12k X 32 - wenn das nicht reicht musst du wohl daten nachschieben, per DMA und FIFO, da liegst du je nach rechner und auslastung bei ein paar 100us, was aber nicht ausmacht wenn du die fifo-steuerung gut machst.
Arrays im Zellenbereich knacken schnell die Grenze.
Ich hab das nun auch seit vorgestern über den internen Speicher der Karte gemacht. Passt alles wunderbar und funzt sogar. Wenn nicht das kompilieren so zeitaufwändig wäre, würde das sogar richtig Spass machen.
Ich hänge hier an dieser Stelle mal wieder einen Beitrag dran, der zwar nur indirekt was mit Arrays zu tun hat.
Hier mein jetziges Problem!
In einer U32 Zahl habe ich verschiedene Kontrollinformationen versteckt. Nun möchte ich mir aus dieser Zahl wieder einzelne Bits herausholen um an eine gewünschte Info zu kommen. Kurz und knapp, ich möchte einzelne Bits aus der Zahl gewinnen. Die Angabe ist hierbei das Start-Bit und die Länge, also wieviele Bits danach interessant sind.
An sich habe ich mir dafür auch etwas gebastelt, allerdings scheitere ich auf der FPGA stets an dem Problem, dass immer wenn ich die Zahl in einen Boolean-Array umwandel und anschließend mir den gewünschten Teilarray ausschneide, ich das Problem der festen Dimensionslänge von Arrays habe.
Darum frag möchte ich hier mal in die Runde fragen, ob jemand mir vielleicht einen kleinen Tipp dazu geben könnte, wie ich aus einer Zahl am besten ein oder mehrere Bits herausholen kann?
1M Gate Karten haben IMMER 80kB und 3M Gate Karten immer 192kB wobei die kleines adressierbare memoryeinheit 2kB betraegt (Gilt fuer FIFO als auch fuer Memory Write/Read).
Arrays am FPGA zu verwenden ist ne schlechte Variante, weil Arrays, je nach Aufbau, sehr viel Gates sinnlos verbraten.
Besser waere es an der Stelle, einen FIFO zu definieren, skalare Werte in diesen FIFO zu schreiben (eigene Schleife) und in einer anderen Schleife die Werte wieder auszulesen und auf die div. Ports zu schreiben
(wenn du eine aeltere lv fpga version als 8.2 verwenden solltest, dann kommen zur 2kB minimal Adressierung noch andere Restrikitionen hinzu!)
Danke für deine Antwort, allerdings ist diese Frage bezüglich der Nutzung der Memories schon geklärt. Mein letzter Beitrag sollte weniger auf die Arrays zu sprechen kommen, sondern vielmehr wie ich aus einer 32-bit Zahl beispielsweise das 8 und 9 Bit rauskriege. Die erste Idee war da freilich die Zahl in einen boolschen Array umzuwandeln und dann handelsüblich mit den Array Funktionen zu arbeiten (Teilarray ersetzen,...). Leider stellen sich hier auf der FPGA die üblichen Probleme mit Arrays ein. Nichts desto trotz hab ich das Problem gelöst bekommen. Nun ist stellt sich für mich bloss die Frage, wie ich eine Info wieder in die 32-bit Zahl hineinbekomme bzw. verändern kann. Na mal schauen was ich heute abend noch alles hinbekomme.
du könntest ganz klassisch "ver-UND-en" bzw. "ver-ODER-n", d.h. boolesche Funktionen anwenden.
An die booleschen Funktionen kannst du ja auch boolesche Arrays direkt anschließen!
Gruss
Achim
Hallo Achim!
Also ich hab meine beiden Probleme nun gelöst bekommen. Weiß nicht ob es eine sinnvolle Lösung ist, aber ich werd mal schauen. Da ich jetzt gerade das Problem habe, dass ich mein Programm nicht auf die FPGA bekomme (von wegen zu gross) kann ich noch nicht sagen, ob es so klappt wie ich es mir vorgestellt habe.