FPGA Fragen

Moin Leuts,

Ich hab jetzt mal ein bisschen mit meinem FPGA rumgespielt. Derzeit hab ich ein Programm (50% geklaut, 50% Eigenleistung) das vier 7Segment-LEDs multiplext. Es gibt einen Teiler von 33Mhz externer Takt auf 1Hz und daran haengt ein vierstelliger Zaehler fuer die Anzeige.

Dabei sind mir 1-2 Fragen ins Auge gesprungen:

  1. Die Oberflaeche (Webpack8.1 unter Windoof) ist wirklich GROTTENLAHM. Es passiert mir regelmaessig das ich eine Synthese anstosse und denke ich haette danebengeklickt weil es erstmal 1-2s dauert bis ueberhaubt etwas passiert. (1.8Ghz Athlon/768MB Ram) Wenn ich das richtig verstehe dann ruft das ganze fette Grafikgedoens doch Kommandozeilenprogramme auf. Ist es eine gute Idee das mit einem Makefile selber zu machen?

  1. Ich hab mal 8.2 fuer Linux (1.3GB gepackt!) runtergeladen aber noch nicht installiert. Ist da der Gaehnfaktor identisch? Schlimmer? Wuerden neuere oder aeltere Versionen schneller laufen?

  2. Sehe ich das richtig das ich alle Ein/Ausgaenge beliebig verwenden kann? Es gibt keine zusammengehoerigen Gruppen wie z.B Port1/2usw. bei Microcontrollern? Das wuerde Platinenlayouts ja enorm vereinfachen.

  1. Mein Zaehler arbeitet sehr gut. Nach dem reinladen ins FPGA faengt er an bei 0000 hochzuzaehlen. Ich wollte noch eine Resettaste einbauen.

always @(posedge CLK_I or posedge Taste4) begin if (Taste4 == 1'b1) begin count1

Reply to
Olaf Kaluza
Loading thread data ...

Ich vermute du meinst ISE Webpack. Das ist tatsächlich so grauenhaft, wie von dir beschrieben und auch nicht gerade leicht zu verstehen von der Bedienung her. Hatte mal einer hier geschrieben, wer hätte sich sein Makefile selbst gebastelt und würde wunderbar mit allen ISE-Versionen laufen.

Es gibt meist einige Eingänge, die können nur als Clock verwendet werden oder du musst einige spezielle Eingänge nehmen, wenn du einen Clock zuführen willst und es gibt meist mehrere Blöcke von IOs, bei denen dann jeder Block eine andere Spannung haben kann (z.B. 1,8V und 3.3V), aber ansonsten hast du recht, die kann man beliebig verwenden.

Du meinst bestimmt "and" statt "or" :-)

Dem kann ich nur zustimmen, wenn man es denn braucht. Vieles lässt sich auch mit Microcontrollern realisieren, aber wenn man dann mal was hat, wofür man einen FPGA brauchen kann, gibt es meist keine andere Möglichkeit oder es wäre anders sehr aufwendig und teuer.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

"and" ist aber auch nicht so gut, da dann ja beides mal eine steigende Flanke erkannt werden muss. Asynchrone Eingänge sollte man immer erst mit dem Clock in ein Latch übernehmen. Danach brauchst du eigentlich nur noch auf Taste4Latch=1 zu testen, statt auf Flankenänderung. Der Zähler wird dann zwar dauerhaft solange die Taste gedrückt gehalten wird resetted, was aber je nach Anwendung nicht so schlimm ist.

Sonst gibt es noch den Trick, ein 2 Bit breites Array zu nehmen und mit Clock das Taste4-Signal da reinzuschieben und dann auf "10" bzw. "01" zu testen (gerne auch mehr Bits, um Spikes herauszufiltern, also auf "1100" und "0011" testen).

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Nein, da faengt der Compiler sofort GANZ boese an zu meckern. So schlau war ich auch schon. Was glaubst du warum ich aus lauter Frust bereits diese Zeile:

