Forum: FPGA, VHDL & Co. Sprite soll nur nach Tastendruck wandern..


von peter (Gast)


Lesenswert?

Hallo, guten Tag.
Ich habe hier ein Sprite(Viereck) auf den VGA-Monitor welches ich von 
der Ps2-Tastatur mit den Tasten Up/Down/Left/Right  steuere/verschiebe.

Wenn ich die Taste drücke wandert das Sprite, auch wenn ich die Taste 
loslasse, erst mit einer fremdem Taste stopp es. Ist eine Variante.

Wo muss jetzt etwas geändert werden damit das Sprite sofort stoppt wenn 
ich die bestimmte Taste loslasse?

Ab der gestrichelten Linie ist der Steuerbereich.

Danke.
GRuss
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.ALL;
4
5
entity vga_viereck_ps2 is
6
port(
7
  clk50_in  : in std_logic;
8
  hs_out    : out std_logic;
9
  vs_out    : out std_logic;
10
  
11
  ps2_clk   : in std_logic;
12
  ps2_data  : in std_logic;
13
  
14
  red_out   : OUT STD_LOGIC_VECTOR(3 downto 0);
15
  green_out : OUT STD_LOGIC_VECTOR(3 downto 0);
16
  blue_out  : OUT STD_LOGIC_VECTOR(3 downto 0)
17
  ); 
18
end vga_viereck_ps2;
19
20
architecture behavioral of vga_viereck_ps2 is
21
22
signal clk25    : std_logic:='0';
23
signal hcounter : integer := 0;
24
signal vcounter : integer := 0;
25
signal links_neu : integer := 100;
26
signal rechts_neu : integer := 120;
27
signal oben_neu : integer := 100;
28
signal unten_neu : integer := 120;
29
signal links : integer := 0;
30
signal rechts : integer := 0;
31
signal oben : integer := 0;
32
signal unten : integer := 0;
33
signal c : integer range 0 to 500000 := 0; 
34
signal red   : STD_LOGIC_VECTOR(3 downto 0);
35
signal green : STD_LOGIC_VECTOR(3 downto 0);
36
signal blue  : STD_LOGIC_VECTOR(3 downto 0);
37
38
signal ps2_clk_int: std_logic;
39
signal ps2_data_int: std_logic;
40
  
41
signal ps2_clk_falling_edge: std_logic;
42
signal last_ps2_clk: std_logic;
43
  
44
signal started: std_logic;
45
46
signal count    : integer range 0 to 10:=0;
47
signal data     : std_logic_vector(9 downto 0);
48
signal vga_data  :  STD_LOGIC_VECTOR(7 downto 0);
49
50
begin
51
52
process (clk50_in)               
53
begin
54
if rising_edge(clk50_in) then
55
  if vga_Data ="00000101" then  
56
    red<="1111";
57
    green<="0000";
58
    blue<="0000";
59
  end if;
60
  if vga_Data ="00000110" then 
61
    red<="0000";
62
    green<="1111";
63
    blue<="0000";
64
  end if;
65
  if vga_Data ="00000100" then 
66
    red<="0000";
67
    green<="0000";
68
    blue<="1111";
69
  end if;
70
end if;  
71
end process;  
72
73
process (clk50_in)               
74
begin
75
  if rising_edge(clk50_in) then
76
    if (clk25 = '0') then
77
      clk25 <= '1';
78
    else
79
      clk25 <= '0';
80
    end if;
81
  end if;
82
end process;
83
-----------------------------------------------------
84
process(clk50_in)
85
begin  
86
  if rising_edge(clk50_in) then
87
    if (c<200000) then       
88
      c <= c+1;                
89
    else    
90
      if vga_Data ="01110100" then -- rechts
91
        rechts_neu <= rechts_neu+1;
92
        links_neu <= links_neu+1;
93
        if rechts_neu = 640 then
94
          rechts_neu <=640;
95
          links_neu <=620;
96
        end if;  
97
      end if;
98
      if vga_Data ="01101011" then -- links
99
        rechts_neu <= rechts_neu-1;
100
        links_neu <= links_neu-1;
101
        if links_neu = 0 then
102
          rechts_neu <=20;
103
          links_neu <=0;
104
        end if;  
105
      end if;
