Forum: FPGA, VHDL & Co. VGA Text Mode Problem


von Samuel J. (capstrovor)


Lesenswert?

Hallo

Ich bin gerade dabei mir eine Textausgabe zu schreiben.
Die VGA Ansteuerung funktioniert.
Aber wenn ich Buchstaben ausgeben will, dann fahren nur ein paar Striche 
über den Bildschirm.
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity vga_core is
5
port
6
(
7
  clk_50: in std_logic;
8
  red: out std_logic_vector(3 downto 0);
9
  green: out std_logic_vector(3 downto 0);
10
  blue: out std_logic_vector(3 downto 0);
11
  hsync: out std_logic;
12
  vsync: out std_logic
13
);
14
end vga_core;
15
16
architecture vga_core_arch of vga_core is
17
18
signal clk: std_logic;
19
signal lineCounter: integer:=0;
20
signal pixelCounter: integer:=0;
21
22
signal bm_pixelCounter: integer:=0; --bm für bitmap
23
signal bm_lineCounter: integer:=0;
24
signal signCounter: integer:=0;
25
26
type ascii is array (0 to 5, 0 to 4) of std_logic; 
27
signal ascii_a: ascii :=    (('0','1','1','1','0'),
28
                             ('1','1','0','1','1'),
29
                             ('1','0','0','0','1'),
30
                             ('1','1','1','1','1'),
31
                             ('1','0','0','0','1'),
32
                             ('1','0','0','0','1'));
33
type zeilenpuffer is array (0 to 79) of integer;
34
signal zeilenpuffer1: zeilenpuffer:= (others => 1);
35
36
begin
37
vga_clk: process(clk_50)
38
begin
39
  if rising_edge(clk_50) then
40
    clk <= NOT clk;
41
  end if;
42
end process vga_clk;
43
44
  zeilenpuffer1(0) <= 0;
45
  zeilenpuffer1(1) <= 0;
46
47
48
  
49
  ------------------------------------------------
50
vga_testpic: process(clk)
51
begin
52
  if clk = '1' then
53
    
54
    pixelCounter <= pixelCounter + 1;
55
    
56
    if pixelCounter = 800 then
57
      pixelCounter <= 0;
58
      signCounter <= 0;
59
      lineCounter <= lineCounter + 1;
60
    end if;
61
    
62
    if bm_pixelCounter = 640 then
63
      bm_pixelCounter <= 0;
64
    end if;
65
    
66
    if lineCounter = 524 then
67
      lineCounter <= 0;
68
    end if;
69
    
70
    if lineCounter > 13 AND lineCounter < 481 then
71
      bm_lineCounter <= bm_lineCounter + 1;
72
    end if;
73
    
74
    if pixelCounter > 112 AND pixelCounter < 641 then
75
      bm_pixelCounter <= bm_pixelCounter + 1;
76
    end if;
77
    
78
    if (bm_pixelCounter mod 8) = 0 then
79
      signCounter <= signCounter + 1;
80
    end if;
81
    
82
    if bm_lineCounter = 6 then
83
      bm_lineCounter <= 0;
84
    end if;
85
  ------------------------------------------------
86
    if pixelCounter > 704 AND pixelCounter < 800 then
87
      hsync <= '0';
88
    else
89
      hsync <= '1';
90
    end if;
91
    
92
    if lineCounter > 522 AND lineCounter < 524 then
93
      vsync <= '0';
94
    else
95
      vsync <= '1';
96
    end if;
97
  -------------------------------------------------
98
    if pixelCounter > 112 AND pixelCounter < 752 AND lineCounter > 13 AND lineCounter < 493 then
99
      
100
      red <= "0000";
101
      green <= "0000";  
102
      blue <= "0000";
103
      
104
      case zeilenpuffer1(signCounter) is
105
        when 0 => 
106
          if ascii_a(bm_pixelCounter, bm_lineCounter) = '1' then
107
            green <= "1111";
