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.
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
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.
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
peter schrieb:> Wo liegt der Fehler.
1. Bitreihenfolge vertauscht.
2. vermutlich Latency in diesem Bereich:
1
RomAddr<=RomAddr+1;
2
ifRomAddr=9599then
3
romaddr<=0;
4
endif;
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
ifRomAddr=9599then
4
romaddr<=0;
5
endif;
Oder so:
1
ascii<=std_logic_vector(ascii_rom(RomAddr));
2
RomAddr<=RomAddr+1;
3
ifRomAddr=9599then
4
romaddr<=0;
5
endif;
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:
Entschuldigung, mein Purebasicprogramm war falsch geschrieben.
Jetzt ist der Kreis zu sehen, aber noch mit senkrechten Linien. Was wird
da zuviel eingelesen?
Danke.
Gruss
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.
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
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:
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:
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... :-(
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
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.
-----------------
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
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
variablebitmap_pixelCounter:integerrange0to7:=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
ifclk='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...
-----------------
if clk = '1' then
------------------
habe ich schon ersetzt durch :
if rising_edge(clk) then oder :
wait until rising_edge(CLK);
Gruss
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
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
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...
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.
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
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...
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
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.
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
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useieee.numeric_std.ALL;
4
5
entityvga_coreis
6
port
7
(
8
clk_50:instd_logic;
9
red:outstd_logic_vector(3downto0);
10
green:outstd_logic_vector(3downto0);
11
blue:outstd_logic_vector(3downto0);
12
hsync:outstd_logic;
13
RXD:inSTD_LOGIC;
14
switch:instd_logic_vector(1downto0);
15
vsync:outstd_logic
16
);
17
endvga_core;
18
19
architecturevga_core_archofvga_coreis
20
21
signalclken25:std_logic:='0';
22
signallineCounter:integerrange0to525:=300;
23
signalpixelCounter:integerrange0to800:=0;
24
25
signalascii:std_logic_vector(7downto0);
26
signalRomAddr:integerrange0to9599:=0;
27
signalramAddr:integerrange0to9599:=0;
28
29
signalbitmap_pixelCounter:integerrange0to7:=0;
30
signalinpicture:std_logic:='0';
31
32
typeRomisarray(0to9599)ofunsigned(7downto0);
33
signalascii_rom:Rom;
34
35
begin
36
clken25<=notclken25whenrising_edge(clk_50);
37
38
process
39
begin
40
waituntilrising_edge(clk_50);
41
42
ifswitch(0)='1'then
43
ascii_rom(Ramaddr)<=x"ff";
44
endif;
45
46
ifclken25='1'then
47
ifpixelCounter=800then
48
pixelCounter<=0;
49
iflineCounter=525then
50
lineCounter<=0;
51
else
52
lineCounter<=lineCounter+1;
53
endif;
54
else
55
pixelCounter<=pixelCounter+1;
56
endif;
57
58
ifpixelCounter>=655ANDpixelCounter<=751then
59
hsync<='0';
60
else
61
hsync<='1';
62
endif;
63
64
iflineCounter>=489ANDlineCounter<=491then
65
vsync<='0';
66
else
67
vsync<='1';
68
endif;
69
70
inpicture<='0';
71
ifpixelCounter>=0ANDpixelCounter<=319ANDlineCounter>=0ANDlineCounter<=239then-- im Bildbereich