106
      if vga_Data ="01110010" then -- unten
107
        unten_neu <= unten_neu+1;
108
        oben_neu <= oben_neu+1;
109
        if unten_neu = 480 then
110
          unten_neu <=480;
111
          oben_neu <=460;
112
        end if;  
113
      end if;
114
      if vga_Data ="01110101" then -- oben
115
        unten_neu <= unten_neu-1;
116
        oben_neu <= oben_neu-1;
117
        if oben_neu = 0 then
118
          unten_neu <=20;
119
          oben_neu <=0;
120
        end if;
121
      end if;
122
      
123
      c <= 0;  
124
    end if;  
125
  end if;
126
end process;  
127
------------------------------------------------------------
128
process (clk50_in)
129
begin
130
if rising_edge(clk50_in) then
131
  if clk25 = '1' then
132
    if (hcounter >= links) and (hcounter < rechts) and (vcounter >= oben) and (vcounter < unten) then 
133
       red_out<= red;
134
       green_out<=green;
135
       blue_out<=blue;
136
     else
137
       red_out<="0000";
138
       green_out<="0000";
139
       blue_out<="0000";
140
   end if;
141
  end if;
142
end if;  
143
end process;
144
145
process (clk50_in)
146
begin
147
if rising_edge(clk50_in) then 
148
  if clk25 = '1' then
149
    if hcounter >= (639+16) and hcounter <= (639+16+96) then
150
      hs_out <= '0';
151
    else
152
      hs_out <= '1';
153
    end if;
154
  
155
    if vcounter >= (479+10) and vcounter <= (479+10+2) then
156
      vs_out <= '0';
157
     else
158
      vs_out <= '1';
159
    end if;
160
  
161
--- horizontal counts from 0 to 799
162
    hcounter <= hcounter+1;
163
  
164
    if hcounter = 799 then
165
      vcounter <= vcounter+1;
166
      hcounter <= 0;
167
    end if;
168
  
169
--- vertical counts from 0 to 524
170
    if vcounter = 524 then 
171
      rechts <= rechts_neu;
172
      links <= links_neu;
173
      oben <= oben_neu;
174
      unten <= unten_neu;
175
      vcounter <= 0;
176
    end if;
177
  end if;
178
end if;  
179
end process;
180
181
process(clk50_in)
182
  begin
183
    if rising_edge(clk50_in) then
184
      ps2_clk_int <= ps2_clk;
185
      ps2_data_int <= ps2_data;
186
    end if;
187
end process;
188
  
189
process(clk50_in)
190
  begin
191
    if rising_edge(clk50_in) then
192
      last_ps2_clk <= ps2_clk_int;
193
      
194
      if last_ps2_clk = '1' and ps2_clk_int = '0' then
195
        ps2_clk_falling_edge <= '1';
196
      else
197
        ps2_clk_falling_edge <= '0';
198
      end if;
199
    end if;
200
end process;
201
  
202
process(clk50_in)
203
  begin
204
    if rising_edge(clk50_in) then
205
      if ps2_clk_falling_edge = '1' and ps2_data_int = '0' then 
206
        started <= '1';
207
      end if;
208
      
209
      if count = 10 then
210
        started <= '0';
211
      end if;
212
    end if;
213
end process;
214
            
215
process(clk50_in)
216
  begin
217
    if rising_edge(clk50_in) then
218
      if ps2_clk_falling_edge = '1' and started = '1' then
219
        count <= count + 1;
220
        data <= ps2_data_int & data(9 downto 1);
221
      end if;
222
      
223
      if count = 10 then
224
        count <= 0;
225
      end if;
226
    end if;
227
end process;
228
  
229
process(clk50_in)
230
  begin
231
    if rising_edge(clk50_in) then    
232
      if count = 10 and data(9) = '1'   then  
233
        vga_data <= data(7 downto 0);
234
      end if;
235
    end if;
236
end process;
237
238
end behavioral;

von PittyJ (Gast)


Lesenswert?

Ist ja alles super kommentiert. Die Prozesse haben einen Namen, der 
aussagt, was sie tun. Und zum Glück gibt es auch keine Signale die data 
heissen, sondern nur aussagekräftige Namen. (Data gibt es nur auf der 
Enterprise)