if (Taste4 == 1'b1)

eingefuegt habe? Aus Gruenden dir mir nicht klar sind, muss aber noch ein Buch ueber Verilog lesen, kann man da 'and' nicht verwenden.

Das ist momentan auch mein Problem. Die Beschaeftigung damit macht echt Spass, aber mir ist noch keine Anwendung eingefallen die ich brauche. :-)

Olaf

p.s: Sowohl Emacs wie auch Jed haben einen verilog-mode. Damit kann man sein Leben gleich mal eine Groessenordnung angenehmer gestalten.

Reply to
Olaf Kaluza

So einfach kann es nicht sein. Ich hatte vorher mal zu Testzwecken sowas programmiert:

always @(posedge CLK_I or posedge Taste4) begin begin flipflop Sonst gibt es noch den Trick, ein 2 Bit breites Array zu nehmen und mit >Clock das Taste4-Signal da reinzuschieben und dann auf "10" bzw. "01" zu >testen (gerne auch mehr Bits, um Spikes herauszufiltern, also auf "1100" >und "0011" testen).

Die Schaltung befindet sich auf einem Demoboard und hat Tiefpass und Schmittrigger als Entprellung mit auf dem Board.

Olaf

Reply to
Olaf Kaluza

Olaf Kaluza wrote: ...

Du hast nur asynchron geladene Register beschrieben. In dem "else" Teil muestest Du jetzt die Zaehlerfunktion implementieren.

PS: Asynchrones Zeug wie Dein reset da oben wollen immer ganz genau verstanden sein. Sonst passiert da schnell etwas unerwartetes. Ich wuerde das "or posedge Taste4" herausnehmen.

Verilog Code kann man auch mit Simulationsmustern beaufschlagen, z.B. mit Icarus Verilog und sich dann die resultierende Wellenform anschauen, z.B. mit Dinotrace. Dann muss man Ise nur viel seltener anwerfen.

--
Uwe Bonnes                bon@elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Reply to
Uwe Bonnes

keine Ahnung, wie es in Verilog aussieht, da ich nur VHDL gut genug kenne, aber könnte ungefähr so aussehen (VHDL hierbei nach Verilog übersetzen :-)

signal Taste4Latch : unsigned(1 downto 0);

always @(posedge CLK_I) begin Taste4Latch

Reply to
Frank Buss

Ist ja auch logisch, ueberleg mal was daraus in Hardware wird. Das waere nen Clock-Signal mit logik drin = ganz boese.

Mit nem or wird das kein Clock mit Logik sondern die Taste wird auf die Reset-Eingaenge der Synthetisierten FFs gelegt.

Das ist schonmal der richtige Weg. Zu deinem eigentlichen Problem: Kann es sein das die Eingaenge die du verwendest 'active-low' sind? Ist zumindest bei vielen FPGA-Entwicklungsboards von Altera so.

s.o.

Gruss, Karsten

--
In a world without walls and fences,
why do we need Windows and Gates?
Reply to
Karsten Langeloh

Ich fuerchte das verstehe ich nicht. (schaehm) Ich stelle mir das so vor das CLK und Tasteneingang entweder auf ein OR oder AND-Gatter kommen und das Ausgangssignal eben die Zuweisung bewirkt oder nicht. Falsch?

BTW: Was waere eigentlich wenn man etwas programmiert wo ganze viele Dinge an einen Eingang haengen. Haben FPGAs ein internen FanOut/In?

Gut, das ist schlecht. Aber was soll dann das 'posedge Taste4' in der Zeile? Da wuerde dann ja einfach unter den Tisch fallen. Ich hab das Konzept zu dieser Zeile naemlich woanders geklaut. :-)

Die sind AktivLow, aber mit einem nachgeschalteten 74ALVC14. Bei tiefergehendem Interesse an der Schaltung koennte ich ein PDF auf meine Homepage stellen...

Ich hab aber auch mal aus lauter Frust die Taste bereits vor dem reinladen des Codes dauerhaft gedrueckt gehalten. Kein Unterschied.

Olaf

Reply to
Olaf Kaluza

Der Zaehler wird woanders beschrieben und funktioniert auch! der gepostete Ausschnitt ist nur der Reset. Wenn ich die vier Zeilen welche die Register ueberschreiben, auskommentiere, dann wird normal gezaehlt.

