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


von P. K. (yelli)


Angehängte Dateien:

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
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity displayansteuerung is
12
    port( d : out std_logic_vector(3 downto 0);
13
         yd : out std_logic ;
14
       m  : out std_logic;
15
       lp : out std_logic;
16
       disp : out std_logic;
17
       start : in std_logic;
18
       reset : in std_logic;
19
       xck : out std_logic; -- 3,125 MHz Takt
20
       clk : in std_logic);-- 50 MHz Takt
21
22
   
23
end displayansteuerung;
24
25
architecture Behavioral of displayansteuerung is
26
signal xck_intern :  std_logic_vector(3 downto 0); -- 3,125 MHz Takt
27
signal x_i : integer range 0 to 127;
28
signal y_i : integer range 0 to 255;
29
signal x :  std_logic_vector(6 downto 0);
30
signal y :  std_logic_vector(7 downto 0);
31
signal m_intern : std_logic ;
32
signal verri : std_logic ;
33
 
34
begin
35
36
disp <= '1';
37
38
process(clk)
39
begin
40
   if(rising_edge(clk)) then
41
    if(reset = '1') then
42
      xck_intern <= "0000";
43
    else
44
      xck_intern <= xck_intern + "0001"; -- generieren einen 3,125 MHz Takt
45
    end if;   
46
  end if;
47
end process;
48
  
49
50
process(xck_intern(3))
51
 
52
begin
53
   if (falling_edge(xck_intern(3))) then
54
    
55
    if (start = '1') then
56
      x <= "0000000";
57
      y <= "00000000"; 
58
      verri <= '1';
59
      m_intern <= '0';
60
      
61
    else
62
      if(verri = '1') then
63
     
64
          if (x < "1001111")  then  -- if-Schleife f¨¹r Einlesen einer Zeile, 79 Einheiten 
65
             x <= x + "0000001";
66
            lp <= '0';
67
        else 
68
              lp <= '1';
69
           x <= "0000000"; -- wenn x 80 ist, wird er zurueckgesetzt
70
           if (y < "11110011") then  -- Z zaehlt bis 243
71
             if ((y = "00001100") and (x = "1001111")) then -- m_intern wird invertiert nach 13. Zeile ;
72
                   m_intern <= (not m_intern);
73
                 else
74
                   m_intern <= m_intern;
75
                 end if; 
76
             y <= y + "00000001";  
77
           else
78
            y <= "00000000"; 
79
            end if;   
80
           end if;
81
        end if;         
82
    end if;
83
   end if;
84
       
85
end process;  
86
87
xck <= xck_intern(3);
88
89
m <= m_intern;
90
91
yd <= '1' when (y = "00000001")  else -- signalisieren YD nach der 1. Zeile 
92
      '0';
93
    
94
x_i <= conv_integer(x);
95
y_i <= conv_integer(y);
96
97
98
d <= "0000"  when ((x_i <= 4)and (y_i <= 39))   else -- dunkler Rechteck, 20 * 40, oben-links
99
            "1111"; 
100
 
101
102
103
end Behavioral;

von TheMason (Gast)


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.

von Thomas H. (mac4ever)


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

von Benedikt K. (benedikt)


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.

von Jens (Gast)


Lesenswert?

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

von Benedikt K. (benedikt)


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.

von P. K. (yelli)


Angehängte Dateien:

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

von Benedikt K. (benedikt)


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

???

von TheMason (Gast)


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

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.