MUX-Anzahl verringern

Gast #3887012
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
Moderator (Firma: Titel) Persönliche Seite #3887184
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...

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