Forum: FPGA, VHDL & Co. Problem bei LCD Ansteuerung


von Markus M. (kexxs)


Lesenswert?

Ich muss für ein Schulprojekt einen LCD Display ansteuern. In meinen 
Projekt lese ich von einer Kamera Signale ein, bearbeite sie am FPGA 
Board und gebe sie auf einem Monitor aus.

Hitachi Display:

http://docs-europe.electrocomponents.com/webdocs/07b3/0900766b807b37fb.pdf

Am Anfang versuchte ich es auf einen herkömmlichen VGA Monitor, das hab 
ich zusammengebracht, ich veränderte die Ansteuerung damit es den LCD 
gerecht wird. Danach traten die Probleme auf. Also muss das Problem 
direkt bei der LCD Ansteuerung liegen, und nicht bei der Initialisierung 
der Kamera.

Ich schaffe es ein Bild auszugeben, jedoch friert das Bild ein(es zeigt 
nur den ersten Frame der von der Kamera aufgenommen wurde an), danach 
wird der Display immer mehr weiß, bis das Ursprungsbild nicht mehr zu 
erkennen ist, und nur noch ein weißes Bild zu sehen ist.

Wenn ich einen Software Reset auslöse, ist wieder der erste Frame, der 
von der Kamera nach dem Reset ausgenommen wurde zu sehen, und das Bild 
beginnt wieder Weiß zu werden.

Ich bin schon leicht verzweifelt weil ich schon das Meiste ausprobiert 
habe, jedoch ist mir noch unklar, welchen genauen Zweck das Signal PCI 
hat. Vielleicht liegt es auch an den horizontal Sync und vertical Sync.

Hier mein Programm für Displayansteuerung, die Kamerasignal wurden für 
Testzwecke durch fixe Signal ersetzt.

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
entity Displayausgabe is
7
port(
8
    clk  : in std_logic;
9
     enable : in std_logic;
10
     data6_in : in std_logic_vector(5 downto 0);
11
     data6_in_sram : in std_logic_vector(5 downto 0);
12
       red_out1   : out std_logic;
13
     red_out2   : out std_logic;
14
     red_out3   : out std_logic;
15
     red_out4   : out std_logic;
16
     red_out5   : out std_logic;
17
     red_out0   : out std_logic;
18
       green_out1 : out std_logic;
19
     green_out2 : out std_logic;
20
     green_out3 : out std_logic;
21
     green_out4 : out std_logic;
22
     green_out5 : out std_logic;
23
     green_out0 : out std_logic;
24
       blue_out1  : out std_logic;
25
     blue_out2  : out std_logic;
26
     blue_out3  : out std_logic;
27
     blue_out4  : out std_logic;
28
     blue_out5  : out std_logic;
29
     blue_out0  : out std_logic;
30
     pci : out std_logic;
31
     vctrl : out std_logic;
32
     dtmg : out std_logic;
33
     hc_signal : out std_logic_vector(8 downto 0);
34
     vc_signal : out std_logic_vector(8 downto 0);
35
     hs_out    : out std_logic
36
);
37
38
end Displayausgabe;
39
40
architecture Behavioral of Displayausgabe is
41
42
signal horizontal_counter : std_logic_vector (8 downto 0);
43
signal vertical_counter : std_logic_vector (8 downto 0);
44
signal clkcount : std_logic_vector (3 downto 0);
45
signal clkdiv8 : std_logic;
46
signal Linelength : std_logic_vector(8 downto 0);
47
signal Columlength : std_logic_vector(8 downto 0); 
48
signal Counter : std_logic_vector(18 downto 0); 
49
50
begin
51
52
process(clk)
53
54
begin
55
56
if rising_edge(clk) then
57
58
59
  if (enable = '1' and vertical_counter = "0000000000")  then
60
  
61
  vctrl <= '0'; 
62
  dtmg <= '0';
63
  hs_out <= '0';
64
65
  horizontal_counter <= "000000000";
66
  
67
  
68
69
  else 
70
71
  vctrl <= '1'; 
72
  Linelength <= "010110001" ; --177
73
  Columlength <= "010010000"; --144
74
    
75
  horizontal_counter <= horizontal_counter+"0000000001";
76
   
77
    if (horizontal_counter="100010001") then --273
78
    horizontal_counter <= "000000000";
79
    vertical_counter <= vertical_counter + '1';
80
    end if;
81
   
82
    if vertical_counter = "101000111" then -- 327 
83
    vertical_counter <= "000000000";
84
   
85
    pci <= '0' ;
86
    horizontal_counter <= "000000000";
87
    end if;
88
    
89
    
90
    
91
    
92
    if (horizontal_counter > "000000000" )
93
      and (horizontal_counter < "11111100" ) -- 252
94
    then
95
      hs_out <= '1';
96
    else
97
    hs_out <= '0';
98
    end if;
99
100
  
101
  vc_signal <= vertical_counter;
102
    
103
    if (horizontal_counter > "000000001" )and (horizontal_counter < "011110011" )    then-- zwichen 1 und 243 sing genau 240 
104
 
105
      dtmg <= '1';
106
    pci <= '1';
107
    hc_signal <= horizontal_counter - "000000001";  -- dient zum Ansteuern des Dualport ram für diese 
108
    
109
    else
110
      dtmg <= '0';
111
    pci <= '0';
112
    
113
    hc_signal <= "000000000";
114
    end if;
115
116
117
    green_out5 <= '0'; -- MSB
118
    green_out4 <= '0';
119
    green_out3 <= '0';
120
    green_out2 <= '0';
121
    green_out1 <= '0';
122
    green_out0 <= '0';
123
  
124
    blue_out5 <= '0'; -- MSB
125
    blue_out4 <= '0';
126
    blue_out3 <= '0';
127
    blue_out2 <= '0';
128
    blue_out1 <= '0';
129
    blue_out0 <= '0';
130
  
131
    red_out5 <= '1'; --MSB
132
    red_out4 <= '0';
133
    red_out3 <= '1';
134
    red_out2 <= '0';
135
    red_out1 <= '1';
136
    red_out0 <= '0';
137
    
138
        end if;
139
  end if;
140
end process;
141
end Behavioral;


Hoffe auf baldige Antworten.

Mit freundlichen Grüßen Kexxs

von Roger S. (edge)


Angehängte Dateien:

Lesenswert?

Markus Mühlbacher wrote:
> Ich schaffe es ein Bild auszugeben, jedoch friert das Bild ein(es zeigt
> nur den ersten Frame der von der Kamera aufgenommen wurde an), danach
> wird der Display immer mehr weiß, bis das Ursprungsbild nicht mehr zu
> erkennen ist, und nur noch ein weißes Bild zu sehen ist.

Deine DTMG generierung ist nicht ganz richtig, du musst waehrend der 
vblank time DTMG deaktivieren, sonst kann das LCD den vsync nicht 
zurueckgewinnen.

> Hier mein Programm für Displayansteuerung, die Kamerasignal wurden für
> Testzwecke durch fixe Signal ersetzt.

warum nimmst du fuer die RGB daten keine vektoren?

Falls du lust hast, ich hab einen test timing generator angehaengt, 
allerdings fuer ein kleineres Hitachi Display, du musst nur die Werte 
vom Datenblatt uebernehmen und den clock divider auf SYSCLK/PIXELCLK 
setzen.

Cheers, Roger

von Markus M. (kexxs)


Lesenswert?

Danke Roger war wirklich das Problem, mit DTMG und VSYNC, wäre schon 
fast verzweifelt^^

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.