Sharp LM038QB1R10 - Xilinx Spartan-3 -VHDL

OP #886620
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;
Angehängte Dateien:
Gast #886902
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.
#887004
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.
#889452
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

???
Gast #894720
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren