Forum: FPGA, VHDL & Co. VHDL- Suche Lösungshilfe für eine Problemstellung


von M. T. (yohojoe)


Lesenswert?

So hallo zusammen,

Der Code unten gehört zu einem Projekt dass so gut wie fertig ist. Das 
ganze Projekt umfasst ein Spiel in dem man mithilfe eines Gamepad's eine 
Spielfigur durch einen Hindernisparkour hindurch manövrieren muss. Das 
ganze geschieht mithilfe eines FPGA-Boards und über eine VGA-Ausgabe.

Das einzige das noch Probleme macht ist eine Kollisionsbeschreibung. Die 
Spielfigur soll nämlich nach der Kollision mit einem Hindernis auf den 
Start reseted werden.

Eine Möglichkeit wäre, es mithilfe der Koordinaten aller Hindernisse zu 
machen, falls bereiche der Spielfigur sich auf diesen Koordinaten 
befinden einen reset durchzuführen.


Allerdings wäre es viel weniger Aufwand das ganze an den Farben 
festzumachen.

Hintergrund = weiß
Hindernisse = schwarz
Spielfigur  = blau


Und zwar ist es so gedacht dass der linke obere Pixel der Figur 
beweglich ist und der Rest des Quadrats immer konstant zur jeweiligen 
Position "aufgespannt" wird.

Zur Lösung der Kollision mithilfe einer Farbabfrage sollen zusätzlich 
alle Pixel die das Quadrat unmittelbar berühren abgefragt werden ob 
dessen farbe Weiß (=kein reset) oder schwarz (=reset) ist.

Das Problem ist aber dass ich noch keine Ahnung habe wie ich das 
Anstellen soll...

Es fehlt lediglich nur noch die Abfrage der Farbe der "Randpixel". 
Verbindungen in ein reset-modul sind schon vorhanden. Im code unter 
--Kollision-- sind die jetzigen Bemühungen zu sehen, die aber mehr oder 
weniger mist sind.

Kann mir da jemand vielleicht helfen? Ich wäre euch sehr dankbar

MfG
1
----------------------------------------------------------------------------------
2
-- Company:     
3
-- Engineer:     
4
-- 
5
-- Create Date:    12:20:00 03/25/2013 
6
-- Design Name: 
7
-- Module Name:    Farbansteuerung - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_ARITH.ALL;
23
use IEEE.STD_LOGIC_UNSIGNED.ALL;
24
25
26
entity Farbansteuerung is 
27
28
  PORT  (  
29
      REDout           : OUT std_logic_vector (2 DOWNTO 0);
30
      BLUEout           : OUT std_logic_vector (2 DOWNTO 0);
31
      GREENout         : OUT std_logic_vector (2 DOWNTO 0); 
32
      vz_inoutin        : IN std_logic_vector (9 downto 0);
33
      hz_inoutin        : IN std_logic_vector (9 downto 0);
34
      clk25in          : IN std_logic;
35
      reset_freigabe_in   : IN std_logic;
36
      kollision_out      : OUT std_logic;
37
      bewegung_oben_in     : IN std_logic_vector(9 downto 0);
38
       bewegung_unten_in   : IN std_logic_vector(9 downto 0);
39
       bewegung_rechts_in   : IN std_logic_vector(9 downto 0);
40
       bewegung_links_in   : IN std_logic_vector(9 downto 0)
41
      --mauer_reset_out     : OUT std_logic_vector (9 downto 0)
42
      );
43
      