Also: ich blicke bei deinem Code nicht durch, das könnte alles besser 
beschrieben sein.
Gibt es dazu einen Testbench? Was sagt die Simulation?

von Sabine W. (sabine_w)


Lesenswert?

Wenn eine Taste losgelassen wird, wird als Break-Code eine 
Zwei-Byte-Folge gesendet, 0xF0 und dann nochmal der Scancode der Taste. 
Eine Tastatur sendet mit der Scancodepage 2, in PCs wird da aber gleich 
intern Codepage 1 daraus gemacht (liegt in der Historie der PCs 
begründet, die Umwandlung dient dazu, dass Programme, die eine 
XT-Tastatur erwarten, auch mit einer AT-Tastatur funktionieren, obwohl 
abschaltbar, wurde da nie was dann geändert), da ist der Breakcode dann 
der Make-Code mit gesetztem obersten Bit. Da du mit deinem FPGA die 
Tastatur ja direkt siehst, wirst du dieses 0xF0 irgendwie 
berücksichtigen müssen, um zwischen dem Drücken einer Taste und ihrem 
Loslassen unterscheiden zu können.

von Jo S. (scherzkeks)


Lesenswert?

peter schrieb:
> if rising_edge(clk50_in) then
>     if (clk25 = '0') then
>       clk25 <= '1';
>     else
>       clk25 <= '0';
>     end if;

Falls das ein Takteiler sein soll kann man das auch besser schreiben.

if rising_edge(clk50_in) then
     clk25 <= not clk25;
end if;

von peter (Gast)


Lesenswert?

Jup danke für die Hinweise.

Gruss

von Lattice User (Gast)


Lesenswert?

Bevor du weitermachst, solltest du lernen wie man das Design in Module 
aufteilt. Es ist bereits jetzt sehr unübersichtlich.

von klausro (Gast)


Lesenswert?

peter schrieb:
> process(clk50_in)
>   begin
>     if rising_edge(clk50_in) then
>       if ps2_clk_falling_edge = '1' and ps2_data_int = '0' then
>         started <= '1';
>       end if;
>
>       if count = 10 then
>         started <= '0';
>       end if;
>     end if;
> end process;
>

Also, ich bin jetzt weder VHDL noch ein PS2 Guru, aber es sieht so aus, 
dass du nur "gedrückte" Tasten detektierst (Make Code), und nicht das 
loslassen (den Break-Code), da du nur auf ps2_data_int = 0 prüfst. IMHO 
ist beim Break-Code das erste Bit gesetzt, oder?

von peter (Gast)


Lesenswert?

JUp, nur die gedrückte Taste wird berücksichtigt.

Gruss

von klausro (Gast)


Lesenswert?

peter schrieb:
> JUp, nur die gedrückte Taste wird berücksichtigt.

Jetzt denk doch mal nach: Wenn das Sprite beim loslassen der Taste 
stehen bleiben soll, dann musst du in deinem VHDL Code das loslassen 
erkennen und dein vga_Data (da steht doch der Tastencode drin?) löschen. 
Solange in vga_Data ein sinnvoller Tastencode steht, wird dein Sprite 
verschoben.

von peter (Gast)


Lesenswert?

klausro (Gast):
Jetzt denk doch mal nach: Wenn das Sprite beim loslassen der Taste
stehen bleiben soll, dann musst du in deinem VHDL Code das loslassen
erkennen und dein vga_Data (da steht doch der Tastencode drin?) löschen.


Das ist das Problem, es kommt bei einem Tastendruck "A" =  1C F0 1C
3 Code. Und da weiß ich noch nicht, wie ich die abfangen kann.

WEnn ich als 2.tes F0 abfange, kommt das 3.te hinterher und löst das 
laufen Sprite wieder aus.

GRuss

von lulu (Gast)


Lesenswert?

Für so etwas benutzt man gerne eine State Machine (FSM)

von peter (Gast)


Lesenswert?

Hallo, erklär mal bitte für mein Problem diese FSM? Vielleicht mit Code?

Danke.

von Sabine W. (sabine_w)


Lesenswert?