108
          else
109
            green <= "0000";
110
          end if;          
111
        when 1 => green <= "0000";
112
        when OTHERS => green <= "0000";
113
      end case;
114
    else
115
      red <= "0000";
116
      green <= "0000";
117
      blue <= "0000";
118
    end if;
119
  ------------------------------------------------
120
  end if;
121
end process vga_testpic;
122
end architecture vga_core_arch;

Ich dachte mir, dass es für eine (spätere) Tastatureingabe mit Video RAM 
nützlich wäre, einen Zeilenpuffer zu nehmen. Dort würde ich dann immer 
während der Schwarzschulter eine Zeile des VideoRam auslesen und in 
dieses Array schreiben. Momentan habe ich nur 0 für 'A' anzeigen und 1 
für nichts anzeigen. Wieso werden hier in jeder Zeile 2 'A's angezeigt?

mfg

von Samuel J. (capstrovor)


Angehängte Dateien:

Lesenswert?

Hier noch ein Bild zur Ausgabe.

PS: Eben diese Striche "flimmern" so nach unten über den Bildschirm

von Samuel J. (capstrovor)


Lesenswert?

PS: der Violettstich kommt von meiner Kamera ;)

von peter (Gast)


Lesenswert?

Ich stell mir das so vor das man ohne eine Zeilenabfrage bei 320x240 
9600 Byte einlesen muss damit der Screen voll ist.
1
if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >= 0 AND lineCounter <= 239 then
2
  red <= "0000";
3
  green <= "0000";
4
  blue <= "0000";
5
  
6
  if bitmap_pixelCounter <= 7 then   
7
    bitmap_pixelCounter <= bitmap_pixelCounter + 1;
8
    
9
    if ascii(bitmap_pixelCounter) = '1' then
10
      green <= "1111";
11
    else
12
      green <= "0000";
13
    end if;
14
  else
15
    bitmap_pixelCounter <= 0;
16
    hier 0-9599 Ascii aus Array einlesen  bei 320x240 Pixel ???
17
  end if;
18
  
19
else  
20
  red <= "0000";
21
  green <= "0000";
22
  blue <= "0000";
23
end if;

Kann aber auch falsch liegen...

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, guten Tag.
Ich habe jetzt mal ein Bild 320x240 umgewandelt und in ein Array 
gelesen.
Das Bild erscheint zwar, aber es sind dazwischen senkrechte Lnien und 
die Kreisabschnitte werden verkehrt eingelesen.

Wo liegt der Fehler.

Danke.

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Das ist das original BMP-Bild 320x240 :

Gruss

von Selbsternannter Weltverbesserer (Gast)


Lesenswert?

Hallo,

peter schrieb:
> Das Bild erscheint zwar, aber es sind dazwischen senkrechte Lnien und
> die Kreisabschnitte werden verkehrt eingelesen.

zu letzterem:
MSB und LSB vertauscht?
http://de.wikipedia.org/wiki/Bitwertigkeit

Mit freundlichen Grüßen
Selbsternannter Weltverbesserer

von Selbsternannter Weltverbesserer (Gast)


Lesenswert?

Hallo,

Selbsternannter Weltverbesserer schrieb:
> zu letzterem:
> MSB und LSB vertauscht?
> http://de.wikipedia.org/wiki/Bitwertigkeit

...oder die Reihenfolge der Spalten ist falsch.

Mit freundlichen Grüßen
Selbsternannter Weltverbesserer

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


Lesenswert?

peter schrieb:
> Wo liegt der Fehler.
1. Bitreihenfolge vertauscht.
2. vermutlich Latency in diesem Bereich:
1
        RomAddr <= RomAddr + 1;  
2
        if RomAddr = 9599 then
3
          romaddr <= 0;
4
        end if;
5
        ascii <= std_logic_vector(ascii_rom(RomAddr));
