Forum: FPGA, VHDL & Co. Suche nach FPGA Board


von Hans (Gast)


Lesenswert?

Hallo zusammen,

bisher nutze ich das Spartan 3an Starter Kit und bin damit auch recht 
zufrieden. Der FPGA selbst besitzt allerdings nicht sehr viele 
Logikgatter, so dass ich jetzt an der Leistungsgrenze des Boards 
angekommen bin. Auf dem Board ist eine XC3S700AN verbaut. Diese Serie 
gibt es auch noch als 1400er mit rund der doppelten Leistung. Jedoch 
habe ich hierzu kein Starter Kit gefunden. Grundsätzlich benötige ich 
etwa 10 digitale I/O Pins sowie A/D und D/A Wandler (jeweils 2 
mindestens). Kann mir jemand ein passendes Board empfehlen?

Eventuell gibts auch Boards ohne die Wandler, die sich aber per 
Expansion Card erweitern ließen?

Für eure Tips wäre ich dankbar!

Grüße

Hans

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


Lesenswert?

Hans schrieb:
> Der FPGA
Der Array? Oder eher: das Array?

> Der FPGA selbst besitzt allerdings nicht sehr viele Logikgatter, so dass
> ich jetzt an der Leistungsgrenze des Boards angekommen bin.
Was hast du darauf gepackt?

> sowie A/D und D/A Wandler (jeweils 2 mindestens).
Wie schnell und wie breit?

> Diese Serie gibt es auch noch als 1400er mit rund der doppelten Leistung.
Leistung? Woher hast du diesen Begriff?
FPGAs werden nach Ressourcen (Logikzellen, RAM, Recheneinheiten, 
CPU-Cores) oder allgemein nach "Größe" bewertet.

Muss es unbedingt ein S3 Board sein?

: Bearbeitet durch Moderator
von Gustl B. (-gb-)


Lesenswert?

Wegen AD/DA-Wandlern: Wenn die langsam sind, also für Audio, dann kann 
man sich die auch selber basteln, also ein IO Pin Reicht für PWM Audio 
oder einen 1-Bit ADC. Für die Digilent Boards gibt es auch PMODS, also 
Zusatzplatinen für alles Mögliche.

Sonst bin ich sehr positiv überrascht vom OpenADC, der passt auch an 
zwei PMOD Buchsen der Digilent Boards.

Ich würde derzeit was mit einem Artix kaufen, die haben doch eine 
ordentliche Ausstattung und sogar eingebaute ADCs. Ztex hat da ein paar 
Platinen und auch Digilent das Nexys4.

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> Der FPGA
> Der Array? Oder eher: das Array?
>
>> Der FPGA selbst besitzt allerdings nicht sehr viele Logikgatter, so dass
>> ich jetzt an der Leistungsgrenze des Boards angekommen bin.
> Was hast du darauf gepackt?
>
>> sowie A/D und D/A Wandler (jeweils 2 mindestens).
> Wie schnell und wie breit?
>
>> Diese Serie gibt es auch noch als 1400er mit rund der doppelten Leistung.
> Leistung? Woher hast du diesen Begriff?
> FPGAs werden nach Ressourcen (Logikzellen, RAM, Recheneinheiten,
> CPU-Cores) oder allgemein nach "Größe" bewertet.
>
> Muss es unbedingt ein S3 Board sein?

Derzeit generiere ich digitale Signale (Rechteck) bis 180ns Pulsbreite 
und ein analoges Sinussignal (um 200Hz) die ich rausgebe. Außerdem muss 
ich mir für unterschiedliche Frequenzen Zeiten auf einer Sinuswelle 
berechnen. Für eine feste Frequenz könnte ich die Zeitwerte in einer LUT 
hinterlegen, da die Frequenz aber variabel ist muss ich ständig 128 
Zeitpunkte auf meinem Sinus berechnen. Hierzu muss ich durch die 
aktuelle Frequenz teilen - die Zählerwerte sind in einer LUT 
gespeichert. Das frisst wohl recht viele Logikzellen... Ich hatte 
zunächst vermutet, dass die For Schleife soviele Resourcen benötigt, 
jedoch ist kein Unterschied zu einer Ausformulierung der 128 
Berechnungsschritte festzustellen. Liegt es an der Verwendung der vielen 
Divisionen?

