Text via VGA ausgeben

OP #436316
Lesenswert?
• ▲
▼
Hallo.
Habe ne kurze Frage. Ich habe bereits eine VGA Ansteuerung die mir 
Bilder ausgeben kann. Jetzt will ich auch ganz normalen Text ausgeben 
und da bin ich noch auf der Suche nach ner passenden Lösung.  Was gibts 
es da für Realisierungsmöglichkeiten?
Gast
Lesenswert?
• ▲
▼
Mit FPGA? in VHDL ? Bitte etwas genauer. VGA ist auch etwas ungenau, 
640*480 und 16 Farben, Pixelclock/ Bildfrequenz?
Ich habe zum Beispiel vor kurzem als erstes FPGA-Projekt auf einem 
SpartanII  1024*768 in 15Bit, (je 5 RGB) mit 65 MHz Pixelclock 
programmiert, mit Webpack 8.1 und grafischer Eingabe.
Gast
Lesenswert?
• ▲
▼
Du musst folgendes machen (oder Dir solchen quellcode im netz suchen)
- einen RAM anlegen in dem Zeichen abgelegt werden
- eine Look-up-Tabelle, die für jeden Buchstabe das "grafische Aussehen" 
gespeichert hat

-jetzt kannst Du Daten in den RAM schreiben, die angezeigt werden 
sollen.
-nun fortlaufend die daten aus dem RAM auslesen und mittels 
Look-up-Tabelle die Zeichen ausgeben.

Das ist alles andere als schnell und leicht gestrickt. Such mal im Netz 
danach. Es gibt einige (freie) Lösungen dafür.
frank
Gast
Lesenswert?
• ▲
▼
Hm, du suchst also einen zeichengenerator oder besser gesagt eine ROM 
Tabelle mit Pixel für einen zeichensatz?

Ich hab mich dafür aus den Unix C Quellen bedient, genau bei banner.c.
Quellcode hier:
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/banner/banner.c

Die tabelle dort (Obacht sind octalwerte) habe ich mit ein bißchen 
Suchen und ersetzten in einen bitvector ungeformt und damit einen BRAM 
per generic initialisiert:

<VHDL>
CONSTANT C_CHARSET : bit_vector( 0 TO (8*8*48)-1)  :=
  i2bv(34)&   i2bv(42)&  i2bv(101)& i2bv(101)& i2bv(101)& i2bv(42)& 
i2bv(34)&  i2bv(0)&  -- 0 */
  i2bv(10)&   i2bv(30)&  i2bv(50)&  i2bv(10)&  i2bv(10)&  i2bv(10)& 
i2bv(76)&  i2bv(0)&  -- 1 */
  i2bv(76)&   i2bv(101)& i2bv(1)&   i2bv(76)&  i2bv(100)& i2bv(100)& 
i2bv(177)& i2bv(0)&  -- 2 */
</VHDL>
wobei:
<VHDL>
FUNCTION i2bv (CONSTANT OP : integer) RETURN bit_vector IS
    VARIABLE tmp1,tmp2 : integer;
  BEGIN
    --convert octal to integer
    tmp1 := (op / 100) * 64;
    tmp2 := op - ((op / 100) * 100);
    tmp1 := tmp1 + ((tmp2 / 10) * 8);
    tmp2 := tmp2 - ((tmp2 / 10) * 10);
    tmp1 := tmp1 + tmp2;

    RETURN to_bitvector((std_logic_vector(to_unsigned(tmp1, 8))));
  END FUNCTION i2bv;

</VHDL>


Als fingerübung kann man das ganze eleganter schreiben. den Komplettcode
gibts nicht (Lohnarbeit).
Gast
Lesenswert?
• ▲
▼
Soll der Text als Pixel-Zeichen innerhalb eines sowieso bestehenden 
Grafikspeichers stehen, oder liegt er in einem Textspeicherbereich als 
ASCII vor? FPGAs haben nicht so reichlich RAM, da wäre letzteres 
vermutlich sparsamer.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.