RomAddr hat beim Zugriff auf das ascii_rom noch den alten Wert! Du 
könntest diese Zeilen ebensogut auch so schreiben:
1
        RomAddr <= RomAddr + 1;  
2
        ascii <= std_logic_vector(ascii_rom(RomAddr));  
3
        if RomAddr = 9599 then
4
          romaddr <= 0;
5
        end if;
Oder so:
1
        ascii <= std_logic_vector(ascii_rom(RomAddr));  
2
        RomAddr <= RomAddr + 1;  
3
        if RomAddr = 9599 then
4
          romaddr <= 0;
5
        end if;
Der Synthesizer wird in ALLEN 3 Fällen EXAKT die selbe Hardware machen!
die Ursache liegt im Verhalten von Signalen in Prozessen: erst "am Ende" 
des Prozesses wird RomAddr den zuletzt zugewiesenen Wert "übernehmen".

Noch zwei Anmerkungen.
Das hier nennt man umgangssprachlich eine kombinatorische Schleife:
1
  if clk = '1' then
2
    pixelCounter <= pixelCounter + 1;
Siehe 
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Aber augenscheinlich hat dein Synthesizer erkannt, dass du das nicht 
willst und was halbwegs Sinnvolles draus gemacht...

So werden keine Takte gemacht!
1
    clk <= NOT clk;
Wofür sind im FPGA Taktmanager eingebaut?

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Entschuldigung, mein Purebasicprogramm war falsch geschrieben.
Jetzt ist der Kreis zu sehen, aber noch mit senkrechten Linien. Was wird 
da zuviel eingelesen?

Danke.
Gruss

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Hier die VHDL

Gruss

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


Lesenswert?

peter schrieb:
> Was wird da zuviel eingelesen?
Nichts. Es wird einfach nur falsch "eingelesen".
Den Grund habe ich schon genannt: das Verhalten von Signalen in 
Prozessen.

von peter (Gast)


Lesenswert?

Hmmm...ich kann das Fehlverhalten hier nicht lokalisieren für die 
schwarze linie , weiss auch nicht, wie ich das Zählen verlagern kann.
:
if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND 
lineCounter <= 239 then


1
vga_testpic: process(clk)
2
3
variable bitmap_pixelCounter: integer:=0; 
4
5
begin
6
  if rising_edge(clk) then
7
    
8
    pixelCounter <= pixelCounter + 1;
9
      
10
    if pixelCounter = 800 then
11
      pixelCounter <= 0;
12
      bitmap_pixelCounter := 0;
13
      lineCounter <= lineCounter + 1;
14
    end if;
15
    
16
    if lineCounter = 525 then
17
      lineCounter <= 0;
18
    end if;
19
20
    if pixelCounter >= 655 AND pixelCounter  <= 751 then
21
      hsync <= '0';
22
    else
23
      hsync <= '1';
24
    end if;
25
    
26
    if lineCounter  >= 489 AND lineCounter <= 491 then
27
      vsync <= '0';
28
    else
29
      vsync <= '1';
30
    end if;
31
  
32
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then
33
      red <= "0000";
34
      green <= "0000";
35
      blue <= "0000";  
36
      
37
      if bitmap_pixelCounter <= 7 then  
38
        if ascii(bitmap_pixelCounter) = '1' then
39
          green <= "1111";
40
        else
41
          green <= "0000";
42
        end if;
43
      else
44
        bitmap_pixelCounter := 0;
45
        RomAddr <= RomAddr + 1;  
46
        
47
        if RomAddr = 9599 then
48
          romaddr <= 0;
49
        end if;
50
        
51
        ascii <= std_logic_vector(ascii_rom(RomAddr));          
52
      end if;   
53
    else
54
      red <= "0000";
55
      green <= "0000";
56
      blue <= "0000";
57
    end if;
58
    
59
    bitmap_pixelCounter := bitmap_pixelCounter + 1;
60
  end if;
61
end process vga_testpic;
62
63
end architecture vga_core_arch;

Danke.
Gruss