Die A/D haben 14bit und die D/A 12 bit bei 1,5 MHz. Es muss nicht 
unbedingt ein S3 Board sein, jedoch wäre es schon nett, wenn man 
zusätzlich ein paar Switches und Kommunikationsschnittstellen (z.B. 
seriell) hätte. Ein typisches Starterkit oder Eval-Kit. Mir würde das 
Spartan 3AN mit mehr Logikzellen (15TSD+) ja genügen. Leider habe ich 
mit googlen noch nichts passendes gefunden.

von J. S. (engineer) Benutzerseite


Lesenswert?

Gustl Buheitel schrieb:
> ie haben doch eine
> ordentliche Ausstattung und sogar eingebaute ADCs
Die sind aber eher für Spannungsüberwachungsaufgaben gedacht und 
keinesfalls für Audio oder Messaufgaben mit höherer Genauigkeit.

von Gustl B. (-gb-)


Lesenswert?

Also die XADC in den Xilinx 7 FPGAs sind 12Bit und bis zu 1MSps, damit 
lässt sich locker Audio machen. Sonst empfehle ich den OpenADC, aber der 
hat glaube ich eine minimale Samplerate von 5MSps und "nur" 10 Bits. 
Digilent hat aber auch PMOD AD/DA Wandler. Die kann man dann auch an das 
Nexys4 mit dickem Artix ranstecken. Serielle und Knöpfe und Zeug hat das 
auch.

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


Lesenswert?

Hans schrieb:
> die Zählerwerte sind in einer LUT gespeichert. Das frisst wohl recht
> viele Logikzellen...
Wenn man die LUT nicht richtig beschreibt und kein BlockRAM verwendet, 
dann schon. Ich empfehle hier den XST Users Guide und die XAPP463...


> Ich hatte zunächst vermutet, dass die For Schleife
> soviele Resourcen benötigt, jedoch ist kein Unterschied zu einer
> Ausformulierung der 128 Berechnungsschritte festzustellen. Liegt es an
> der Verwendung der vielen Divisionen?
Kann sein, mir schwant da Übles...
Man könnte das evtl. beurteilen, wenn du die VHDL-Dateien postest.

von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> die Zählerwerte sind in einer LUT gespeichert. Das frisst wohl recht
>> viele Logikzellen...
> Wenn man die LUT nicht richtig beschreibt und kein BlockRAM verwendet,
> dann schon. Ich empfehle hier den XST Users Guide und die XAPP463...
>
>> Ich hatte zunächst vermutet, dass die For Schleife
>> soviele Resourcen benötigt, jedoch ist kein Unterschied zu einer
>> Ausformulierung der 128 Berechnungsschritte festzustellen. Liegt es an
>> der Verwendung der vielen Divisionen?
> Kann sein, mir schwant da Übles...
> Man könnte das evtl. beurteilen, wenn du die VHDL-Dateien postest.

Die Rechnung die 65 mal pro Takt (20ns) in einem Prozess durchgeführt 
wird ist:

C1*Signal/C2

C1 ist eine Konstante und C2 eine konstante 2er Potenz. Signal ist eine 
Variable, die in jedem Berechnungsschritt errechnet werden muss. Alle 65 
Ergebnisse werden in einem Array abgespeichert. Kann man das eleganter 
lösen?

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


Lesenswert?

Hans schrieb:
> Die Rechnung die 65 mal pro Takt (20ns) in einem Prozess durchgeführt
> wird ist: C1*Signal/C2
(Warum) muss das so oft und schnell passieren?

Übrigens: es ist egal, ob diese Berechnung in einem Prozess durchgeführt 
wird oder nicht. Denn auf der Hardware gibt es keine Prozesse mehr...

> C2 eine konstante 2er Potenz.
Dann ist da keine Division nötig und wird sicher auch nicht eingesetzt.

> Signal ist eine Variable, die in jedem Berechnungsschritt errechnet
> werden muss.
Was ist ein "Berechungsschritt"?

> Alle 65 Ergebnisse werden in einem Array abgespeichert.
Auf der Hardware gibt es keine Arrays. Dort gibt es nur Luts, Register, 
RAMs, Multiplizierer und so Zeug. Dein Array muss irgendwie darauf 
abgebildet werden.

> Kann man das eleganter lösen?
Das weiß man nur, wenn man die Aufgabe (woher und wie schnell kommen die 
Daten, was muss mit ihnen wie oft passieren und wo gehen sie 
letztendlich hin) und den jetzigen VHDL Code kennt...

: Bearbeitet durch Moderator
von uwe (Gast)


Lesenswert?

> Ich hatte zunächst vermutet, dass die For Schleife
> soviele Resourcen benötigt, jedoch ist kein Unterschied zu einer
> Ausformulierung der 128 Berechnungsschritte festzustellen
Weil die For Schleife automatisch "ausformuliert" wird in VHDL...
Es sollte also kein Unterschied zu sehen sein. Wenn du die berechnungen 
nacheinander ausführen willst, dann mußt du das über eine Statemachine 
machen. Denn eine Schleife mit for wird "ausgeklappt" und die Berechnung
findet auf allen Elemten gleichzeitig (parallel) statt.

von Hans (Gast)


Lesenswert?

Also, die berechnung muss in jedem takt (das meinte ich mit 
berechnungsschritt) erfolgen weil ich zeitkritische signale rausgeben 
muss. Hierzu muss ich wissen wo ich mich gerade auf dem sinus befinde 
(jedenfalls im rahmen der 65 diskreten berechneten positionen) und das 
für unterschiedliche frequenzen. Das eingangssignal also die frequenz 
kann sich jederzeit ändern. Theoretisch würde es auch reichen wenn ich 
alle 0, 01s die positionswerte neu berechnen würde aber die anzahl der 
logikbausteine bleibt dann dieselbe. Ich brauche eine effiziente 
möglichkeit 64 werte pro takt zu berechnen die abhängig sind von einer 
variablen.

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


Lesenswert?

Hans schrieb:
> die berechnung muss in jedem takt erfolgen
> ...
> würde es auch reichen wenn ich alle 0, 01s ... neu berechnen würde
Ja, was denn jetzt?

> aber die anzahl der logikbausteine bleibt dann dieselbe.
Nein, ganz und gar nicht: du brauchst dann nämlich nur noch 1 einzige 
Recheneinheit, die nacheinander die paar wenigen Ergebnisse 
ausrechnet. Und sogar die langweilt sich noch zu Tode. Denn 10ms 
("ausreichend" oft) im vergleich zu 10ns (bei 100MHz "in jedem takt") 
sind immerhin 6 Zehnerpotenzen...  :-o
So ähnlich wie auf dem Kinderspielplatz: da reicht eine einzige Schaukel 
auch für viele Kinder, wenn die nicht gleichzeitig schaukeln. Und Nachts 
ist sie sogar leer...
So wird es übrigens auch auf ALLEN uC und Prozessoren gemacht: eine 
(mehr oder weniger komplexe) Recheneinheit reicht für alles aus...

von Hans (Gast)


Lesenswert?

> Nein, ganz und gar nicht: du brauchst dann nämlich nur noch 1 einzige
> Recheneinheit, die nacheinander die paar wenigen Ergebnisse ausrechnet.
> Und sogar die langweilt sich noch zu Tode. Denn 10ms ("ausreichend" oft)
> im vergleich zu 10ns (bei 100MHz "in jedem takt") sind immerhin 6
> Zehnerpotenzen...  :-o
> So ähnlich wie auf dem Kinderspielplatz: da reicht eine einzige Schaukel
> auch für viele Kinder, wenn die nicht gleichzeitig schaukeln. Und Nachts
> ist sie sogar leer...
> So wird es übrigens auch auf ALLEN uC und Prozessoren gemacht: eine
> (mehr oder weniger komplexe) Recheneinheit reicht für alles aus...

Also brauche ich dann deutlich weniger bausteine wenn ich pro takt nicht 
die vollen 64 Berechnungen ausführe sondern nur ein teil? Und die 
gleiche Schaltung wird dann für alle Rechnungen nacheinander verwendet?

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