Du könntest doch einfach noch auf 0xF0 testen und ein Signal setzen, 
wenn dann der Tastencode beim Loslassen nochmal gesendet wird, kannst du 
mit diesem Signal unterscheiden, ob die Taste nun gedrückt oder 
losgelassen wurde. (Warum nennst du denn das für die Taste vga_data? Das 
ist verwirrend, es geht ja um den Tastenwert, key_data oder ähnliches 
wäre klarer.)
1
   if vga_Data = "11110000" then -- 0xF0
2
        key_released <= '1';
3
   end if;
4
....
5
  if count = 10 and data(9) = '1'   then        
6
        if key_released = '1' then
7
            vga_data <= "00000000";
8
            key_released <= '0';
9
        else 
10
            vga_data <= data(7 downto 0);
11
        end if;
12
  end if;

: Bearbeitet durch User
von peter (Gast)


Lesenswert?

Jup, danke.

vga_data, weil ich damit das sprite auf dem  vga_monitor ansteuere.

Danke.
Gruss

von peter (Gast)


Lesenswert?

Hmm...was ist das für eine Meldung?
---------------------------------
Error (10028): Can't resolve multiple constant drivers for net 
"key_released" at vga_viereck_ps2.vhd(245)
Error (10029): Constant driver at vga_viereck_ps2.vhd(92)
Error (12153): Can't elaborate top-level user hierarchy
-------------------------------------------

Wenn ich dieses oben mit reinsetze als Abfrage:
 if vga_Data = "11110000" then -- 0xF0
    key_released <= '1';
  end if;
kommt die obige Fehlermeldung und das ist mein Problem, weil ich so eine 
Abfrsage nicht hinbekomme.
Die Zuweisung am Ende wird nicht reklamiert.

Danke.
GRuss
1
signal key_released : std_logic;
2
...............
3
...............
4
process(clk50_in)
5
begin  
6
  if rising_edge(clk50_in) then
7
    if (c<200000) then       
8
      c <= c+1;                
9
    else  
10
    
11
      if vga_Data = "11110000" then -- 0xF0
12
        key_released <= '1';
13
      end if;
14
      
15
      if vga_Data ="01110100" then -- rechts
16
        rechts_neu <= rechts_neu+add_sub;
17
        links_neu <= links_neu+add_sub;
18
        if rechts_neu = 640 then
19
          rechts_neu <=640;
20
          links_neu <=620;
21
        end if;  
22
      end if;
23
      ..................
24
      ................
25
      process(clk50_in)
26
  begin
27
    if rising_edge(clk50_in) then    
28
      if key_released = '1' then
29
         vga_data <= "00000000";
30
         key_released <= '0';
31
      else 
32
         vga_data <= data(7 downto 0);
33
      end if;
34
    end if;
35
end process;

von peter (Gast)


Lesenswert?

Mal den ganzen Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.ALL;
4
5
entity vga_viereck_ps2 is
6
port(
7
  clk50_in  : in std_logic;
8
  hs_out    : out std_logic;
9
  vs_out    : out std_logic;
10
  
11
  ps2_clk   : in std_logic;
12
  ps2_data  : in std_logic;
13
  
14
  led_g     : OUT STD_LOGIC_VECTOR(7 downto 0);
15
  
16
  red_out   : OUT STD_LOGIC_VECTOR(3 downto 0);
17
  green_out : OUT STD_LOGIC_VECTOR(3 downto 0);
18
  blue_out  : OUT STD_LOGIC_VECTOR(3 downto 0)
19
  ); 
20
end vga_viereck_ps2;
21
22
architecture behavioral of vga_viereck_ps2 is
23
24
signal clk25    : std_logic:='0';
25
signal hcounter : integer range 0 to 1000 := 0;
26
signal vcounter : integer range 0 to 1000 := 0;
27
signal links_neu : integer range 0 to 1000 := 100;
28
signal rechts_neu : integer range 0 to 1000 := 120;
29
signal oben_neu : integer range 0 to 1000 := 100;
30
signal unten_neu : integer range 0 to 1000 := 120;
31
signal links : integer range 0 to 1000 := 0;
32
signal rechts : integer range 0 to 1000 := 0;
33
signal oben : integer range 0 to 1000 := 0;
34
signal unten : integer range 0 to 1000 := 0;
35
signal add_sub : integer range 0 to 100 := 1;
36
signal c : integer range 0 to 500000 := 0; 
37
signal red   : STD_LOGIC_VECTOR(3 downto 0);
38
signal green : STD_LOGIC_VECTOR(3 downto 0);
39
signal blue  : STD_LOGIC_VECTOR(3 downto 0);
40
41
signal ps2_clk_int: std_logic;
42
signal ps2_data_int: std_logic;
43
  