von peter (Gast)


Lesenswert?

Ich meine diese Zählschleife:
if bitmap_pixelCounter <= 7 then

Gruss

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


Lesenswert?

Das hier:
1
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then
2
      red <= "0000";
3
      green <= "0000";
4
      blue <= "0000";  
5
      
6
      if bitmap_pixelCounter <= 7 then  
7
        if ascii(bitmap_pixelCounter) = '1' then
8
          green <= "1111";
9
        else
10
          green <= "0000";
11
        end if;
12
      else
13
        bitmap_pixelCounter := 0;
14
        RomAddr <= RomAddr + 1;  
15
        
16
        if RomAddr = 9599 then
17
          romaddr <= 0;
18
        end if;
19
        
20
        ascii <= std_logic_vector(ascii_rom(RomAddr));          
21
      end if;   
22
    else
23
      red <= "0000";
24
      green <= "0000";
25
      blue <= "0000";
26
    end if;
Liesse sich so übersichtlicher schreiben:
1
    red <= "0000";
2
    green <= "0000";
3
    blue <= "0000";  
4
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then
5
      if bitmap_pixelCounter <= 7 then  
6
        if ascii(bitmap_pixelCounter) = '1' then
7
          green <= "1111";
8
        end if;
9
      else
10
        bitmap_pixelCounter := 0;
11
        RomAddr <= RomAddr + 1;  
12
        
13
        if RomAddr = 9599 then
14
          romaddr <= 0;
15
        end if;
16
        
17
        ascii <= std_logic_vector(ascii_rom(RomAddr));          
18
      end if;   
19
    end if;

Dein Problem liegt auch in diesem Bereich: du darfst nicht sagen 
"solange bitmap_pixelCounter kleiner als 8 ist, mache das Eine, und 
sonst mache ein einziges Mal das Andere". Sondern du musst die Ausgabe 
erledigen und wenn nötig parallel neue Daten holen. Also in etwa so:
1
    red   <= "0000"; -- Defaultwerte
2
    green <= "0000";
3
    blue  <= "0000";  
4
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then
5
      if ascii(bitmap_pixelCounter) = '1' then -- immer Pixeldaten ausgeben
6
        green <= "1111";
7
      end if;
8
9
      if bitmap_pixelCounter = 8 then          -- ab und zu gleichzeitig den Zähler zurücksetzen
10
        bitmap_pixelCounter := 0;
11
        RomAddr <= RomAddr + 1;  
12
        if RomAddr = 9599 then
13
          romaddr <= 0;
14
        end if;
15
        ascii <= std_logic_vector(ascii_rom(RomAddr));          
16
      else
17
      end if;   
18
    end if;


BTW
Ein wenig ungeschickt, dass in deinem Code der bitmap_pixelCounter 
niemals 0 werden kann:
1
        bitmap_pixelCounter := 0;
2
    :
3
    :
4
    bitmap_pixelCounter := bitmap_pixelCounter + 1;

: Bearbeitet durch Moderator
von peter (Gast)


Angehängte Dateien:

Lesenswert?

jup, jetzt wird das Array-Bild gezeichnet mit 320x240 Pixel. 9600 Byte 
aus dem Array bilden den Screen ab als Kreis. Es läuft auf dem DE0/DE1.

So sieht jetzt dieses VHDL aus:
1
if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then    
2
      if bitmap_pixelCounter <= 7 then  
3
        if ascii(bitmap_pixelCounter) = '1' then
4
          green <= "1111";
5
        else
6
          green <= "0000";
7
        end if;
8
      else
9
        bitmap_pixelCounter := 0;
10
        RomAddr <= RomAddr + 1;  
11
        if RomAddr = 9599 then
12
          romaddr <= 0;
13
        end if;
14
        ascii <= std_logic_vector(ascii_rom(RomAddr));          
15
      end if;   
16
    else
17
      red <= "0000";
18
      green <= "0000";
19
      blue <= "0000";
20
    end if;
21
    bitmap_pixelCounter := bitmap_pixelCounter + 1;
22
  end if;

Gruss.

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


Lesenswert?

Peter, kreuze die beiden richtigen Antworten an:
[ ] ich habe nicht verstanden, was Lothar mit "Defaultwerten" meinte
[ ] ich habe auch das mit dem "parallel neue Daten holen" nicht 
verstanden

peter schrieb:
> jetzt wird das Array-Bild gezeichnet
Das ist nicht das Bild aus dem 
Beitrag "Re: VGA Text Mode Problem"
Das Problem ist nämlich immer noch das selbe. Du hast es nur vertuscht, 
indem du den "letzten" Wert eines Bytes doppelt ausgibst. Genau dort, wo 
vorher schwarze Linien waren, hast du jetzt nämlich Sprünge.

Naja, was schreibe ich auch... :-(

von peter (Gast)


Lesenswert?

So ist es ..habe es nicht verstanden, kannst jetzt jubeln.
Man...man..was bist du für ein Mensch..traurig..traurig.
Was hast du für ein beschissenes leben.

Danke für deine Hilfe.

Gruss

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


Lesenswert?

peter schrieb:
> So ist es ..habe es nicht verstanden, kannst jetzt jubeln.
Worüber denn?
Und warum sagst du das nicht früher mit dem "nicht verstanden"?
Oben sieht es ja so aus als ob du es verstanden hättest. Ich schreibe 
eine ganze Litanei, du ignorierst sie und schreibst "jup, jetzt wird das 
Array-Bild gezeichnet". Aber du schreibst mit keiner Silbe dass dir 
nicht klar ist, was ich meine! Und dass der Fehler nur versteckt ist, 
das hätte dir auch auffallen können...

> Man...man..was bist du für ein Mensch..traurig..traurig.
> Was hast du für ein beschissenes leben.
Wie man es sieht. Ich bin auf jeden Fall nicht so verbittert und 
lernresistent wie du...

> Danke für deine Hilfe.
Bitte. Du solltest aber nicht die Hand beißen, die dir hilft.

von peter (Gast)


Lesenswert?

Hmmm.., ich habe eine Lösung gesucht, wie ich das zb mit "if test = ..." 
evtl umschiffen kann als Anfänger.

Gruss

von peter (Gast)


Lesenswert?

-----------------
Ein wenig ungeschickt, dass in deinem Code der bitmap_pixelCounter
niemals 0 werden kann:
----------------

Wie kann man das umgehen...das suche ich schon ein weile.

Danke.
Gruss

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


Angehängte Dateien:

Lesenswert?

Ich bekomme mit deinem Code gleich die Warnung:
1
WARNING:Xst:790 - "vga_core.vhd" line 1032: Index value(s) does not match array range, simulation mismatch.
Mit einer kleinen Bereichseinschränkung ist die schon mal behoben:
1
variable bitmap_pixelCounter: integer range 0 to 7 := 0;

Die hier sieht selbsterklärend aus:
1
WARNING:Xst:819 - "vga_core.vhd" line 999: One or more signals are missing in the process sensitivity list. 
2
... The missing signals are:   <lineCounter>, <ascii_rom>
Die Ursache ist aber diese Zeile hier:
1
  if clk = '1' then
Denn der Synthesizer erkennt so nicht, dass der Prozess getaktet sein 
sollte und macht einen kombinatorischen Prozess draus. Und bei einem 
kombinatorischen Prozess fehlen dann die angemeckerten Signale.

In der Summe habe ich deine Bescheibung mal angepackt und geradegebogen. 
Jetzt läuft sie ohne Warnungen und mit bitmap_pixelCounter von 0..7 
durhc den Synthesizer. Probier mal aus, was damit herauskommt...

von peter (Gast)


Lesenswert?

-----------------
if clk = '1' then
------------------
habe ich schon ersetzt durch :
if rising_edge(clk) then  oder  :
wait until rising_edge(CLK);

Gruss

von peter (Gast)


Lesenswert?

Jup, danke für deine Hilfe.

Das Bild ist ganz grün, alle Pixel von x=0-319 und y=0-239 sind 
gesetzt, kein Muster von nicht gesetzten Pixel erkennabr.

Vielleicht sollte man eine anderen Lösung anstreben um ein Array als 
Screen sichtbar zu machen bzw die Zählart ändern für die einzelnen Pixel 
vom Byte.?

Gruss

von Erklärbär (Gast)


Lesenswert?

Wo ist denn eigentlich der TEXT in Deiner Anwendung?

von peter (Gast)


Lesenswert?

Ich möchte jetzt ein Grafikbildarray(9600 Byte) 320x240 Pixel einlesen 
in den ganzen Screen, kein Text. Text ist ja wie ein Sprite, das ist 
keine Schwierigkeit mit dem einlesen und da treten keine Fehler auf.

Gruss

von Markus F. (mfro)


Lesenswert?

Das muß nicht die Ursache sein, aber
1
clken25
 irgendwo mit irgendwas zu initialisieren, wär' sicher 'ne gute Idee.

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


Lesenswert?

Markus F. schrieb:
> Das muß nicht die Ursache sein, aber clken25 irgendwo mit irgendwas zu
> initialisieren
Ist egal. Das macht der Synthesizer sowieso. Nicht initialisierte 
Signale werden üblicherweise mit '0' belegt. Aber richtig: bei der 
Simulation merkt man das schnell...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
>
> In der Summe habe ich deine Bescheibung mal angepackt und geradegebogen.
> Jetzt läuft sie ohne Warnungen und mit bitmap_pixelCounter von 0..7
> durhc den Synthesizer. Probier mal aus, was damit herauskommt...

Hat einen kleinen Fehler: RomAddr wird bei jeder Zeile wieder auf 0 
gesetzt, statt nur bei jedem Bild.

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt ein Linienbild gezeichnet um die Fehler besser zu 
erkennen.
Originalbild als BMP und ein Bild von SCreen.

Ich weiss nicht woran es liegt.
Läuft auf DE1 und DE0.

Gruss

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Hier das BMP-Bild:

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


Angehängte Dateien:

Lesenswert?

Lattice User schrieb:
> Hat einen kleinen Fehler: RomAddr wird bei jeder Zeile wieder auf 0
> gesetzt, statt nur bei jedem Bild.
Ja, böse Sache.

peter schrieb:
> Ich weiss nicht woran es liegt.
Ich auch nicht, deshalb habe ich jetzt mal in der Vesperpause eine 
Testbench aufgesetzt und das Timing vom RAM-Zugriff weggezerrt und 
geradegebogen. Laut Waveform der Simulation müsste es jetzt in etwa tun. 
Peter, probiers mal aus...

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Ja danke Lothar jetzt sind keine Pixelfehler mehr vorhanden.
Vielen...vielen dank es funktioniert jetzt einwandfrei auf dem DE1 und 
DE0.

Was heisst das hier:
Timing vom RAM-Zugriff weggezerrt

Vielen dank.

Gruss

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


Lesenswert?

peter schrieb:
> Was heisst das hier:  Timing vom RAM-Zugriff weggezerrt
Das Timing wird im Prozess gemacht, der Zugriff auf die bilddaten im RAM 
in einer nebenläufigen Zuweisung.

> jetzt sind keine Pixelfehler mehr vorhanden.
So hat es die Simulation vorausgesagt... ;-)
Du solltest dich echt mal mit dem Thema beschäftigen. Es wird dir das 
Verständnis deiner Beschreibungen erleichtern.