Lesenswert?

Hans schrieb:
> Also brauche ich dann deutlich weniger bausteine wenn ich pro takt nicht
> die vollen 64 Berechnungen ausführe sondern nur ein teil?
Du brauchst z.B. statt 64 Multiplizierern dann nur 1 einzigen. Nur 
solltest du dann dein "Array" auch in ein RAM packen, denn dort bekommst 
du dann den nötigen Multiplexer zur Umschaltung der Rechendaten 
(Operanden und Ergebnis) umsonst dazu...

> Und die gleiche Schaltung wird dann für alle Rechnungen nacheinander
> verwendet?
Wenn die Zeit ausreicht.

von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> Also brauche ich dann deutlich weniger bausteine wenn ich pro takt nicht
>> die vollen 64 Berechnungen ausführe sondern nur ein teil?
> Du brauchst z.B. statt 64 Multiplizierern dann nur 1 einzigen. Nur
> solltest du dann dein "Array" auch in ein RAM packen, denn dort bekommst
> du dann den nötigen Multiplexer zur Umschaltung der Rechendaten
> (Operanden und Ergebnis) umsonst dazu...
>
>> Und die gleiche Schaltung wird dann für alle Rechnungen nacheinander
>> verwendet?
> Wenn die Zeit ausreicht.

Also zum Beispiel in den BRAM? Könntet ihr eventuell einen effizienten 
Beispielcode posten für die Durchführung zweier Multiplikation z.B

A= K*Signal_v
B= K*Signal_v

wobei pro Takt nur eine der Berechnungen ausgeführt und das Ergebnis als 
Array in einen RAM geschrieben wird. Für weitere Berechnungen soll das 
Array erst zur Verfügung stehen, sobald alle Arrayeinträge berechnet 
wurden.

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


Lesenswert?

Hans schrieb:
> Könntet ihr
Oha, Pluralis Majestatis...  ;-)

> Könntet ihr eventuell einen effizienten Beispielcode posten für
> die Durchführung zweier Multiplikation z.B
> A= K*Signal_v
> B= K*Signal_v
Dafür nimmt man kein RAM. Deshalb kann es auch keinen effizienten Code 
mit einem RAM dafür geben. Ein RAM muss über Adressleitungen angesteuert 
erden und hat Datenleitungen als Ein- und Ausgang. DU musst jetzt deinen 
Algorithmus so anpassen, dass er gut damit funktioniert.

> Könntet ihr eventuell einen effizienten Beispielcode posten für
> die Durchführung zweier Multiplikation
Sagen wir mal, du willst 64 Multiplikationen machen und das RAM mit 
Ergebnissen füllen, dann ergibt das mehr Sinn. Also nehmen wir mal sowas 
und basteln uns ein RAM:
http://www.lothar-miller.de/s9y/archives/20-RAM.html
1
...
2
3
type speicher is array(0 to 63) of STD_LOGIC_VECTOR(7 downto 0);
4
signal memory : speicher;   
5
singal adresse: integer range 0 to 63 :=0;
6
signal result : STD_LOGIC_VECTOR(7 downto 0);
7
...
8
9
  process begin         -- Verwaltung der Adresse
10
    wait until rising_edge(CLK);
11
    if aktiv='0' then     adresse<=0;
12
    elsif adresse<63 then adresse<=adresse+1;
13
    end if;
14
  end process;
15
16
  result <= PassendeKonvertierung(K*Signal_v); -- kann laufend ausgerechnet werden
17
18
  process begin         -- RAM mit Daten füllen
19
    wait until rising_edge(CLK);
20
    if (aktiv='1') then
21
      memory(to_integer(unsigned(adresse))) <= result;
22
    end if;
23
  end process;
24
25
...

: Bearbeitet durch Moderator
von Hans (Gast)


Lesenswert?

Danke, ich probier es mal damit!

von Hans (Gast)


Lesenswert?

Warum macht es keiner Unterschied in der Anzahl der genutzten 
Logik-Zellen, wenn ich auf einmal alle Werte berechne oder pro Takt nur 
ein Wert berechne?

Code 1:
1
 
