Forum: FPGA, VHDL & Co. MUX-Anzahl verringern


von peter (Gast)


Lesenswert?

Hallo, , guten Tag.
Ich habe 16 rote, 8 blaue und 8 grüne rechteckige LED auf dem VGA-Screen 
abgebildet die auch richtig anzeigen gemäß Eingabe PS2-Tastatur. Der 
Hintergrund der LED wird als grau angezeigt.

Bloß die anzahl der einzelnen MUX ist sehrhoch, wie kann man das anders 
schreiben?
1
--------------------------------------- 8 b_led
2
    if CounterX >=10 and CounterX < 20 and CounterY >=10 and CounterY < 20 and b_led(7)='1' then
3
      red <="0000";
4
      blue <="1111";
5
      green <="0000"; 
6
    elsif CounterX >=10 and CounterX < 20 and CounterY >=10 and CounterY < 20 and b_led(7)='0' then
7
      red <="0111";
8
      blue <="0111";
9
      green <="0111";
10
    end if; 
11
12
     if CounterX >=25 and CounterX < 35 and CounterY >=10 and CounterY < 20 and b_led(6)='1' then
13
      red <="0000";
14
      blue <="1111";
15
      green <="0000"; 
16
    elsif CounterX >=25 and CounterX < 35 and CounterY >=10 and CounterY < 20 and b_led(6)='0' then
17
      red <="0111";
18
      blue <="0111";
19
      green <="0111";
20
    end if; 
21
     
22
    if CounterX >=40 and CounterX < 50 and CounterY >=10 and CounterY < 20 and b_led(5)='1' then
23
      red <="0000";
24
      blue <="1111";
25
      green <="0000"; 
26
    elsif CounterX >=40 and CounterX < 50 and CounterY >=10 and CounterY < 20 and b_led(5)='0' then
27
      red <="0111";
28
      blue <="0111";
29
      green <="0111";
30
    end if; 
31
32
    if CounterX >=55 and CounterX < 65 and CounterY >=10 and CounterY < 20 and b_led(4)='1' then
33
      red <="0000";
34
      blue <="1111";
35
      green <="0000"; 
36
    elsif CounterX >=55 and CounterX < 65 and CounterY >=10 and CounterY < 20 and b_led(4)='0' then
37
      red <="0111";
38
      blue <="0111";
39
      green <="0111";
40
    end if;    
41
42
    if CounterX >=70 and CounterX < 80 and CounterY >=10 and CounterY < 20 and b_led(3)='1' then
43
      red <="0000";
44
      blue <="1111";
45
      green <="0000"; 
46
    elsif CounterX >=70 and CounterX < 80 and CounterY >=10 and CounterY < 20 and b_led(3)='0' then
47
      red <="0111";
48
      blue <="0111";
49
      green <="0111";
50
    end if;    
51
52
    if CounterX >=85 and CounterX < 95 and CounterY >=10 and CounterY < 20 and b_led(2)='1' then
53
      red <="0000";
54
      blue <="1111";
55
      green <="0000"; 
56
    elsif CounterX >=85 and CounterX < 95 and CounterY >=10 and CounterY < 20 and b_led(2)='0' then
57
      red <="0111";
58
      blue <="0111";
59
      green <="0111";
60
    end if;    
61
62
    if CounterX >=100 and CounterX < 110 and CounterY >=10 and CounterY < 20 and b_led(1)='1' then
63
      red <="0000";
64
      blue <="1111";
65
      green <="0000"; 
66
    elsif CounterX >=100 and CounterX < 110 and CounterY >=10 and CounterY < 20 and b_led(1)='0' then
67
      red <="0111";
68
      blue <="0111";
69
      green <="0111";
70
    end if;    
71
72
    if CounterX >=115 and CounterX < 125 and CounterY >=10 and CounterY < 20 and b_led(0)='1' then
73
      red <="0000";
74
      blue <="1111";
75
      green <="0000"; 
76
    elsif CounterX >=115 and CounterX < 125 and CounterY >=10 and CounterY < 20 and b_led(0)='0' then
77
      red <="0111";
78
      blue <="0111";
79
      green <="0111";
80
    end if;           
81
  
82
  --------------------------------------- 8 g_led