> Ja danke Lothar
Bitte.

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Bei der Nebenläufigen Zuweisung : ascii <= 
std_logic_vector(ascii_rom(RomAddr));

kann ich die Daten nicht mehr ändern, es kommt die Meldung bei der 
Änderung der Daten :
Error (276003): Cannot convert all sets of registers into RAM 
megafunctions when creating nodes.
The resulting number of registers remaining in design exceeds the number 
of registers
in the device or the number specified by the assignment 
max_number_of_registers_from_uninferred_rams.
This can cause longer compilation time or result in insufficient memory 
to complete Analysis and Synthesis

wenn ich damit Daten zuweisen möchte :
if switch(0) = '1' then
  ascii_rom(Ramaddr )<= x"ff";
end if;

Ich möchte gerne über die serielle Schnittstelle die Grafik überspielen, 
welches funktioniert
wenn die nebenläufige Anweisung im Prozess steht. Bloss dann tritt der 
Grafikfehler wieder auf.

Danke.
Gruss
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.ALL;
4
5
entity vga_core is
6
port
7
(
8
  clk_50: in std_logic;
9
  red: out std_logic_vector(3 downto 0);
10
  green: out std_logic_vector(3 downto 0);
11
  blue: out std_logic_vector(3 downto 0);
12
  hsync: out std_logic;
13
  RXD    : in   STD_LOGIC;
14
  switch :  in std_logic_vector(1 downto 0); 
15
  vsync: out std_logic
16
);
17
end vga_core;
18
19
architecture vga_core_arch of vga_core is
20
21
signal clken25: std_logic := '0';
22
signal lineCounter: integer range 0 to 525 := 300; 
23
signal pixelCounter: integer range 0 to 800 := 0;
24
25
signal ascii : std_logic_vector(7 downto 0);
26
signal RomAddr  : integer range 0 to 9599 := 0;
27
signal ramAddr  : integer range 0 to 9599 := 0;
28
29
signal bitmap_pixelCounter: integer range 0 to 7 := 0; 
30
signal inpicture : std_logic := '0';
31
32
type Rom is array (0 to 9599) of unsigned (7 downto 0); 
33
signal ascii_rom : Rom;
34
35
begin
36
clken25 <= not clken25 when rising_edge(clk_50);
37
38
process
39
  begin