2
type t_memory_position_x is array(0 to 64) of Integer;
3
signal c_sine_position_x : t_memory_position_x;
4
signal c_sine_position_x_fertig : t_memory_position_x;
5
signal aktiv : std_logic := '0';
6
signal adresse : integer range 0 to 64 := 0;
7
signal result : integer;
8
signal c_rising_edges : INTEGER RANGE 2000 to 2500 := 2270;          
9
constant c_divisor : INTEGER := 8192;
10
11
constant c_sine_value_x : t_memory_position_x := (0, ..., 2048); -- enthält 65 Werte
12
13
begin
14
15
process begin
16
  wait until rising_edge(CLK);
17
  if aktiv='0' then 
18
    adresse <= 0;
19
    aktiv <= '1';
20
  elsif adresse<64 then
21
    adresse <= adresse + 1;
22
  else
23
    aktiv <= '0';
24
  end if;
25
end process;
26
27
result <= c_sine_value_x(adresse) * c_rising_edges/c_divisor;
28
29
process begin
30
  wait until rising_edge(CLK);
31
  if (aktiv='1') then
32
      c_sine_position_x(adresse) <= result;
33
  else
34
    c_sine_position_x_fertig <= c_sine_position_x;
35
  end if;
36
end process;

Code 2:
1
type t_memory_position_x is array(0 to 64) of Integer;
2
signal c_rising_edges : INTEGER RANGE 2000 to 2500 := 2270;
3
constant c_divisor : INTEGER := 8192;
4
signal c_sine_position_x : t_memory_position_x; 
5
6
begin
7
8
c_sine_position_x <=  (0 * c_rising_edges/c_divisor, ..., 2048 * c_rising_edges/c_divisor);  -- enthält 65 Multiplikationen

von Gustl B. (-gb-)


Lesenswert?

Vermutlich wird da alles bei der Synthese berechnet. Kommen da Werte von 
aussen rein?

c_sine_position_x <=  (0 * c_rising_edges/c_divisor, ..., 2048 * 
c_rising_edges/c_divisor);

kann mit

constant c_divisor : INTEGER := 8192;

auch sehr stark vereinfacht werden.

Ich weiß ja nicht wie Multiplikationen mit Integer gemacht werden, aber 
ich würde vermuten, dass

c_rising_edges/c_divisor

immer Null ergibt wenn c_rising_edges > c_divisor. Denn mit c_divisor = 
8192 kann man schreiben c_rising_edges/8192, das ist das Gleich, wie 
wenn du c_rising_edges um 13 Stellen nach rechts verschiebst. Da 
c_rising_edges aber immer kleiner 8192 ist sind dann alle stellen leer, 
also Null.

Im ersten Teil wird das bei der Synthese vermutlich genauso 
wegoptimiert.

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


Lesenswert?

Hans schrieb:
> enthält 65 Multiplikationen
Sieht das der Synthesizer auf so? Wird irgendwo von dem Array auch 
gelesen und irgendwas ausgegeben? Wenn nicht, dann sagt sich der 
Synthesizer: "Nutzlos, kann alles wegoptimiert werden!"

> Anzahl der genutzten Logik-Zellen
Und die ist wie hoch?

: Bearbeitet durch Moderator
von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> enthält 65 Multiplikationen
> Sieht das der Synthesizer auf so? Wird irgendwo von dem Array auch
> gelesen und irgendwas ausgegeben? Wenn nicht, dann sagt sich der
> Synthesizer: "Nutzlos, kann alles wegoptimiert werden!"

Es wird in mehreren if-Abfragen aus dem Array gelesen. Das hatte ich bei 
der ersten Betrachtung nicht beachtet und deswegen hat der Synthesizer 
es wegoptimiert.

>> Anzahl der genutzten Logik-Zellen
> Und die ist wie hoch?

Wenn ich jetzt aus dem Array lese, erhalte ich folgende Ausnutzung

Code 1:
Number of Slices: 3361 (57%)
Number of Slice Flip Flops: 1552 (13%)
Number of 4 input LUTs: 5322 (45%)
Number of bonded IOBs: 26 (6%)
Number of MULT18X18SIOs: 2 (10%)
Number of GCLKs: 1 (4%)

