Guten Morgen!
ich möchte gerne etwas ganz ganz einfaches programmieren. über sinn und
zweck lässt sich streiten - aber wie gesagt es ist nur eine übung für
mich.
und zwar:
ich habe ein bild, pixel für pixel im SRAM (DE2 Board von Altera)
abgespeichert.
1
"0000000000000000"="weiß"
2
"0000000000000001"="schwarz"
nun weiß ich dass mein bild zb 20x20 pixel groß ist. dh. ich kann per
adresse - die ja bei "000000000000000000" anfängt die x und y position
des pixels am bildschirm berechnen. alles kein problem :) bis jetzt.
mein VGA modul funktioniert einwandfrei - also ich kann ein blaues
bildchen auf den bildschirm projezieren...
1
instance_vga_controller:entity_vga_controller
2
PORTMAP(
3
CLK_50=>CLK_50,
4
reset=>Reset_h,
5
hs=>VGA_HS,
6
vs=>vsSig,
7
pixel_clk=>VGA_CLK,-- internal 25Mhz
8
blank=>VGA_BLANK,
9
sync=>VGA_SYNC,
10
DrawX=>DrawXSig,
11
DrawY=>DrawYSig
12
);
13
14
15
instance_sram_controller:entity_sram_controller
16
PORTMAP(CLK_50=>CLK_50,
17
SRAM_DQ=>SRAM_DQ,
18
SRAM_ADDR=>SRAM_ADDR,
19
SRAM_UB_N=>SRAM_UB_N,
20
SRAM_LB_N=>SRAM_LB_N,
21
SRAM_WE_N=>SRAM_WE_N,
22
SRAM_CE_N=>SRAM_CE_N,
23
SRAM_OE_N=>SRAM_OE_N,
24
GPIO_0=>GPIO_0,
25
GPIO_1=>GPIO_1,
26
HEX0=>HEX0,
27
HEX1=>HEX1,
28
HEX2=>HEX2,
29
HEX3=>HEX3,
30
HEX4=>HEX4,
31
HEX5=>HEX5,
32
HEX6=>HEX6,
33
HEX7=>HEX7,
34
CNN_NEW_ADDR=>CNN_NEW_ADDR,
35
CNN_READ_WRITE=>CNN_READ_WRITE,
36
CNN_DATA_ADDRESS=>CNN_DATA_ADDRESS,
37
CNN_DATA_IN=>CNN_DATA_IN
38
);
39
40
41
42
COMPONENTentity_address_coordinate_converterIS
43
PORT(
44
EADCC_ADDR:INstd_logic_vector(17downto0);
45
EADCC_COORDX:OUTstd_logic_vector(9downto0);
46
EADCC_COORDY:OUTstd_logic_vector(9downto0)
47
);
48
ENDCOMPONENT;
gut, nun wird aber der ganze bildschirm mit einer frequenz von 50mhz
gezeichnet. da bei mir das ganze system synchron läuft (50Mhz) kann ich
immer nur einen pixel aus dem SRAM projezieren...
ich hoffe ihr versteht meinen Denkfehler/problem.
wie kann ich alle pixel von adresse 0 bis X auf einmal zeichnen?
bin wirklich für jeden tipp dankbar!
lg
Chris
> wie kann ich alle pixel von adresse 0 bis X auf einmal zeichnen?
Gar nicht. Du musst Pixel für Pixel aus dem Speicher auslesen (oder
sonstwie generieren) und zum Monitor schicken. Pixel für Pixel, dann den
Zeilensync (Hsync) und das Ganze Zeile für Zeile. Und danach den
Framesync (Vsync).
Deine (Speicher)auslesefrequenz ist zwar 50 MHz, aber deine
Bildwiederholrate ca. 60 Hz.
Duke
Hallo!
Das bedeutet dass der SRAM total unnötig ist?
Man muss quasi vorher alle pixeldaten in einen vektor laden und dann per
x- y-Koordinate die richtige Pixelinformation aus dem vektor raus lesen.
schade, ich hätte gedacht, dass man die sache mit einem sram baustein
sehr elegant lesen kann.
Den Baustein brauchts Du sowieso. Irgendwo muss das Bild ja stehen.
>Deine (Speicher)auslesefrequenz ist zwar 50 MHz, aber deine>Bildwiederholrate ca. 60 Hz.
Was heisst "aber"? Entscheidend sind die 50Mhz. Die steigen an, wenn die
bildrate anstiege.
--------
Ich mache das so, daß ich im SRAM jeweils einmal lese und einmal
schreibe. Die Schreibinfos kommen aus einem FIFO, der X,Y,Farbe enthält.
Das ist ein simples Interface, welches von jedem VHL genutrz werden
kann. Zudem kann ein Befell "wait for synch" eingeschrieben werden. Dann
wartet der de FIFO auslesende Prozess, bis der VSYnch kommt, sodaß kein
Bild inmitten eines Bildwechsels aktualisiert wird und es zu Rucklern
kommt, wenn grosse Flächen gezeichnet werden sollen.
Der Leseprozess auf dem SRAM liest mit einigen clocks Vorlauf aus und
erzeugt die Signale. Damit kann eine dynamische Farbverwaltung erzeugt
werden und man hat noch einige clocks Zeit, um auf die 75MHz zu kommen.
Der RAM-Prozess arbeitet mit 150MHz, wobei 2 physikalisch parallel mit
75Mhz betrieben werden. Das packen auch langsame Riegel.