44
signal ps2_clk_falling_edge: std_logic;
45
signal last_ps2_clk: std_logic;
46
  
47
signal started: std_logic;
48
49
signal count    : integer range 0 to 10:=0;
50
signal data     : std_logic_vector(9 downto 0);
51
signal vga_data  :  STD_LOGIC_VECTOR(7 downto 0);
52
signal key_released : std_logic;------------------------------------ für die Abfrage
53
54
begin
55
56
process (clk50_in)               
57
begin
58
if rising_edge(clk50_in) then
59
  if vga_Data ="00000101" then  
60
    red<="1111";
61
    green<="0000";
62
    blue<="0000";
63
  end if;
64
  
65
  if vga_Data ="00000110" then 
66
    red<="0000";
67
    green<="1111";
68
    blue<="0000";
69
  end if;
70
  
71
  if vga_Data ="00000100" then 
72
    red<="0000";
73
    green<="0000";
74
    blue<="1111";
75
  end if;
76
end if;  
77
end process;  
78
79
process (clk50_in)               
80
begin
81
  if rising_edge(clk50_in) then
82
    if (clk25 = '0') then
83
      clk25 <= '1';
84
    else
85
      clk25 <= '0';
86
    end if;
87
  end if;
88
end process;
89
90
process(clk50_in)
91
begin  
92
  if rising_edge(clk50_in) then
93
    if (c<200000) then       
94
      c <= c+1;                
95
    else  
96
----------------------------------------------------    
97
      if vga_Data = "11110000" then -- 0xF0
98
        key_released <= '1';                       ----- neu reingesetzt, wir als Fehler rausgeschmissen
99
      end if;
100
------------------------------------------------------    
101
      if vga_Data ="01110100" then -- rechts
102
        rechts_neu <= rechts_neu+add_sub;
103
        links_neu <= links_neu+add_sub;
104
        if rechts_neu = 640 then
105
          rechts_neu <=640;
106
          links_neu <=620;
107
        end if;  
108
      end if;
109
      
110
      if vga_Data ="01101011" then -- links
111
        rechts_neu <= rechts_neu-add_sub;
112
        links_neu <= links_neu-add_sub;
113
        if links_neu = 0 then
114
          rechts_neu <=20;
115
          links_neu <=0;
116
        end if;  
117
      end if;
118
      
119
      if vga_Data ="01110010" then -- unten
120
        unten_neu <= unten_neu+add_sub;
121
        oben_neu <= oben_neu+add_sub;
122
        if unten_neu = 480 then
123
          unten_neu <=480;
124
          oben_neu <=460;
125
        end if;  
126
      end if;
127
      
128
      if vga_Data ="01110101" then -- oben
129
        unten_neu <= unten_neu-add_sub;
130
        oben_neu <= oben_neu-add_sub;
131
        if oben_neu = 0 then
132
          unten_neu <=20;
133
          oben_neu <=0;
134
        end if;
135
      end if;
136
      
137
      c <= 0;  
138
    end if;  
139
  end if;
140
end process;  
141
142
process (clk50_in)
143
begin
144
if rising_edge(clk50_in) then
145
  if clk25 = '1' then
146
    if (hcounter >= links) and (hcounter < rechts) and (vcounter >= oben) and (vcounter < unten) then 
147
       red_out<= red;
148
       green_out<=green;
149
       blue_out<=blue;
150
     else
151
       red_out<="0000";
152
       green_out<="0000";
153
       blue_out<="0000";
154
   end if;
155
  end if;
156
end if;  
157
end process;
158
159
process (clk50_in)
160
begin
161
if rising_edge(clk50_in) then 
162
  if clk25 = '1' then
163
    if hcounter >= (639+16) and hcounter <= (639+16+96) then
164
      hs_out <= '0';
165
    else
166
      hs_out <= '1';
167
    end if;
168
  
169
    if vcounter >= (479+10) and vcounter <= (479+10+2) then
170
      vs_out <= '0';
171
     else