Code 2:
Number of Slices: 2657 (45%)
Number of Slice Flip Flops: 114 (0%)
Number of 4 input LUTs: 5086 (43%)
Number of bonded IOBs: 26 (6%)
Number of MULT18X18SIOs: 20 (100%)
Number of GCLKs: 1 (4%)

Sollte die Ausnutzung der Logik-Zellen bei dem Code 1 nicht wesentlich 
geringer sein?

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


Lesenswert?

Hans schrieb:
> Wenn ich jetzt aus dem Array lese
Wie liest du aus dem Array? Das Problem hier ist nämlich ganz einfach 
dass du offenbar von 2 Stellen aus dem Array liest (einmal dort, wo 
gerechnet wird und einmal dort, wo du die Werte ausgeben willst). Und 
wie muss ein Bauteil aussehen, das zwei Lese-Ports bietet? Wie muss so 
ein Bauteil beschrieben werden? Stichworte: XST Users Guide und XAPP463 
(für S3)

: Bearbeitet durch Moderator
von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> enthält 65 Multiplikationen
> Sieht das der Synthesizer auf so? Wird irgendwo von dem Array auch
> gelesen und irgendwas ausgegeben? Wenn nicht, dann sagt sich der
> Synthesizer: "Nutzlos, kann alles wegoptimiert werden!"
>
>> Anzahl der genutzten Logik-Zellen
> Und die ist wie hoch?