83
    if CounterX >=150 and CounterX < 160 and CounterY >=10 and CounterY < 20 and g_led(7)='1' then
84
      red <="0000";
85
      blue <="0000";
86
      green <="1111"; 
87
    elsif CounterX >=150 and CounterX < 160 and CounterY >=10 and CounterY < 20 and g_led(7)='0' then
88
      red <="0111";
89
      blue <="0111";
90
      green <="0111";
91
    end if; 
92
93
    if CounterX >=165 and CounterX <175 and CounterY >=10 and CounterY < 20 and g_led(6)='1' then
94
      red <="0000";
95
      blue <="0000";
96
      green <="1111"; 
97
    elsif CounterX >=165 and CounterX < 175 and CounterY >=10 and CounterY < 20 and g_led(6)='0' then
98
      red <="0111";
99
      blue <="0111";
100
      green <="0111";
101
    end if; 
102
     
103
    if CounterX >=180 and CounterX < 190 and CounterY >=10 and CounterY < 20 and g_led(5)='1' then
104
      red <="0000";
105
      blue <="0000";
106
      green <="1111"; 
107
    elsif CounterX >=180 and CounterX < 190 and CounterY >=10 and CounterY < 20 and g_led(5)='0' then
108
      red <="0111";
109
      blue <="0111";
110
      green <="0111";
111
    end if; 
112
113
    if CounterX >=195 and CounterX < 205 and CounterY >=10 and CounterY < 20 and g_led(4)='1' then
114
      red <="0000";
115
      blue <="0000";
116
      green <="1111"; 
117
    elsif CounterX >=195 and CounterX < 205 and CounterY >=10 and CounterY < 20 and g_led(4)='0' then
118
      red <="0111";
119
      blue <="0111";
120
      green <="0111";
121
    end if;    
122
123
    if CounterX >=210 and CounterX < 220 and CounterY >=10 and CounterY < 20 and g_led(3)='1' then
124
      red <="0000";
125
      blue <="0000";
126
      green <="1111"; 
127
    elsif CounterX >=210 and CounterX < 220 and CounterY >=10 and CounterY < 20 and g_led(3)='0' then
128
      red <="0111";
129
      blue <="0111";
130
      green <="0111";
131
    end if;    
132
133
    if CounterX >=225 and CounterX < 235 and CounterY >=10 and CounterY < 20 and g_led(2)='1' then
134
      red <="0000";
135
      blue <="0000";
136
      green <="1111"; 
137
    elsif CounterX >=225 and CounterX < 235 and CounterY >=10 and CounterY < 20 and g_led(2)='0' then
138
      red <="0111";
139
      blue <="0111";
140
      green <="0111";
141
    end if;    
142
143
    if CounterX >=240 and CounterX < 250 and CounterY >=10 and CounterY < 20 and g_led(1)='1' then
144
      red <="0000";
145
      blue <="0000";
146
      green <="1111"; 
147
    elsif CounterX >=240 and CounterX < 250 and CounterY >=10 and CounterY < 20 and g_led(1)='0' then
148
      red <="0111";
149
      blue <="0111";
150
      green <="0111";
151
    end if;    
152
153
    if CounterX >=255 and CounterX < 265 and CounterY >=10 and CounterY < 20 and g_led(0)='1' then
154
      red <="0000";
155
      blue <="0000";
156
      green <="1111"; 
157
    elsif CounterX >=255 and CounterX < 265 and CounterY >=10 and CounterY < 20 and g_led(0)='0' then
158
      red <="0111";
159
      blue <="0111";
160
      green <="0111";
161
    end if;  
162
163
---------------------------  16 r_led
164
    if CounterX >=10 and CounterX < 20 and CounterY >=40 and CounterY < 50 and r_led(15)='1' then
165
      red <="1111";
166
      blue <="0000";
167
      green <="0000"; 
168
    elsif CounterX >=10 and CounterX < 20 and CounterY >=40 and CounterY < 50 and r_led(15)='0' then
169
      red <="0111";
170
      blue <="0111";
171
      green <="0111";
172
    end if; 
173
174
    if CounterX >=25 and CounterX < 35 and CounterY >=40 and CounterY < 50 and r_led(14)='1' then
175
      red <="1111";
176
      blue <="0000";
177
      green <="0000"; 