Ich bin mir ziemlich sicher alle diese Sachen schonmal probiert zu haben, ganz es aber natuerlich im moment nicht tun weil ich gerade das richtige (tm) Betriebsystem benutze. Werde ich aber nacher nochmal testen.

Olaf

Reply to
Olaf Kaluza

Auf einem modernen DualCore mit FSB1333 gehts halbwegs. Der Trost ist, dass das EDK noch hundert mal langsamer ist. Liegt wohl an massiver JAVA Programmierung, bzw. an Cygwin, aber was genaues weiss ich nicht. Aber einem geschenkten Gaul usw. etc. etc.

Es gibt viel I/O Features, haupsächlich aber mehrere Bänke mit verschieden I/O Spannungen. Wenn an allen Bänken 3,3V ist, und man kein LVDS braucht, also nur "TTL" Signale verbastelt, kann man jeden I/O mit jedem I/O und jeden input only mit jedem input only vertauschen. (Ausnahme #837: Clocks). Der Unterschied ist dann das interne Routing, und das kann man mittlerweile meistens vernachlässigen. Ach ja, bei so einem 1500 poligen BGA vereinfacht das Vertauschen von I/O's das Platinenlayout ganz enorm :-)

Du brauchst ein gutes Tutorial über synchrones digitales Schaltungsdesign. Leider kenn ich da auch nix gescheites auf deutsch. Aber vielleicht schreib ich mal was. Allerdings dann in VHDL.

Ja, FPGA's sind Weltmeister, aber sie zu zähmen ist mehr Aufwand, als ein C Programm für einen AVR. Die Herausforderung ist dabei einen möglichst hohen Abstraktionslevel bei der Synthese und bei den "Transaction basted Testbenches" zu erreichen, um auch bei dicken Virtex5 noch die Übersicht zu bewahren. Welch komplexe Systeme ein Einzelner damit aufziehen kann, ist auch für einen Fachkundigen immer wieder erstaunlich.

MIKE

formatting link
OHO-Elektronik Michael Randelzhofer FPGA und CPLD Mini Module Klein aber oho ! Kontakt: Tel: 08131 339230 snipped-for-privacy@oho-elektronik.de Usst.ID: DE130097310

Reply to
M.Randelzhofer

Genau das sollte eigentlich nicht passieren. Das Verhalten wird dann durch die Gatterlaufzeiten (tolles Wort) unter Umstaenden nicht mehr vorhersagbar (-> asynchrones Verhalten, da die Clock nicht mehr in allen Teilen der Schaltung synchron ist).

Dafuer gibt es FFs mit Enable-Signalen.

Da wuerd ich mal ins Datenblatt gucken, gibt glaub ich unterschiedliche

Hmm .. bin nicht so der Verilog-Experte, nutze selber nur VHDL Und da faellt mir auch grade ein, das es eigentlich auch ziemlich boese ist, 'ne Anweisung von zwei Taktflanken abhaengig zu machen.

Was passiert denn wenn du das 'posedge Clock' da raus nimmst (ja, das ist dann ein asynchroner Reset, aber das geht schon, mach ich eigentlich immer so :)

Ist das denn ein Entwicklungsboard? Wenn ja welches? Wenns keins ist, wuerd mich der Schaltplan schon mal interessieren.

Mhh. Eigentlich folgt son' Zaehler immer dem gleichen Schema:

--
Bei Positiver Taktflanke oder Reset-Aenderung:
  wenn reset = 1 dann
    Zaehlwert
Reply to
Karsten Langeloh

Also mein Verstaendnis von Verilog ist wohl noch schlechter als ich dachte :( Aber ein wenig g**glen hat dann eine Seite [1] zu Tage gefoerdert, die eine Verilog Einfuehrung und weitere Unterlagen bereitstellt, und da ist sogar ein Beispiel fuer nen Zaehler drin. Der Zaehler befindet sich in dem Foliensatz 1a auf Seite 32.

[1]
formatting link

HTH, Karsten

--
In a world without walls and fences,
why do we need Windows and Gates?
Reply to
Karsten Langeloh

Ich vermute mal Olaf meint, was passiert, wenn man in der internen Logik einen internen Ausgang auf viele interne Eingänge legt. Da gibt es keine Grenze, dafür ist dann die Synthesesoftware verantwortlich das entsprechend mit Buffern und ggf. mehreren parallel gerouteten Leitungen zu den verschiedenen Eingängen umzusetzen. Wenn durch die Buffer die Laufzeitverzögerungen zu groß werden, dann meldet dir die Software das als Timing-Fehler, falls es Abhängigkeiten vom Clock gibt, die eingehalten werden müssen oder du direkt zwischen verschiedenen Signalen eine Mindestlaufzeit angegeben hast. Wenn durch den erhöhten Routing- und LE-Bedarf der Platz knapp wird, dann meldet das der Fitter, bei mancher Software schon nach ein paar Stunden herumprobieren des Fitter-Moduls :-)

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Achso, aehm .. naja leichte Fehlinterpretation ;)

