Robert P. schrieb:
> Zum anderen ist der Array
> - 2 Dimensional
> - als geschachtelter Typ (in 2 Zeilen)
> - als downto beschrieben, also gleich 3 eher ungewöhnliche Dinge.
Weiterhin hat das Array ein "Off-by-One" Problem, weil jede Zeile ein
Pixel zuviel hat und zudem das ganze Bild eine Zeile zuviel.
Matthias schrieb:
> Aber warum sollte es generell nicht möglich sein das zu Synthetisieren?
Was sthet denn im Synthesizer User Guide zum Thema RAMs? Wie musst du so
ein RAM beschreiben, dass der Synthesizer das richtig erkennt und
umsetzen kann?
> Verstehen würde ich es, wenn es eine Warnung/Fehler wegen der größe des
> Array's gäbe.
Und was passiert, wenn du nur so und zum Test die Arrays(*) etwas
kleiner machst und "nur" VGA(**) ausgibst?
Wenn du die x und y zu Integern machst, dann wird dein Code ganz schnell
leserlich. Dann musst du z.B. nicht laufend konvertieren und mit
Hexzahlen vergleichen. Da sieht man dann schnell eigenartige Sachen:
1 | signal x : integer range 0 to 1080 := 0;
|
2 | signal y : integer range 0 to 548 := 0;
|
3 | :
|
4 | P1: Process(CLK100MHZ)
|
5 | BEGIN
|
6 | if rising_edge(CLK100MHZ) THEN
|
7 | if x < 1080 THEN
|
8 | if y < 548 THEN
|
9 | y <= y+1; -- (***)
|
10 | VGA_monitor(x)(y) <= (OTHERS => '1') ; -- kurios:
|
11 | else -- hier ist y>= 548
|
12 | VGA_monitor(x)(y) <= (OTHERS => '1') ; -- zweimal hintereinander das selbe?
|
13 | y <= 0;
|
14 | x <= x+1;
|
15 | END IF;
|
16 | END IF;
|
17 | end if;
|
18 | END PROCESS;
|
(*) besser ganz ohne Apostroph
(**) VGA hat 640x480 Pixel, insofern ist deine Namensgebung sehr
unglücklich
(***) ich hoffe, dir ist an dieser Stelle das Verhalten von Signalen in
Prozessen bekannt. Denn ich könnte die Reihenfolge der Zuweisungen in
diesem Prozess mit dem selben Syntheseergebnis auch so sortieren:
1 | signal x : integer range 0 to 1080 := 0;
|
2 | signal y : integer range 0 to 548 := 0;
|
3 | :
|
4 | P1: Process(CLK100MHZ)
|
5 | BEGIN
|
6 | if rising_edge(CLK100MHZ) THEN
|
7 | if x < 1080 THEN
|
8 | if y < 548 THEN
|
9 | VGA_monitor(x)(y) <= (OTHERS => '1') ;
|
10 | y <= y+1;
|
11 | else -- hier ist y >= 548
|
12 | x <= x+1;
|
13 | VGA_monitor(x)(y) <= (OTHERS => '1') ;
|
14 | y <= 0;
|
15 | END IF;
|
16 | END IF;
|
17 | end if;
|
18 | END PROCESS;
|
Und natürlich könnte man das noch zusammenfassen und dafür sorgen, dass
die Zähler nicht über die 548 bzw. 1080 Pixel hinauslaufen:
[/vhdl]
signal x : integer range 0 to 1079 := 0;
signal y : integer range 0 to 547 := 0;
:
P1: Process(CLK100MHZ)
BEGIN
if rising_edge(CLK100MHZ) THEN
if x <= 1079 THEN
VGA_monitor(x)(y) <= (OTHERS => '1') ;
if y < 547 THEN
y <= y+1;
else
y <= 0;
x <= x+1;
END IF;
END IF;
end if;
END PROCESS;
[/vhdl]