www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Sharp LM038QB1R10 - Xilinx Spartan-3 -VHDL


Autor: P. Kow (yelli)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen. Ich versuche momentan ein Sharp LM038QB1R10 mit Hilfe 
eines Spartan-3 boardes anzusteuern. Mein ziel war es erstmal etwas 
darzustellen (ein Rechteck oben links auf dem Display).

Es tut sich zwar schon etwas aber irgendwie scheint es da noch probleme 
zu geben... Das Display flackert städig...

Kann es am Timing liegen?


Würde mich über Hilfe freuen, weil ich momentan gar nicht weiter komme
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity displayansteuerung is
    port( d : out std_logic_vector(3 downto 0);
         yd : out std_logic ;
       m  : out std_logic;
       lp : out std_logic;
       disp : out std_logic;
       start : in std_logic;
       reset : in std_logic;
       xck : out std_logic; -- 3,125 MHz Takt
       clk : in std_logic);-- 50 MHz Takt

   
end displayansteuerung;

architecture Behavioral of displayansteuerung is
signal xck_intern :  std_logic_vector(3 downto 0); -- 3,125 MHz Takt
signal x_i : integer range 0 to 127;
signal y_i : integer range 0 to 255;
signal x :  std_logic_vector(6 downto 0);
signal y :  std_logic_vector(7 downto 0);
signal m_intern : std_logic ;
signal verri : std_logic ;
 
begin

disp <= '1';

process(clk)
begin
   if(rising_edge(clk)) then
    if(reset = '1') then
      xck_intern <= "0000";
    else
      xck_intern <= xck_intern + "0001"; -- generieren einen 3,125 MHz Takt
    end if;   
  end if;
end process;
  

process(xck_intern(3))
 
begin
   if (falling_edge(xck_intern(3))) then
    
    if (start = '1') then
      x <= "0000000";
      y <= "00000000"; 
      verri <= '1';
      m_intern <= '0';
      
    else
      if(verri = '1') then
     
          if (x < "1001111")  then  -- if-Schleife f¨¹r Einlesen einer Zeile, 79 Einheiten 
             x <= x + "0000001";
            lp <= '0';
        else 
              lp <= '1';
           x <= "0000000"; -- wenn x 80 ist, wird er zurueckgesetzt
           if (y < "11110011") then  -- Z zaehlt bis 243
             if ((y = "00001100") and (x = "1001111")) then -- m_intern wird invertiert nach 13. Zeile ;
                   m_intern <= (not m_intern);
                 else
                   m_intern <= m_intern;
                 end if; 
             y <= y + "00000001";  
           else
            y <= "00000000"; 
            end if;   
           end if;
        end if;         
    end if;
   end if;
       
end process;  

xck <= xck_intern(3);

m <= m_intern;

yd <= '1' when (y = "00000001")  else -- signalisieren YD nach der 1. Zeile 
      '0';
    
x_i <= conv_integer(x);
y_i <= conv_integer(y);


d <= "0000"  when ((x_i <= 4)and (y_i <= 39))   else -- dunkler Rechteck, 20 * 40, oben-links
            "1111"; 
 


end Behavioral;

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weiß zwar nicht obs was bringt, aber ich würde generell nur den clk 
(also die 50mhz) verwenden und nicht clk und xck.
um den "hauptprozess" mit einem niedrigeren takt laufen zu lassen kannst 
du folgendes machen :

architecture ...
  ...
  signal xck_z1 : std_logic; -- soll den vorherigen zustand von xck(3) 
speichern
  ...
begin
  ...
  -- im prozess deines xck-teilers :
  xck_z1 <= xck(3); -- veschiebt xck(3) um einen systemtakt
  ...

  if rising_edge(clk) then
    if xck_z1 = '1' and xck(3) = '0' then -- erkennung fallende flanke 
an xck(3)
     ...
     if start = '1' ....


    end if;
    ...
  end if;

end

damit läuft dein gesamtes design mit dem clk von 50mhz und die 
verarbeitenden teile laufen über die flankenerkennung an xck(3) 
langsamer.
vllt. hilfts ja.

gruß
rene

ps. hoffe ich hab mich nicht zu umständlich ausgedrückt.

Autor: Thomas Hertwig (mac4ever)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Diese LCD-Betriebsspannungen dürfen erst dann angelegt werden, wenn ein
> gültiges Steuersignal an den Pins XCK/LP/YD/M anliegt. Andernfalls kann das
> Display beschädigt werden.

Hast Du das auch beachtet ? Nicht das der Fehler von da herkommt

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Spannungen sollten eigentlich später einegschaltet werden, aber wenn 
die Displayspannung gleichzeitig mit der Betriebsspannung eingeschaltet 
wird, ist das auch nicht schlimm (solange diese Spannung nicht vor der 
Betriebsspannung da ist !). Nur wenn die Displayspannung längere Zeit 
ohne die Ansteuersignale anliegt geht das Display kaputt.

Von den Zahlenwerten her sieht der Code gut aus.
Hast du schonmal nachgemessen ob die Signale auch richtig aus dem FPGA 
rauskommen ? Also ob an LP mit rund 10-20kHz kurze Peaks anliegen, und 
an YD kurze Peaks mit 50-100Hz ?
Falls das so ist, die Spannungen am LCD nachmessen.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal gehört das das display einen Takt von ca 7MHz benötigt....

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt aber nicht.
Bei mir läuft das mit rund 2MHz.
7MHz ist viel zu hoch, das wären nämlich 7MHz/(320/4)/240=364Hz 
Framerate. Üblich sind 70-100Hz.
Die meisten Displays können maximal etwa 4-8MHz, was auch bei weitem 
ausreicht.

Autor: P. Kow (yelli)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe mal die Signale aufgenommen und screenshots gemacht....

und versucht die Werte zu berechnen...


YD hat bei mir 38,5 KHz

Frame müßte um die 160 Hz sein

XCK gibt er mir wenn ich mich bei all den Werten nicht vertue 6,25 MHz 
aus

LP 3,125 MHz

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Kowalski wrote:
> YD hat bei mir 38,5 KHz

Ist etwas viel. Versuch mal den Pixeltakt zu halbieren.

> Frame müßte um die 160 Hz sein

Wie beim LP: Pixeltakt halbieren. Rund 80Hz sind ideal. Das Datenblatt 
schreibt 60-120Hz.

> XCK gibt er mir wenn ich mich bei all den Werten nicht vertue 6,25 MHz
> aus

Eigentlich sollte es also zumindest funktionieren. Laut Datenblatt sind 
maximal 12MHz zulässig.

> LP 3,125 MHz

???

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@p. kowalski

wo hast du das folienkabel und den stecker her ?
hättest du noch evtl. einen satz übrig ? habe mir auch so ein schickes 
display (finds echt schick, vor allem so flach :-))) gekauft und wills 
natürlich ankorken, allerdings denke ich ist die beschaffung des 
folienkabels und des steckers nicht gerade einfach :-((

gruß
rene

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.