Framebuffer, wie?
Dezember 8th, 2009Prinzipiell ist mir klar, wie es passieren soll. Ein VHDL Modul schickt die Daten mithilfe von gegebenen Übertragungsparametern zum Bildschirm.
Aber wo hält sich sich das Modul den Speicher für seinen Framebuffer? Eine Beispielrechnung:
Für eine angenehme Auflösung von 640x480 Pixel sind wir bei 307.200 Pixel pro Bild. Jeder Pixel ist 1 Byte groß (weil ich 256 Farben haben möchte). Das ergibt einen Speicherbedarf von 300 Kilobyte.
Schränke ich mich ein: 320x240 Pixel => 75 Kilobyte.
Das ist beides viel zu viel, um es intern im FPGA zu halten. Es wird also Zeit, sich den Arbeitsspeicher des Boards mal anzusehen.
Verbaut sind 16MB PSDRAM, der sollte genügen. Man kann auf ihn zugreifen wie gewöhnlichen SRAM, allerdings mit einer Zugriffszeit von ca. 70ns.
TODO: Das T51-Projekt von mikrocontroller.net dazu betrachten:
"Auf den Schirm!" (II)
Dezember 8th, 2009Ein Zwischenbericht:
Das Board bietet dankenswerterweise einen 16 Pin breiten Erweiterungsslot, den ich einfach per Stiftleiste erreichen kann. 11 Pins werde ich wohl brauchen.
Was noch fehlt: Masseleitungen
Statt D-Sub VGA Stecker zu verwenden, werde ich ein VGA-Verlängerungskabel schlachten und die Drähte an mein Board löten.
Jetzt sollte ich aber wirklich mal was arbeiten gehen ![]()
Das GEZ Imperium schlägt zurück
Dezember 8th, 2009Hurra, eine GEZ Reform! Ach nee, doch nicht.
Außerdem müsse künftig der Gebührenpflichtige nachweisen, dass er keines der Geräte besitzt – und nicht wie bisher die GEZ.
Die Beweislastumkehr! Ich muss der GEZ nun beweisen, dass ich kein Rundfunkgerät besitze. Erinnert mich ein bisschen an Antigeld. Nein im Ernst, das macht natürlich den gesamten Spitzelapparat kaputt: Jetzt müssen nur noch die überwacht werden, die auf bizarre Art und Weise nachweisen können, kein Gerät gekauft zu haben.
Aber wir brauchen unabhängige Medien. Nicht wahr, Herr Brender?
"Auf den Schirm!"
Dezember 8th, 2009Ich hab mich immer gewundert, dass ein VGA Stecker so viele Pins hat. Die Wahrheit ist: Für einfache Bilder sind nur recht wenige vonnöten.
Viele Tutorials beschäftigen sich mit dem kleinstmöglichen Farbspektrum. Für die Grundfarben Rot Grün und Blau findet sich jeweils ein Pin am VGA Port. Die maximal empfohlene Spannung beträgt 0,7V. Hat man nun nur die Wahl zwischen 0 und 0,7V kommen wir auf 2^3 = 8 Farben!
Wenn ich 8 Farben sehen will, spiele ich Atari. Ich will mehr!
Die Farbmischung lässt sich variieren, indem man mit Spannungen zwischen 0V und 0,7V hantiert. Was tun? Ich habe keinen D/A Wandler onboard. Und 8-bit DACs pro Farbe sind Overkill. Die Lösung ist recht banal:
(Anmerkung: Im Bildschirm findet sich noch ein 75 Ohm Widerstand für jede Leitung)
Unterschiedlich dimensionierte Spannungsteiler erlauben es, höher- und niederwertige Bits nachzuahmen. So braucht es jetzt 8 Pins, um die Farben zu mischen. 2^8 = 256 Farben, yeah!
Abstecher zu den Tönen
Dezember 8th, 2009Mir ist heute ein PC-Speaker in die Hände gefallen. Da musste ich doch gleich mal was ausprobieren:
Der interne Oszillator lässt sich auf 100 Mhz takten. Ein entsprechender Frequenzteiler lässt mich verschiedene (mehr oder weniger) hübsche Töne erzeugen. Es reicht zumindest für die Simulation des klassischen Speakers. Und ich konnte auch mal die Leistungsfähigkeit des Quarzes bewerten.
Der Code ist quick&dirty, aber in den meisten Fällen lässt er mich über die 4 Taster die Frequenz ändern. Per Jumper kann ich den Quarz noch auf 1/2 und 1/4 teilen und damit auch den Ton modifizieren.
entity Tongenerator is
Port ( Clk_100Mhz : in STD_LOGIC;
Taste_A : in STD_LOGIC;
Taste_B : in STD_LOGIC;
Taste_C : in STD_LOGIC;
Taste_D : in STD_LOGIC;
Ton : out STD_LOGIC;
Lampe : out STD_LOGIC);
end Tongenerator;
architecture Behavioral of Tongenerator is
signal Input100Mhz : STD_LOGIC;
signal Input1Hz : STD_LOGIC;
begin
main : process is
variable counter : natural range 0 to 100000000 := 0;
variable depend_A : natural range 0 to 100000000 := 0;
variable depend_B : natural range 0 to 100000000 := 0;
begin
wait until rising_edge(Clk_100Mhz);
if(Taste_A = '1') then
depend_A := 150000;
depend_B := 300000;
elsif(Taste_B = '1') then
depend_A := 110000;
depend_B := 220000;
elsif(Taste_C = '1') then
depend_A := 90000;
depend_B := 180000;
elsif(Taste_D = '1') then
depend_A := 70000;
depend_B := 140000;
end if;
if(counter = 0) then
Ton <= '0';
Lampe <= '0';
counter := counter + 1;
elsif(counter = depend_A) then
Ton <= '1';
Lampe <= '1';
counter := counter + 1;
elsif(counter = depend_B) then
counter := 0;
else
counter := counter + 1;
end if;
end process;
end Behavioral;