In diesem Beispiel wurde nur der dargestellte Code synthetisiert. Hier 
werden in beiden Fällen etwa 75 Zellen benötigt. Wenn ich das oben 
dargestellte in den restlichen Code einbinde, also das Array auch 
abfrage, dann ist die Variante mit BRAM sogar deutlich aufwendiger 
bezüglich der Resourcennutzung. Aber ich habe es genau so eingebunden 
wie oben im Beispiel dargestellt. Kurzum, die Nutzung des BRAM hat zu 
einer Verschlechterung bzw. bin ich im Gesamtprojekt von 103% auf 128% 
Slices gerutscht. Die Nutzung des BRAM oben ist aber richtig umgesetzt? 
In der Simulation jedenfalls schreibt er pro Takt auch nur ein Ergebnis 
in das Array...müsste also weniger Aufwand pro Schritt haben und weniger 
Slices nutzen. Tut er aber nicht... :(

@Gustl
Wenn er die Multiplikationen so durchführen würde, dann wäre mein Array 
ja immer mit Nullen gefüllt. Ist es aber nicht. Ich denke, dass er erst 
die Multiplikation ausführt und dann durch 8094 teilt. So ist es auch 
gedacht. Grundsätzlich hätte ich mit einer Kommazahl Multiplizieren 
müssen, diese multipliziere ich mit 8094 um einen Integer Vorfaktor zu 
erhalten (hier zwischen 0...2048). Der Vorfaktor wird dann mit dem 
variablen Frequenzsignal (c_rising_edges) multipliziert und anschließend 
erfolgt die Division durch 8094, um das richtige Ergebnis zu erhalten. 
Darum steht in dem Array auch das Richtige drin. Eine Multiplikation mit 
Kommazahlen wäre ja nicht synthetisierbar oder?

von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> Wenn ich jetzt aus dem Array lese
> Wie liest du aus dem Array? Das Problem hier ist nämlich ganz einfach
> dass du offenbar von 2 Stellen aus dem Array liest (einmal dort, wo
> gerechnet wird und einmal dort, wo du die Werte ausgeben willst). Und
> wie muss ein Bauteil aussehen, das zwei Lese-Ports bietet? Wie muss so
> ein Bauteil beschrieben werden? Stichworte: XST Users Guide und XAPP463
> (für S3)

Ich lese mit der folgenden for-Schleife aus dem Array:
1
for i in 1 to c_position_x/2 loop                  
2
  if (counter_position >= c_sine_position_x(i-1) and counter_position < c_sine_position_x(i)) then                  
3
    position := i;
4
  end if;
5
end loop;

Aber warum lese ich dort, wo gerechnet wird, aus dem Array? Dort 
schreibe ich die berechneten Werte doch nur ins Array.

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


Lesenswert?

Hans schrieb:
> Dort schreibe ich die berechneten Werte doch nur
Ich habe es gerade erst gesehen... :-o

Es ist aber sowieso viel viel schlimmer:
1
    c_sine_position_x_fertig <= c_sine_position_x;
Hier wird alles komplett auf einen Schwung "umkopiert".
Und dann:
> Ich lese mit der folgenden for-Schleife aus dem Array:
Eine Loop bedeutet in VHDL immer "alles parallel und gleichzeitig".

Das kann in beiden Fällen nie&nimmer ein RAM geben! In welchem Bauteil 
sollte denn parallel ein kompletter Speicherbereich in einen anderen 
kopiert werden können? Oder wie sollte ein RAM (ja, diese schwarzen 
Käfer mit Adress- und Datenleitungen) alle Daten parallel an seinen Pins 
ausgeben können? Ich kenne keinen solchen Baustein, aber der Synthesizer 
baut dir deine Beschreibung freundlicherweise wie gewünscht aus vielen, 
vielen kleinen einzelnen Speicherelementen auf.

Kurz&knackig: bei einem RAM kann immer nur auf 1 einziges Element 
zugegriffen werden. Wenn du das nicht tust, dann wird kein RAM daraus.

Du musst also die erwähnten Dokumente LESEN, VERSTEHEN und ANWENDEN. 
Dann wird dein "großes" Design plötzlich ganz klein...

: Bearbeitet durch Moderator
von uwe (Gast)


Lesenswert?

Und nochmal:
Wenn du die berechnungen
nacheinander ausführen willst, dann mußt du das über eine Statemachine
machen. Denn eine Schleife mit for wird "ausgeklappt" und die Berechnung
findet auf allen Elemten gleichzeitig (parallel) statt.

von Hans (Gast)


Lesenswert?

Okay, das macht Sinn. Heißt das auch, dass ich pro Takt nur auf ein 
Element im BRAM zugreifen kann? Dann würde ich nämlich einige Takte 
brauchen und somit mit meinem Timing nicht mehr hinkommen. Gibts 
Alternativen, ansonsten muss ich ihn die Multiplikationen wie oben 
ausgeführt berechnen lassen.

von Hans (Gast)


Lesenswert?

...und noch was. Wenn ich eine loop mache, dann ist das doch identisch 
mit den ausgeschriebenen Zeilen anhängig von den Schleifendurchläufen. 
Wenn das Ganze in einem Prozess steht, dachte ich, dass die Zeilen dann 
sequentiell abgearbeitet werden. Innerhalb der loop passiert das dann 
nicht?

von Hans (Gast)


Lesenswert?

Hans schrieb:
> ...und noch was. Wenn ich eine loop mache, dann ist das doch
> identisch
> mit den ausgeschriebenen Zeilen anhängig von den Schleifendurchläufen.
> Wenn das Ganze in einem Prozess steht, dachte ich, dass die Zeilen dann
> sequentiell abgearbeitet werden. Innerhalb der loop passiert das dann
> nicht?

Hat sich erledigt^^

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


Lesenswert?

Hans schrieb:
> Hat sich erledigt^^
Falls trotzdem mal einer fragt: Wieso?
Der Denkfehler ist hier:
> Wenn das Ganze in einem Prozess steht, dachte ich, dass die Zeilen dann
> sequentiell abgearbeitet werden.
Nur der Simulator rechnet sich den Prozess "von oben her" aus. Und damit 
"gewinnt" z.B. die letzte Signalzuweisung.
Aber auf der Hardware wird ein Prozess nicht "abgearbeitet". Er wird nur 
vom Synthesizer so umgesetzt, dass auch hier die letzte 
Signalzuweisung gewinnt. Trotzdem ist der komplette "Prozessinhalt" 
komplett, parallel und gleichzeitig in der Hardware vorhanden.

: Bearbeitet durch Moderator
von uwe (Gast)


Lesenswert?

> Okay, das macht Sinn. Heißt das auch, dass ich pro Takt nur auf ein
> Element im BRAM zugreifen kann? Dann würde ich nämlich einige Takte
> brauchen und somit mit meinem Timing nicht mehr hinkommen.
Der 700er hat doch 20 mal 18kBit Dualport BlockRAMs drinne.
Du kannst also z.B.
BlockRAM3(n)=BlockRAM1(n) x BlockRAM2(n) + BlockRAM2(n)
rechnen oder was auch immer und wenn du noch enen Brauchst du hast 20 
stück a 18kBit da drinne und die sind auch noch jedes für sich 
Dualported.

von uwe (Gast)


Lesenswert?

ich empfele dir mal das Datenblatt durchzulesen, wie die S3s aufgebaut 
sind:
http://www.xilinx.com/support/documentation/data_sheets/ds557.pdf

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


Lesenswert?

uwe schrieb:
> die sind auch noch jedes für sich Dualported.
Allerdings kann man auch die nicht parallel hin- und her kopieren. Nicht 
mal eine eigene Resetleitung zum definierten Zurücksetzen des gesamten 
Speichers haben die...

> die sind auch noch jedes für sich Dualported.
Und dann muss man die Doku zum Synthesizer lesen, wie der gerne ein 
DP-RAM beschrieben haben möchte, dass er es richtig erkennt. Oder man 
muss es manuell instantiieren, dann kommt man schon gar nicht auf die 
Idee, zu meinen, dieses Bauteil wäre einfach so ein Array.

: Bearbeitet durch Moderator
von Hans (Gast)


Lesenswert?

Da ich sehr zeitkritische Signale schalten muss nehme ich jetzt den 
höheren Slice Aufwand in Kauf und lasse mir alle Werte in einem Takt 
berechnen. Ich habe an anderer Stelle optimiert, so dass ich wieder über 
50% Slices frei habe. Das sollte mir für die weiteren Schritte reichen, 
allerdings würde mich trotzdem noch interessieren, ob es nicht ein 
ähnliches Board gibt wie das Spartan 3an nur mit mehr Slices? Nur den 
FPGA zu wechseln 700er gegen 1400er ist ja nicht wie bei einem Prozessor 
möglich...

Das Datenblatt werde ich mir auf jeden Fall mal anschauen, könnte den 
BRAM vielleicht an anderer Stelle sinnvoll verwenden! Danke auf jeden 
Fall für die Informationen ;)

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