Japp, und das tut sie meistens ganz zuverlaessig.

Ja, wohl wahr, grad wenn man mit FPGAs anfaengt, passiert das mit den Timing Problemen gerne mal.

=20 Mhh .. ja ich hab auch schon mal zwei Tage damit verbracht 'nen Design von Hand umzuplatzieren, weil der Chip einfach so voll war, das irgendwas immer mit der Clock nicht mehr passte, heute wuerd ich glaub ich einfach 'nen groesseren FPGA nehmen (der damals war auch echt klein). Aber das sind wiederum Sachen die einem als Anfaenger seltener passieren, es sei denn man macht ganz ganz gruselige Sachen ;)

Gruss, Karsten

--=20 In a world without walls and fences, why do we need Windows and Gates?

Reply to
Karsten Langeloh

Gut das leuchtet mir ein. Problem ist dann vielleicht ein wenig das die Abstraktion durch eine Programmiersprache einen etwas vorgaukelt das so nicht machbar ist. Genius und Germanium passen nicht recht zusammen. (1)

Da hast du wohl auch recht. Man muss wohl mehr ueber das nachdenken was der Compiler aus dem Code machen kann. Bei C auf einem Microcontroller fuehrt Unfaehigkeit in dem Bereich ja hoechstens zu langsamen Code. Aber bei FPGA koennen die Ergebnisse wohl aeh... interessant sein. :-)

Das ist ein Entwicklungsboard.

Ich hab mich fuer Verilog entschieden weil alle mitgelieferten Beispiele in Verilog sind, und weil ich die Sprache huebscher fand. Sieht mehr aus wie C. VHDL sieht IMHO eher aus wie eine Wurzelbehandlung beim Zahnarzt. :-)

Olaf

1: Ich weiss da ist Silizium drin, aber ich fand die Alliteration so nett.
Reply to
Olaf Kaluza

Wenn du was auf English kennen wuerdest waer das auch okay. .-)

Ich hab aber eigentlich Ahnung von Schaltungsdesign, hab ich fruher schon mit einzelen Gattern/Logic Bausteinen gemacht. Nur dadurch das man jetzt halt alles in so einer vornehmen Programmiersprache macht laesst man sich verleiten gedankenlos vor sich hinzu programmieren.

Aber ich hab gesehen Amazon hat ein Buch ueber Verilog, werde ich wohl mal ordern muessen.

Olaf

Reply to
Olaf Kaluza

Damit hattest du wohl recht. Du hast nur vergessen zu sagen warum :-)

Ich hab es jetzt laufen. Ursache war wohl das ich vorher 'reset' und 'zaehlen' in zwei verschiedenen always schleifen hatte. Nachdem ich beides zusammengepackt habe und dafuer gesorgt habe das entweder der Zaehler oder der Reset laeuft, geht es nun. Man vergisst wirklich extrem schnell die Nebenlaeufigkeit der Konstrukte und das gibt dann verwirrende Ergebnisse.

