mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
"0000000000000000" = "weiß"
"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...
instance_vga_controller : entity_vga_controller
    PORT MAP(
      CLK_50 => CLK_50,
      reset => Reset_h,
      hs => VGA_HS,
      vs => vsSig,
      pixel_clk => VGA_CLK,    -- internal 25Mhz
      blank => VGA_BLANK,
      sync => VGA_SYNC,
      DrawX => DrawXSig,
      DrawY => DrawYSig
    );


instance_sram_controller :  entity_sram_controller
    PORT MAP(CLK_50 => CLK_50,
      SRAM_DQ => SRAM_DQ,
      SRAM_ADDR => SRAM_ADDR,
      SRAM_UB_N => SRAM_UB_N,
      SRAM_LB_N => SRAM_LB_N,
      SRAM_WE_N => SRAM_WE_N,
            SRAM_CE_N => SRAM_CE_N,
            SRAM_OE_N => SRAM_OE_N,
            GPIO_0 => GPIO_0,
            GPIO_1 => GPIO_1,
            HEX0 => HEX0,
            HEX1 => HEX1,
            HEX2 => HEX2,
            HEX3 => HEX3,
            HEX4 => HEX4,
            HEX5 => HEX5,
            HEX6 => HEX6,
            HEX7 => HEX7,
            CNN_NEW_ADDR => CNN_NEW_ADDR,
            CNN_READ_WRITE => CNN_READ_WRITE,
            CNN_DATA_ADDRESS => CNN_DATA_ADDRESS,
            CNN_DATA_IN => CNN_DATA_IN
    );



COMPONENT entity_address_coordinate_converter IS
  PORT(
      EADCC_ADDR    :  IN std_logic_vector (17 downto 0);
      EADCC_COORDX  :  OUT std_logic_vector(9 downto 0);
      EADCC_COORDY  :  OUT std_logic_vector(9 downto 0)
    );
  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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.