44
end Farbansteuerung;
45
46
architecture Behavioral of Farbansteuerung is
47
48
--signal mauer_reset: std_logic_vector (9 DOWNTO 0);
49
50
signal kollision: std_logic := '0';
51
52
begin 
53
54
process(clk25in,reset_freigabe_in)  
55
56
57
variable schwarz: std_logic_vector(1 downto 0) := "00";
58
variable spielfigur_x : std_logic_vector(9 downto 0) := "0010001110"; -- + bewegung_rechts_in - bewegung_links_in;
59
variable spielfigur_y : std_logic_vector(9 downto 0) := "0111101111"; -- - bewegung_oben_in + bewegung_unten_in;
60
61
begin
62
63
   if (clk25in'EVENT AND clk25in = '1') then
64
  
65
66
  
67
  --mauer_reset <= "0010101011" + bewegung_rechts_in - bewegung_links_in; 
68
  
69
  
70
  if(reset_freigabe_in = '1')then
71
  REDout   <= "000"; 
72
   BLUEout   <= "000";
73
  GREENout <= "000";
74
  
75
  
76
  if 
77
       hz_inoutin     <  "0010010000"  --81   positionierungseinstellung bildschirm 21/70
78
  or     hz_inoutin     >  "1100010000"  --784
79
  or   vz_inoutin     <  "0000000011"  --3 
80
  or   vz_inoutin     >  "1000001001"  --521
81
  
82
  THEN
83
  REDout   <= "000"; 
84
   BLUEout   <= "000";
85
  GREENout <= "000"; 
86
  
87
  
88
  --spielfigur (blue)
89
  elsif   
90
  (    
91
      --  (hz_inoutin   >  "0010001110" + bewegung_rechts_in - bewegung_links_in)  --142  
92
  --AND    (hz_inoutin   <  "0010101011" + bewegung_rechts_in - bewegung_links_in)  --171
93
  --AND   (vz_inoutin   >  "0111101111" - bewegung_oben_in + bewegung_unten_in)  --495 
94
  --AND   (vz_inoutin   <   "1000001001" - bewegung_oben_in + bewegung_unten_in)  --521
95
  
96
  --      (hz_inoutin = spielfigur_x) --27 "0000011011"
97
  --  AND  (vz_inoutin = spielfigur_y)   --24 "0000011000"
98
  
99
  
100
        (hz_inoutin   >  spielfigur_x + bewegung_rechts_in - bewegung_links_in)    
101
  AND    (hz_inoutin   <  spielfigur_x + bewegung_rechts_in - bewegung_links_in  +  "0000011011") 
102
  AND     (vz_inoutin   >  spielfigur_y - bewegung_oben_in + bewegung_unten_in)   
103
  AND     (vz_inoutin   <   spielfigur_y - bewegung_oben_in + bewegung_unten_in  +  "0000011000") 
104
  
105
  )  
106
    
107
  THEN 
108
    REDout   <= "000"; 
109
    BLUEout   <= "111";
110
    GREENout <= "000"; 
111
    
112
    
113
  --Kollison--
114
  
115
  --ELSIF
116
  --(
117
  --  REDout       = "000" 
118
  --  AND BLUEout   = "000"
119
  --  AND GREENout   = "000"
120
  --)
121
  
122
      --THEN
123
      --schwarz <= "0000000001";
124
      
125
      
126
      --ELSE
127
      --schwarz <= "0000000000";
128
    
129
      
130
      
131
      
132
      
133
  ELSIF
134
  (
135
      
136
    schwarz =  spielfigur_x + bewegung_rechts_in - bewegung_links_in -   "0000000001"   
137
    OR schwarz =  spielfigur_x + bewegung_rechts_in - bewegung_links_in  +  "0000011100"   
138
    OR schwarz = spielfigur_y - bewegung_oben_in + bewegung_unten_in              
139
    OR schwarz = spielfigur_y - bewegung_oben_in + bewegung_unten_in  +  "0000011001"   
140
  
141
  )
142
  
143
      THEN
144
      kollision <= '1';
145
      
146
      
147
      --ELSE
148
      --kollision <= '0';
149
      
150
      
151
  
152
  --Leveldesign 
153
  --Hindernis (schwarz) 
154
  --1
155
  ELSIF   
156
  (    (hz_inoutin   >  "0011000001")  --192 
157
  AND  (hz_inoutin   <  "0011001011")  --203
158
  AND   (vz_inoutin   >  "0001011010")  --90 
159
  AND   (vz_inoutin    <   "1000001001")  --521  
160
  )  
161
  
162
  --2
163
  OR 
164
  (    (hz_inoutin   >  "0011111101")  --253 
165
  AND  (hz_inoutin   <  "0100001000")  --264
166
  AND   (vz_inoutin   >  "0000100111")  --39 
167
  AND   (vz_inoutin    <   "0101100000")  --352
168
  )
169
  
170
  --3 
171
  OR 
172
  (    (hz_inoutin   >  "0011001010")  --202 
173
  AND  (hz_inoutin   <  "0101000011")  --323
174
  AND   (vz_inoutin   >  "0110010011")  --403 
175
  AND   (vz_inoutin    <   "0110011110")  --414
176
  )
177
  
178
  --4 
179
  OR 
180
  (    (hz_inoutin   >  "0100111000")  --312 
181
  AND  (hz_inoutin   <  "0101000011")  --323
182
  AND   (vz_inoutin   >  "0011010010")  --210
183
  AND   (vz_inoutin    <   "0110011110")  --414
184
  )
185
186
  --5
187
  OR 
188
  (    (hz_inoutin   >  "0100111000")  --312 
189
  AND  (hz_inoutin   <  "1010011010")  --666
190
  AND   (vz_inoutin   >  "0011010010")  --210 
191
  AND   (vz_inoutin    <   "0011011101")  --221
192
  )
193
  
194
  --6  
195
  OR 
196
  (    (hz_inoutin   >  "1010001111")  --655 
197
  AND  (hz_inoutin   <  "1010011010")  --666
198
  AND   (vz_inoutin   >  "0001011010")  --90 
199
  AND   (vz_inoutin    <   "0011011101")  --221
200
  )
201
  
202
  --7 
203
  OR 
204
  (    (hz_inoutin   >  "0100111011")  --315 
205
  AND  (hz_inoutin   <  "1010011010")  --666
206
  AND   (vz_inoutin   >  "0001011010")  --90 
207
  AND   (vz_inoutin    <   "0001100101")  --101
208
  )  
209
  
210
  --8 
211
  OR 
212
  (    (hz_inoutin   >  "0011111101")  --253 
213
  AND  (hz_inoutin   <  "1001100111")  --615
214
  AND   (vz_inoutin   >  "0010010110")  --150
215
  AND   (vz_inoutin    <   "0010100001")  --161
216
  )
217
  
218
  --9 
219
  OR 
220
  (    (hz_inoutin   >  "1011001010")  --714 
221
  AND  (hz_inoutin   <  "1011010101")  --725
222
  AND   (vz_inoutin   >  "0000100111")  --39
223
  AND   (vz_inoutin    <   "0111010110")  --470
224
  )
225
226
  --10  
227
  OR 
228
  (    (hz_inoutin   >  "0101110101")  --373 
229
  AND  (hz_inoutin   <  "1011010101")  --725
230
  AND   (vz_inoutin   >  "0100001111")  --271
231
  AND   (vz_inoutin    <   "0100011010")  --282
232
  )
233
  
234
  --11   
235
  OR 
236
  (    (hz_inoutin   >  "0101110101")  --373 
237
  AND  (hz_inoutin   <  "0110000000")  --384
238
  AND   (vz_inoutin   >  "0100001111")  --271
239
  AND   (vz_inoutin    <   "0111010110")  --470
240
  )
241
  
242
  --12    
243
  OR 
244
  (    (hz_inoutin   >  "0011111110")  --354 
245
  AND  (hz_inoutin   <  "0110000000")  --384
246
  AND   (vz_inoutin   >  "0111001011")  --459
247
  AND   (vz_inoutin    <   "0111010110")  --470
248
  )
249
250
  --13      
251
  OR 
252
  (    (hz_inoutin   >  "0111110100")  --500 
253
  AND  (hz_inoutin   <  "0111111111")  --511
254
  AND   (vz_inoutin   >  "0101001101")  --333
255
  AND   (vz_inoutin    <   "1000001001")  --521  
256
  )
257
  
258
  
259
  THEN 
260
    REDout  <= "000"; 
261
    BLUEout   <= "000";
262
    GREENout <= "000";
263
    schwarz := "01";
264
    
265
    
266
  --Ziel
267
  ELSIF   
268
  (    (hz_inoutin   >  "1011010100")  --724
269
  AND  (hz_inoutin   <  "1100010010")  --786
270
  AND   (vz_inoutin   >  "0000100111")  --39 
271
  AND   (vz_inoutin    <   "0001000001")  --65
272
  )  
273
  
274
  
275
  THEN 
276
    REDout  <= "000"; 
277
    BLUEout   <= "000";
278
    GREENout <= "111";
279
  
280
  
281
  else
282
  REDout   <= "111"; 
283
   BLUEout   <= "111";
284
  GREENout <= "111";
285
  --Kollision--
286
  schwarz := "00";  
287
  kollision <= '0';
288
289
  
290
  END IF;
291
  END IF;
292
  end if;
293
  
294
295
 
296
end process; 
297
298
--mauer_reset_out <= mauer_reset;
299
kollision_out <= kollision;
300
  
301
end Behavioral;

von Dr. Schnaggels (Gast)


Lesenswert?

Hast Du schon mal versucht, dein Problem/deine(?) Beschreibung zu 
simulieren?

von M. T. (Gast)


Lesenswert?

Die beschreibung funktioniert soweit, man kann sich lediglich noch durch 
die hindernisse hindurchbewegen ohne einen reset hervorzurufen

von M. T. (yohojoe)


Lesenswert?

*push

von Klaus (Gast)


Lesenswert?

*pop

von Achim S. (Gast)


Lesenswert?

Hallo M.T.,

damit ich es richtig verstehe: du suchst nach dem Grund, warum die 
Zuweisung

M. T. schrieb:
> THEN
>       kollision <= '1';

nie ausgeführt wird? Das kann entweder daran liegen, dass die Bedingung

M. T. schrieb:
> ELSIF
>   (
>
>     schwarz =  spielfigur_x + bewegung_rechts_in - bewegung_links_in - 
"0000000001"
>     OR schwarz =  spielfigur_x + bewegung_rechts_in - bewegung_links_in  + 
"0000011100"
>     OR schwarz = spielfigur_y - bewegung_oben_in + bewegung_unten_in
>     OR schwarz = spielfigur_y - bewegung_oben_in + bewegung_unten_in  + 
"0000011001"
>
>   )

nie erfüllt ist. Oder es liegt daran, dass diese Bedingung nicht 
abgefragt wird, weil irgendeine andere Bedinung in deinem 
if/then/elsif/else-Konstrukt dafür sorgt, dass du nicht an diese Stelle 
zu Kollisionsprüfung kommst.

Welches von beiden der tatsächliche Grund ist, wird dir hier im Forum 
wohl keiner verraten. (Stell dir vor, du hättest diesen Code nicht 
selbst geschrieben: könntest du dann etwas mit diesen Monsterabfragen 
anfangen?)

Mein Rat an dich:
1) gewöhn dir eine sinnvolle Einrückung an, damit du erkennst, welches 
elsif zu welchem if gehört
2) mal dir für solche Abfragen vorab ein Struktogramm oder ein 
Flussdiagramm mit dem du planen kannst, in welcher Situation auf dem 
Spielfeld welche Entscheidungen getroffen werden. (das mach ich selbst 
zwar auch selten, aber sobald man den Überblick im 
if/then/elsif-Dschungel verliert, wird es Zeit dafür.)
3) führe eine Simulation durch, bei der es zu einer Kollission kommen 
müsste. Wenn die Kollision nicht erkannt wird: schau in der Simulation 
nach, warum nicht.

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.