Vermutlich sollte ich mich an die gute alte Zeit zurueckerinnern als ich in Pearl unter RTOS-UH programmiert habe. :-)

Olaf

Reply to
Olaf Kaluza

Erstmal hilft es schon weiter, wenn man einerseits die Struktur der CLBs ungefaehr versteht. Dazu sollte man sich oefters die Schaltbilder in den FPGA Datenblaettern anschauen. Und andererseits sollte man das, was man da in Verilog/VHDL konstruiert, auch als ein Schaltbild zeichnen koennen, das (nur/auch) die Faehigkeiten der CLBs nutzt. Also

- ggf. eine (synchrone) Resetbedingung

- ggf. eine (synchrone) Loadbedingung

- ggf. eine (synchrone) Enablebedingung

- und nur Logik vor dem Dateneingang des FFs der CLB

Wenn man dann noch eine moderne FPGA Familie hat und keine Takte ueber 100 MHz kann eigentlich nichts falsch gehen. Ab etwa 100 MHz muss man wissen, dass die Logik aus den LUTs gebildet werden muss, und man durch die Luts und das Routingdelay halt eine gewisse Durchlaufzeit erhaelt und ggf die Taktvorgabe in den Constraints verringern muss, oder die Logik anders realisieren muss.

--
Uwe Bonnes                bon@elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Reply to
Uwe Bonnes

|> 1. Die Oberflaeche (Webpack8.1 unter Windoof) ist wirklich |> GROTTENLAHM. |> Es passiert mir regelmaessig das ich eine Synthese anstosse und |> denke ich haette danebengeklickt weil es erstmal 1-2s dauert bis |> ueberhaubt etwas passiert. (1.8Ghz Athlon/768MB Ram) |> Wenn ich das richtig verstehe dann ruft das ganze fette |> Grafikgedoens doch Kommandozeilenprogramme auf. Ist es eine |> gute Idee das mit einem Makefile selber zu machen?

Ja. Es braucht aber an sich kein Makefile, weil bis aufs ucf jede Änderung einen Gesamtlauf erfordert. Bis auf das letzte Projekt, wo noch einiges mit EDK läuft und da ein Makefile sinnvoll ist, hat mir bislang immer folgendes geholfen:

Für die Synthese braucht es ein Projectfile (xxx.prj), wo alle VHDL/Verilogfiles drinnen stehen:

vhdl work ../misc/my_rams.vhd ... vhdl work xxx.vhd

Dann das Syntheseskript xxx.xst:

run

-uc xxx.xcf

-ifn xxx.prj

-ifmt mixed

-ofn xxx

-ofmt NGC

-p xc2s200e-6-ft256

-top xxx

-opt_mode speed

Da muss man zB. den Typ oder die Top-Entity etwas anpassen, das xxx.xcf kann man sich aus dem GUI-Kram holen, es muss eigentlich nur existieren. Hintendran kann man eine ganze Menge an Syntheseoptionen hängen, was man halt so braucht...

Dann xst starten mit "xst -ifn=xxx.xst" und zuschauen :-)

Fürs Routing reicht folgendes Skript:

export XPATH=$XILINX/bin/lin

PROJECT=xxx

echo PROJECT: ${PROJECT}

$XPATH/ngdbuild -aul ${PROJECT}.ngc && $XPATH/map -pr b -cm speed -ol high -timing ${PROJECT} && $XPATH/par -ol high -w ${PROJECT}.ncd ${PROJECT}r.ncd ${PROJECT}.pcf && $XPATH/bitgen -d -g StartupClk:CClk -w -b ${PROJECT}r ${PROJECT} ${PROJECT}.pcf && $XPATH/trce -v 20 ${PROJECT}r.ncd ${PROJECT}.pcf

Das .ucf kann man von der GUI recyclen. Je nach Chip muss man evtl. noch an den erlaubten par oder bitgen-Parametern drehen, ist ja alles dokumentiert. Das geroutete Design hat ein r vor der Endung...

--
         Georg Acher, acher@in.tum.de
         http://www.lrr.in.tum.de/~acher
         "Oh no, not again !" The bowl of petunias
Reply to
Georg Acher

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.