Forum: FPGA, VHDL & Co. Bild in SRAM mittels VGA projezieren


von Chris (Gast)


Lesenswert?

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
    PORT MAP(
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
    PORT MAP(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
COMPONENT entity_address_coordinate_converter IS
43
  PORT(
44
      EADCC_ADDR    :  IN std_logic_vector (17 downto 0);
45
      EADCC_COORDX  :  OUT std_logic_vector(9 downto 0);
46
      EADCC_COORDY  :  OUT std_logic_vector(9 downto 0)
47
    );
48
  END COMPONENT;


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

von Duke Scarring (Gast)


Lesenswert?

> 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

von Chris (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

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.