Hallo!
Ich habe gestern den ersten Teil meines VGA-Textmode-Controller in VHDL
geschrieben. Jetzt habe ich dazu 2 Fragen:
1. Es sind jetzt schon 22% der Logikgatter verbraucht! Könnte jemand
über den Code schauen, und mir sagen ob ich ihn sehr ineffizient
geschrieben habe? Oder liegt es daran, dass ich Bitmaps für 2 Buchstaben
direkt in den FPGA schreibe? Und kennt jemand eine elegantere Methode?
2. Wenn ich 5 mal in jeder Zeile ein 'A' ausgeben lasse, funktioniert
alles perfekt. Wenn ich aber nur 2 '5' pro Zeile ausgeben lasse, wird
der rechte Strich des 'A' weggeschnitten?
Samuel J. schrieb:> Könnte jemand über den Code schauen, und mir sagen ob ich ihn sehr> ineffizient geschrieben habe?
Wen oder was?
Warum habe bei diesem "Code" so ein unschönes Dejavu? Hast du den vom
Peter abkopiert? Und das ohne meine darunterstehenden Kommentare zu
lesen? Oder muss hier echt jeder jeden Blödsinn selber machen?
Seis drum: die 22% gehen auf die Verwendung des falschen RAMs. Du
bekommst "Distributed RAM" und nicht einen RAM Block. Das kommt, weil du
den Synthese-Guide deines Synthesizers nicht gelesen hast.
Zum Code: So beschreibt man keinen Taktteiler, und man verwendet keine
uneingeschränkten Integer. Das ist übrigens der zweite Grund für so viel
Speicherbedarf.
> Hast du den vom Peter abkopiert?
Nein, hab ich selber geschrieben.
> die 22% gehen auf die Verwendung des falschen RAMs.
Wieso RAMs? Ich verwende doch keinen RAM?
> Das kommt, weil du den Synthese-Guide deines Synthesizers nicht gelesen> hast.
Ok, schau ich mir mal an.
> So beschreibt man keinen Taktteiler
Wieso nicht? Wie dann?
>man verwendet keine uneingeschränkten Integer
Leuchtet ein!
Danke schonmal für die Hilfe!
PS: Ich sollte mir wahrscheinlich den Post von Peter mal durchlesen,
oder? :D
Samuel J. schrieb:> Wieso RAMs? Ich verwende doch keinen RAM?
Das ist das Problem. Denn wenn du ein Array definierst, aber kein RAM
verwendest, wie sollte das denn dann umgesetzt werden?
Möglichkeit 1: jedes Bit wird zu einem einzelnen Flipflop im FPGA
Möglichkeit 2: verwende die LUTs als Speicher
Möglichkeit 3: verwende einen RAM Block
>> Hast du den vom Peter abkopiert?> Nein, hab ich selber geschrieben.
Na gut, dann war Peter der Kopierer...
>> So beschreibt man keinen Taktteiler> Wieso nicht?
Lies mal den Beitrag "Re: VGA Text Mode Problem" durch.
> Wie dann?
Arbeite mit Clock-Enables. Und simuliere dein Design...
> PS: Ich sollte mir wahrscheinlich den Post von Peter mal durchlesen,> oder? :D
Ja. Etwas unschön, dass er sich damals einfach so reingedrängelt hat...
Samuel J. schrieb:> signal lineCounter: integer:=0;> signal pixelCounter: integer:=0;>> type int_array is array (0 to 79) of integer;
integer ohne range ist ein Grund den immensen Logik-verbauch. Definiere
einen subtype mit einem Wertebereic,h den du auch benötigst. Für pixel
und linecount sollten 11 .. 12 bit genügen, da braucht es keine 32.
MfG,
Fpga Kuechle schrieb:> integer ohne range ist ein Grund den immensen Logik-verbauch.
Na gut, was als unnütz erkannt wird, wird hinterher dann schon
wegoptimiert oder fest auf 0 gesetzt. Allerdings kann der Synthesizer
nicht alles erkennen...
Fpga Kuechle schrieb:> Au!
Abe mal so richtig AU!! Das gibt ein Latch. Oder besser: viele Latches!
Ich hatte das übersehen, weil so ein Konstrukt für den Simulator (der
bekanntermaßen auf einen Signalwechsel in der Sensitivliste anspringt)
funktioniert. Aber die Synthese ignoriert die Sensitivliste und macht
gnadenlos Latches und (viel, viel schlimmer!!!) kombinatorische
Schleifen daraus...
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Fazit: da MUSS ein 'event mit rein. Oder besser gleich die rising_edge()
abgefragt werden.
Hab das Ganze mal eben in ein Xilinx ISE Projekt eingebunden.
ISE hat die Synthese verweiger, da 3-dim. Arrays nicht unterstützt
werden.
In Quartus gehts zumindestens, der Resourcenverbrauch ist aber
angesichts der "Aufgabe" immens. Das liegt aber nicht am Integer-Array
(wird glaube nur mit 1er und 0er konstant gefüllt und somit vom
Tool optimiert), bei mir fallen aber zwei sehr grosse Resourcenkiller
an: die beiden Modulo-Operatoren so zimlich am Ende des Codes
(insgesammt: 3470 LogicCells, Modulo1: 1661, Modulo2: 1554 !!!!).
Und so auf die Schnelle kriege ich auf einem Cyclone-I nur F-MAX
von 7.1 MHz hin, für VGA ein wenig langsam.
Bevor man sich an VGA-Textausgabe rantraut, sollte man zuerst mal
die Basics durchkauen (Lauflicht) und sauber ausformulieren. Und sich
ausserdem klarmachen, das Multiplikation und Division bzw. Modulo-Ops
grosse Resourcenfresser sind und uU nicht ohne Weiteres synthetisierbar
sind.
Zum Code selbst:
if pixelCounter > 112 AND pixelCounter < 752 AND lineCounter > 13 AND
lineCounter < 493 then
if signBuffer(lineBuffer(signCounter), 10-((lineCounter - 14) mod 10),
8-((pixelCounter - 113) mod 8))
...
sowas erzeugt einen riesig grossen LUT-Baum mit entsprechend schlechter
Performance. Das muss nicht sein, denn das VGA-Signal ist sehr
periodisch, d.h. sämtliche der obigen "Berechnungen" können schon
einen Takt vorher gemacht werden.
usw. usf...
Ja, kann mich an die Einstellung noch dunkel erinnern.
Aber 3D-Arrays oder höher muss ja nicht sein..
Und was ich noch vergessen habe zu schreiben: Mein
VGA-Text-Controller braucht gerade mal <= 200 LUTs
und <= 200 FF, läuft auf Cyclone-I C6 mit ca 175 MHz
und das ohne grosse Optimierungen. Mit Optimierung
geht's bis ca 230 MHz. (Auf Spartan3 ca. 250 MHz).
Das alles ist keine Zauberei, man muss nur das Problem
zerlegen und sich überlegen wann welche Berechnung
gemacht werden kann und evtl. Berechnungen einen Takt
vorverlegen (VGA-Signale sind PERIODISCH).
Sigi schrieb:> sich überlegen wann welche Berechnung gemacht werden kann und evtl.> Berechnungen einen Takt vorverlegen
Der zugrundeliegende Effekt nennt sich "Latency"...
Sigi schrieb:> Bevor man sich an VGA-Textausgabe rantraut, sollte man zuerst mal> die Basics durchkauen (Lauflicht) und sauber ausformulieren.
Und man sollte sich unbedingt das Thema Simulation genauer anschauen.
Denn gerade so ein VGA-Controller, der als stimuli ausser dem Takt von
aussen nichts braucht, ist schnuckelig einfach als Waveform darstellbar.
Peter P. schrieb:
>Wäre es Dir möglich, deinen VGA-Text-Controller zu zeigen>oder ist er vielleicht sogar bereits auf einer Webseite verfügbar?
das wäre kein Problem, aber dabei lernt ja niemand etwas. Der TO
und andere Interessierte sollten sich lieber selber dran machen und
einen zu designen. Meiner Einschätzung nach bewegt sich ein solcher
Controller komplexitätstechnisch zwischen SPI- und I2C/UART-Controller
(falls man jetzt mal SRAM bzw. SDRAM-Anbindung weglässt).
Ein solches Design kann man in drei Schritte einteilen:
1. Erzeuge ein 2D-Koordinatenraster: zwei Signale RAS_X und RAS_Y
(bitte noch nicht mit Pixel-Koordinaten verwechseln) werden
entsprechend hochgezählt bzw. rückgesetzt. RAS_X zunächst in
jedem Takt, bis eben der rechte Rand erreicht ist und RAS_Y
bei jeder neuen Zeile. Schon hier kann mann viele Performance-Fehler
machen. Man hat aber zumindestens schon mal die 2D-Koordinaten.
2. Aus je RAS_X und RAS_Y entsprechende Event-Signale für
Zeichenbereich Beginn/Ende, Porch-Bereiche (Front,Back),
Sync Beginn/Ende generieren. Aus diesen Signalen lassen sich
dann die VGA-Sync-Signale HSYNC/VSYNC ableiten.
3. Aus RAS_X und RAS_Y sowie Zeichenbereich Beginn/Ende kann man
dann leicht ein erstes Balkendemo ableiten: z.B. horz. Streifen
aus RAS_X etc.
Ebenso lassen sich RAS_X und RAS_Y direkt als Pixelkoordinate
verwenden bzw. eine Pixelkoordinate ableiten (z.B. nur jede 2.
Rasterposition Horz etc.).
Oder bei Textdemos: die ersten 3 LSB-Bits von RAS_X und RAS_Y
als Font-Koordinate und die übrigen X Bits als Zeichenkoordinate.
Oder ein einfaches Graphikdemo: aus RAS_X und RAS_Y
eine Speicheraddresse berechnen und die Pixeldaten dann aus
dem Speicher auslesen (einfach für BlockRAMS und SRAMs,
komplizierter für SDRAMS, hier muss auf Speicherrefresh geachtet
werden)
UND: für jeden Schritt eine eigene Komponente anlegen, das erhöht
die Übersichtlichkeit und lehrt ein wenig hierachisches Designen.
Die meisten Designs hier von Anfängern vereinen alle 3 Punkte in
einer total Unübersichtlichen Komponente (=> Spaghetti-Code).
Jeder dieser Schritte lässt sich locker von Anfängern mit erster
Erfahrung ind VHDL in ein paar Abenden durchdesignen. Hier im Forum
gibts dann genug Leute, die das Design dann überschauen.
Und wie Lothar schon warnend gescchrieben hat und von vielen als
selbstverständlich gilt: Siumlieren, simulieren, simulieren...
Lothar Miller schrieb:> Fpga Kuechle schrieb:>> integer ohne range ist ein Grund den immensen Logik-verbauch.> Na gut, was als unnütz erkannt wird, wird hinterher dann schon> wegoptimiert oder fest auf 0 gesetzt. Allerdings kann der Synthesizer> nicht alles erkennen...
IMHO erkennen die Tools nur Logik die un-verdrahtet ist, aber zum
erkennen von un-nütz reicht es bei der KI nicht. Und der counter ist als
solcher komplett beschaltet: 32 bit register, die einen 32 bit
inkrementor treiben desen ausgang auf die D-Inputs der FF gehen ... Das
einige FF vorm inkrementieren zurück gesetzt werden erkenen die Tools
nicht, denn dazubraucht es Wissen über das Verhalten in Laufzeit.
Interessant wäre noch wie sich der init-wert bei der signal deklaratio
auswirkt. bei Null müssten die oberen bits wegoptimiert werden; bei
2**31-1 dagegen nicht (weil doch alle FF mindestens einmal tooglen.
-> nach meiner Erfahrungen werden zu breite Zähler nicht auf die
passende Breite optimiert.
MfG,
Es hat noch kein deutscher geschafft hier im Forum mit VHDL ein VGA-Text
zu erzeugen 80x30 oder höher. Es sind hier alle Sprücheklopfer mit ihren
Ratschlägen. Aber es gibt einen deutschen der das in Verilog geschafft
hat mit 100 Zeilen und mit PS2-Tastatur den Text darstellen auf 190
Zeilen.
Na dann....mit fertigen Argumenten und keinen leeren Sprüchen.
Gruss
Peter Bierbach schrieb:> Es sind hier alle Sprücheklopfer mit ihren> Ratschlägen.
Das merke ich mir.. von mir bekommst du hier jedenfalls nie wieder einen
Ratschlag.
Und glaube mir, im Gegensatz zu dir kann ich mir was merken!
Peter Bierbach schrieb:> Aber es gibt einen deutschen der das in Verilog geschafft hat
Wusste ich es doch: WIR sind die Besten.
> es gibt einen deutschen der das in Verilog geschafft> hat mit 100 Zeilen
Und: kapierst DU, was der da gemacht hat?
> Es sind hier alle Sprücheklopfer mit ihren Ratschlägen.
Mir scheint diese Ansicht irrig.
Lothar Miller schrieb:> Peter Bierbach schrieb:>> Aber es gibt einen deutschen der das in Verilog geschafft hat> Wusste ich es doch: WIR sind die Besten.
Ich denke, er meint damit sich selbst :-)
Lothar Miller schrieb:>> es gibt einen deutschen der das in Verilog geschafft>> hat mit 100 Zeilen> Und: kapierst DU, was der da gemacht hat?
Mit Sicherheit nicht. Selbst, wenn er glaubt, den Code selbst
geschrieben zu haben :-) :-)
Lothar Miller schrieb:>> Es sind hier alle Sprücheklopfer mit ihren Ratschlägen.> Mir scheint diese Ansicht irrig.
Ausser Irriges habe ich von Peter hier auch noch nichts gelesen. Daher
erstaunt mich das nicht.
Peter Bierbach schrieb:> Es hat noch kein deutscher geschafft hier im Forum mit VHDL ein VGA-Text> zu erzeugen 80x30 oder höher. Es sind hier alle Sprücheklopfer mit ihren> Ratschlägen.
Vielleicht haben die Leute hier einfach anderes zu tun, als so einen
Spielkram zu implementieren? Ich kann dir z.B. aus zuverlässiger Quelle
sagen, dass die FPGA Designs für diese Hardware komplett in VHDL und von
einem Deutschen erstellt wurden, der auch hier im Forum aktiv ist ;)
http://www.izfp-d.fraunhofer.de/competence/systeme/index.html
--------------------------
Vielleicht haben die Leute hier einfach anderes zu tun, als so einen
Spielkram zu implementieren?
--------------------------
Ein Forum sollte nichts mit der Arbeitswelt zu tun haben.
Ein Forum ist für Spieler und Hobbysten.
Gruss
---------------------------------------------------
Und: kapierst DU, was der da gemacht hat?
---------------------------------------------------
Ja, mit Verilog ist die Struktur durchschaubar. Auch ohne Testbench.
Da hat jede Textzeile eine klare Bedeutung was im FPGA vor sich geht.
VHDL ist sehr Widersprüchlich, das geht schon auseinander von der
Nutzung der Bitvectoren bis zu verschiedenen Takteilern die immer neue
Superlativen an nehmen , weil immer daran etwas zu meckern gibt.
Gruss
Peter Bierbach schrieb:> Ein Forum sollte nichts mit der Arbeitswelt zu tun haben.> Ein Forum ist für Spieler und Hobbysten.
Wieder so ein schöner versuch herum zu Trollen, aber weil es Freitag ist
bekommst du trotzdem eine Antwort (und einen Fisch):
Willkommen in der neuen Zeit, ohne Foren und Wikis kann die Arbeitswelt
heute nicht mehr auskommen. Diverse grosse Firmen haben ihren Telefon
und sogar ihren E-Mail Support eingestellt und man darf als Kunde seine
Fragen im Community Forum oder im Wiki stellen. Leider nicht immer zum
Vorteil von uns Kunden.
Im deutschsprachigen Raum gibt es, aus meiner Sicht, keine bessere
Anlaufstelle für Fragen zu VHDL und FPGAs (Danke dafür). Natürlich gibt
es immer noch sehr spezifische Sachen die ein Field-Application-Engineer
besser und schneller beantworten kann, wenn es um spezifische Produkte
geht. Aber beides ergänzt sich sehr gut.
(Der FAE der mich aktuell betreut, liest hier sogar mit! Hat mich schon
gefreut :-) )
Nur wer in der realen Arbeitswelt nicht genug anerkannt wird von
Auszubildenden oder Untergegebenen, versucht hier sein Glück teilweise
mit protzigen Antworten an den Man zu bringen. Damit meine ich auch die
Jungs die an einem der sogenannten hohem Instituten ihr Geld
schwermütig verdienen, ob Professor oder ein anderer Handlanger.
Also runter vom hohem Sessel.
Gruss
Man könnte auch erzählen:
Wenn du hier ins Forum kommst (Hölle) bekommst du einen Löffel der ist 2
Meter lang, womit du dir Suppe holen kannst aus einem Topf der ist ist 2
Meter enfernt von dir, nun führ deinen gefüllten Löffel an den
Mund....????
Es gibt Foren da bekommst du einen Löffel der ist auch 2 Meter lang,
womit du dir Suppe holen kannst aus einem Topf der ist 2 Meter enfernt
von dir, bloß in diesen Foren werden die Löffel gegenseitig von Mensch
zu Mensch zum Mund geführt, einer ernährt den Anderen.
Gruss
Ein Text Kontroller in 100 Linien verilog ist nicht schwer. So ein
Kontroller braucht 2 Zähler, 2 Rams, ein Schieberegister und ein paar
comparatoren... es braucht nicht viel mehr, genau wie Lothar gesagt hat.
Schlumpf schrieb:> Ein Text Kontroller in 100 Linien
Welche Aussagekraft hat den die Mengenangabe 100 Zeilen Code? Lasst die
Zeilenumbrüche weg und ihr bekommt einen ganzen Prozessor in eine Zeile
(egal ob Verilog oder VHDL) ;)
daniel__m schrieb:> Welche Aussagekraft hat den die Mengenangabe 100 Zeilen Code?
Keine. Das ist ein Anhaltspunkt.
Ein CSS-Decoder für DVDs in Pyton kommt z.B. mit wenigen Zeilen aus. War
es eine? Oder zwei? Ich habe keine Lust jetzt danach zu googeln.
daniel, wenn du zitierst, dann bitte richtig, ja?
Die Anzahl der Codezeilen hat natürlich GAR NICHTS mit dem Umfang der
realen Hardware zu tun.
Meine Frage, wie es denn in VHDL sei, war ironisch gemeint, WEIL es
total blödsinnig ist, den Umfang einer Funktion in Anzahl der Codezeilen
anzugeben.