Lesenswert?

Hans schrieb:
> sehr zeitkritische Signale
Hast du dazu eine Zahl? Was sind dad für Signale? Und wie passen die zu 
den schnarchlangsamen 10ms?

von Hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hans schrieb:
>> sehr zeitkritische Signale
> Hast du dazu eine Zahl? Was sind dad für Signale? Und wie passen die zu
> den schnarchlangsamen 10ms?

Grundsätzlich gilt bei meiner Anwendung, je schneller desto besser. 
Jedoch gibt es Signale die nicht unbedingt so schnell berechnet werden 
müssen. Die Ausgabe meiner Steuersignale erfolg mit 20ns (Quarztakt) 
jedoch könnte ich einen Fehler in Kauf nehmen wenn, beispielsweise die 
angesprochenen Zeitabschnitte auf dem Sinus langsamer aktualisiert 
werden. 10ms war hier nur beispielhaft genannt, mir ging es erstmal 
darum den Code weniger Resourcenverbrauchend zu gestalten.

Gibt es eine Art Mengenbegrenzung der verwendeten Signale? In meinem 
Design meckert er beim Implementieren, dass er nicht alle Signale 
automatisch routen kann. Verwende ich ein Signal (beliebiges) weniger, 
so funktioniert das Ganze wieder. Ich benutze die WEB ISE...vielleicht 
gibt es dort eine Begrenzung?

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


Lesenswert?

Hans schrieb:
> Gibt es eine Art Mengenbegrenzung der verwendeten Signale?
Nein, P&R bekommt dann einfach die Komponenten nicht mehr verdrahtet, 
weil keine Routing-Kapazitäten mehr frei sind. Da kann das FPGA auch 
erst "halb voll" sein...
Du kannst evtl. noch an den P&R Einstellungen herumschrauben und den 
"Effort" hochdrehen.

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.