178
    elsif CounterX >=25 and CounterX < 35 and CounterY >=40 and CounterY < 50 and r_led(14)='0' then
179
      red <="0111";
180
      blue <="0111";
181
      green <="0111";
182
    end if; 
183
     
184
    if CounterX >=40 and CounterX < 50 and CounterY >=40 and CounterY < 50 and r_led(13)='1' then
185
      red <="1111";
186
      blue <="0000";
187
      green <="0000"; 
188
    elsif CounterX >=40 and CounterX < 50 and CounterY >=40 and CounterY < 50 and r_led(13)='0' then
189
      red <="0111";
190
      blue <="0111";
191
      green <="0111";
192
    end if; 
193
194
    if CounterX >=55 and CounterX < 65 and CounterY >=40 and CounterY < 50 and r_led(12)='1' then
195
      red <="1111";
196
      blue <="0000";
197
      green <="0000"; 
198
    elsif CounterX >=55 and CounterX < 65 and CounterY >=40 and CounterY < 50 and r_led(12)='0' then
199
      red <="0111";
200
      blue <="0111";
201
      green <="0111";
202
    end if;    
203
204
    if CounterX >=70 and CounterX < 80 and CounterY >=40 and CounterY < 50 and r_led(11)='1' then
205
      red <="1111";
206
      blue <="0000";
207
      green <="0000"; 
208
    elsif CounterX >=70 and CounterX < 80 and CounterY >=40 and CounterY < 50 and r_led(11)='0' then
209
      red <="0111";
210
      blue <="0111";
211
      green <="0111";
212
    end if;    
213
214
    if CounterX >=85 and CounterX < 95 and CounterY >=40 and CounterY < 50 and r_led(10)='1' then
215
      red <="1111";
216
      blue <="0000";
217
      green <="0000"; 
218
    elsif CounterX >=85 and CounterX < 95 and CounterY >=40 and CounterY < 50 and r_led(10)='0' then
219
      red <="0111";
220
      blue <="0111";
221
      green <="0111";
222
    end if;    
223
224
    if CounterX >=100 and CounterX < 110 and CounterY >=40 and CounterY < 50 and r_led(9)='1' then
225
      red <="1111";
226
      blue <="0000";
227
      green <="0000"; 
228
    elsif CounterX >=100 and CounterX < 110 and CounterY >=40 and CounterY < 50 and r_led(9)='0' then
229
      red <="0111";
230
      blue <="0111";
231
      green <="0111";
232
    end if;    
233
234
    if CounterX >=115 and CounterX < 125 and CounterY >=40 and CounterY < 50 and r_led(8)='1' then
235
      red <="1111";
236
      blue <="0000";
237
      green <="0000"; 
238
    elsif CounterX >=115 and CounterX < 125 and CounterY >=40 and CounterY < 50 and r_led(8)='0' then
239
      red <="0111";
240
      blue <="0111";
241
      green <="0111";
242
    end if;           
243
 -------------------------------------- 
244
    if CounterX >=130 and CounterX < 140 and CounterY >=40 and CounterY < 50 and r_led(7)='1' then
245
      red <="1111";
246
      blue <="0000";
247
      green <="0000"; 
248
    elsif CounterX >=130 and CounterX < 140 and CounterY >=40 and CounterY < 50 and r_led(7)='0' then
249
      red <="0111";
250
      blue <="0111";
251
      green <="0111";
252
    end if; 
253
254
    if CounterX >=145 and CounterX <155 and CounterY >=40 and CounterY < 50 and r_led(6)='1' then
255
      red <="1111";
256
      blue <="0000";
257
      green <="0000"; 
258
    elsif CounterX >=145 and CounterX < 155 and CounterY >=40 and CounterY < 50 and r_led(6)='0' then
259
      red <="0111";
260
      blue <="0111";
261
      green <="0111";
262
    end if; 
263
     
264
    if CounterX >=160 and CounterX < 170 and CounterY >=40 and CounterY < 50 and r_led(5)='1' then
265
      red <="1111";
266
      blue <="0000";
267
      green <="0000"; 
268
    elsif CounterX >=160 and CounterX < 170 and CounterY >=40 and CounterY < 50 and r_led(5)='0' then
269
      red <="0111";
270
      blue <="0111";
271
      green <="0111";