172
      vs_out <= '1';
173
    end if;
174
  
175
--- horizontal counts from 0 to 799
176
    hcounter <= hcounter+1;
177
  
178
    if hcounter = 799 then
179
      vcounter <= vcounter+1;
180
      hcounter <= 0;
181
    end if;
182
  
183
--- vertical counts from 0 to 524
184
    if vcounter = 524 then 
185
      rechts <= rechts_neu;
186
      links <= links_neu;
187
      oben <= oben_neu;
188
      unten <= unten_neu;
189
      vcounter <= 0;
190
    end if;
191
  end if;
192
end if;  
193
end process;
194
195
process(clk50_in)
196
  begin
197
    if rising_edge(clk50_in) then
198
      ps2_clk_int <= ps2_clk;
199
      ps2_data_int <= ps2_data;
200
    end if;
201
end process;
202
  
203
process(clk50_in)
204
  begin
205
    if rising_edge(clk50_in) then
206
      last_ps2_clk <= ps2_clk_int;
207
      
208
      if last_ps2_clk = '1' and ps2_clk_int = '0' then
209
        ps2_clk_falling_edge <= '1';
210
      else
211
        ps2_clk_falling_edge <= '0';
212
      end if;
213
    end if;
214
end process;
215
  
216
process(clk50_in)
217
  begin
218
    if rising_edge(clk50_in) then
219
      if ps2_clk_falling_edge = '1' and ps2_data_int = '0' then 
220
        started <= '1';
221
      end if;
222
      
223
      if count = 10 then
224
        started <= '0';
225
      end if;
226
    end if;
227
end process;
228
            
229
process(clk50_in)
230
  begin
231
    if rising_edge(clk50_in) then
232
      if ps2_clk_falling_edge = '1' and started = '1' then
233
        count <= count + 1;
234
        data <= ps2_data_int & data(9 downto 1);
235
      end if;
236
      
237
      if count = 10 then
238
        count <= 0;
239
      end if;
240
    end if;
241
end process;
242
  
243
process(clk50_in)
244
  begin
245
    if rising_edge(clk50_in) then    
246
      if key_released = '1' then     ---------------------------------------------
247
         vga_data <= "00000000";     ---- dieses wird anerkannt.
248
         key_released <= '0';         ---------------------------------------------
249
       else 
250
         vga_data <= data(7 downto 0);
251
         led_g <= data(7 downto 0);
252
       end if;
253
    end if;
254
end process;
255
256
end behavioral;

von lulu (Gast)


Lesenswert?

du schreibst von zwei Prozessen auf das "key_released" Signal. Das ist, 
wenn man es diskret aufbaut, ein Kurzschluss. Deswegen kann der 
Synthesizer das auch nicht lösen.



Zum Thema FSM, ich habe das PS2 Protkoll nicht genau im Kopf, deswegen 
orintiere ich mich an diese Aussage:
>> "A" =  1C F0 1C

Du hast neben IDLE noch zwei States, wo du diese Kombination 
detektierst:
IDLE State:
- Habe ich ein F0 (Break) empfangen, dann ist der nächste State 
STATE_BREAK
- Habe ich ein "A" (1C) Zeichen bekommen, dann ist dies der Make-Code 
für das Zeichen -> gedrückte Taste

STATE_BREAK:
- Habe ich ich das nächste Zeichen erhalten (das ist das zugehörige 
Zeichen für den Break-Code) -> losgelassene Taste, nächster State ist 
wieder IDLE


So in etwa würde das in Worten aussehen. Wie du das genau umsetzt ist 
aus deinem VHDL Buch zu entnehmen.

Grüße

von peter (Gast)


Lesenswert?

JUp danke.

Gruss

von Duke Scarring (Gast)


Lesenswert?

Wie Du vielleicht schon gemerkt hast, hat ein Signal eine Quelle, aber 
u.U. mehrere Senken.
Daher bennene ich die Signale zu 99,9% nach der Quelle, da bleibt es 
übersichtlich.

peter schrieb:
> vga_data, weil ich damit das sprite auf dem  vga_monitor ansteuere

Oder wie würdest Du Dein vga_data benennen, wenn es zusätzlich noch zu 
einer LED geht und in einem Debug-Modul genutzt wird?

Duke

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.