40
    wait until rising_edge(clk_50);
41
    
42
    if switch(0) = '1' then
43
      ascii_rom(Ramaddr )<= x"ff";
44
    end if;  
45
     
46
    if clken25='1' then
47
      if pixelCounter = 800 then
48
        pixelCounter <= 0;
49
        if lineCounter = 525 then
50
          lineCounter <= 0;
51
        else
52
          lineCounter <= lineCounter + 1;
53
        end if;
54
    else 
55
      pixelCounter <= pixelCounter + 1;
56
    end if;
57
    
58
    if pixelCounter >= 655 AND pixelCounter  <= 751 then
59
      hsync <= '0';
60
    else
61
      hsync <= '1';
62
    end if;
63
     
64
    if lineCounter  >= 489 AND lineCounter <= 491 then
65
      vsync <= '0';
66
    else
67
      vsync <= '1';
68
    end if;
69
   
70
    inpicture <= '0';
71
    if pixelCounter >= 0 AND pixelCounter <= 319 AND lineCounter >=  0 AND lineCounter <= 239 then  -- im Bildbereich  
72
      inpicture <= '1';
73
      if bitmap_pixelCounter < 7 then  
74
        bitmap_pixelCounter <= bitmap_pixelCounter + 1;
75
      else
76
        bitmap_pixelCounter <= 0;
77
        RomAddr <= RomAddr + 1;  
78
        if RomAddr = 9599 then
79
          RomAddr <= 0;
80
        end if;
81
      end if;   
82
    end if;
83
  end if;
84
end process;
85
   
86
  ascii <= std_logic_vector(ascii_rom(RomAddr)); 
87
88
  red   <= "0000";
89
  blue  <= "0000";
90
  green <= "1111" when ascii(bitmap_pixelCounter) = '1' and inpicture='1' else "0000";
91
92
end architecture;

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.