272
    end if; 
273
274
    if CounterX >=175 and CounterX < 185 and CounterY >=40 and CounterY < 50 and r_led(4)='1' then
275
      red <="1111";
276
      blue <="0000";
277
      green <="0000"; 
278
    elsif CounterX >=175 and CounterX < 185 and CounterY >=40 and CounterY < 50 and r_led(4)='0' then
279
      red <="0111";
280
      blue <="0111";
281
      green <="0111";
282
    end if;    
283
284
    if CounterX >=190 and CounterX < 200 and CounterY >=40 and CounterY < 50 and r_led(3)='1' then
285
      red <="1111";
286
      blue <="0000";
287
      green <="0000"; 
288
    elsif CounterX >=190 and CounterX < 200 and CounterY >=40 and CounterY < 50 and r_led(3)='0' then
289
      red <="0111";
290
      blue <="0111";
291
      green <="0111";
292
    end if;    
293
294
    if CounterX >=205 and CounterX < 215 and CounterY >=40 and CounterY < 50 and r_led(2)='1' then
295
      red <="1111";
296
      blue <="0000";
297
      green <="0000"; 
298
    elsif CounterX >=205 and CounterX < 215 and CounterY >=40 and CounterY < 50 and r_led(2)='0' then
299
      red <="0111";
300
      blue <="0111";
301
      green <="0111";
302
    end if;    
303
304
    if CounterX >=220 and CounterX < 230 and CounterY >=40 and CounterY < 50 and r_led(1)='1' then
305
      red <="1111";
306
      blue <="0000";
307
      green <="0000"; 
308
    elsif CounterX >=220 and CounterX < 230 and CounterY >=40 and CounterY < 50 and r_led(1)='0' then
309
      red <="0111";
310
      blue <="0111";
311
      green <="0111";
312
    end if;    
313
314
    if CounterX >=235 and CounterX < 245 and CounterY >=40 and CounterY < 50 and r_led(0)='1' then
315
      red <="1111";
316
      blue <="0000";
317
      green <="0000"; 
318
    elsif CounterX >=235 and CounterX < 245 and CounterY >=40 and CounterY < 50 and r_led(0)='0' then
319
      red <="0111";
320
      blue <="0111";
321
      green <="0111";
322
    end if;

Gruss

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

peter schrieb:
> wie kann man das anders schreiben?
Vorneweg: das ist kein VHDL-Problem, sondern eines, das mit Nachdenken 
und Überlegen zu tun hat!

Es muss ja nicht laufend und parallel die Zählerwerte CounterX und 
CounterY mit allen LEDs verglichen werden. An der Y-Position 30 
interessiert z.B. keine einzige r_led. Und an der X-Position 240 
interessiert z.B. nur die r_led mit Index 0.

Also wäre es sinnvoller, für das aktuelle Pixel zu kontrollieren, ob 
es gesetzt werden muss. Dazu rechnet man aus dem CounterX den Index für 
r_led aus: du musst nur kontrollieren, ob das Bit 
r_led(15-(CounterX-10)/15)) = '1' ist. Wenn das der Fall ist, dann gilt 
z.B. hier "rot":
1
    -- default: schwarz
2
    red   <="0000";
3
    blue  <="0000";
4
    green <="0000"; 
5
6
    :
7
    :
8
9
    if (CounterY >=40 and CounterY < 50) then   -- sind wir in einer Zeile für rote Pixel?
10
       if r_led(15-(CounterX-10)/15))='1' then  -- Pixel setzen?
11
         if ((CounterX-10) mod 15) < 10 then    -- Ja, aber nur im Pixel-Bereich
12
           red <="1111";
13
         end if;       
14
       else
15
         red   <="0111";
16
         blue  <="0111";
17
         green <="0111";
18
       end if;
19
    end if;
20
21
    :
So, und wenn du das dann gemacht hast, wirst du schlagartig 
herausfinden, dass die Divisionen durch 15 (mit '/' und mod) nicht so 
richtig gut funktionieren. Hier wäre es schlauer, die Fenster 16 Pixel 
breit zu machen, z.B. 10 für das Feld und 6 leere Pixel zwischen den 
Feldern...

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Ja, danke.
Werde ich versuchen umzusetzen.

Gruss

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.