Forum: FPGA, VHDL & Co. Drehrichtungserkennung


von Jack D. (jack99)


Lesenswert?

Guten Abend,

Teil eines Schulprojektes ist es, mittels VHDL und anschließendem upload 
auf das Spartan 3A Board, ein Lauflicht mithilfe der LED0-LED7 so zu 
generieren, es via Rotary Knob punktuell hoch und runter läuft. Mit 
Betätigung des Psuh-Button wechselt das Lauflicht vom Punkt- zum 
Balkenverlauf (der South-Button dient als Reset). Der Code steht soweit 
und lässt sich auch erfolgereich benchen. Jedoch gestaltet es sich nach 
dem Upload auf's Board etwas komplizierter.

Um das Problem nachvollziehen zu können, hab ich es aufgenommen, es ist 
hier zu sehen: https://workupload.com/file/7j2zG2s

Zu sehen ist also eine leuchtende LED die mit der Rotation des Rotary 
Knob ihre Position nicht zu wechseln scheint. Hingegen funktioniert der 
Wechsel zwischen Punkt- und Balkenbetrieb und die Reset-Funktion, wie zu 
sehen ist.

Dreht man den Rotary Knob lang genug in eine Richtung (schnell oder 
langsam spielt hierbei keine Rolle) so wandert das Licht doch in die 
gewünschte Richtung, was meines erachtens für ein Clock Problem spricht.

Folgenden der Quellcode (wenn auch nicht ganz übersichtlich) zum 
besseren Verstädnis:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.numeric_std.all;
4
use ieee.std_logic_arith.all;
5
use ieee.std_logic_unsigned.all;
6
7
8
entity taster_flanken_binaer_new is
9
10
Port (     a : in  STD_LOGIC;
11
        b : in  STD_LOGIC;
12
        pb: in std_logic;
13
           clk : in  STD_LOGIC;
14
           reset : in  STD_LOGIC;          
15
        Ton : out  STD_LOGIC:='0';
16
      Led : out STD_LOGIC_VECTOR(7 downto 0));
17
        ----SIMULATIONSZWECKE-----
18
    --   stateb : out std_logic_vector (3 downto 0);
19
      --  a_out : inout  STD_LOGIC:='0';
20
      -- a_up: inout std_logic:='0';
21
      -- b_down:inout std_logic:='0';
22
      
23
           --zaehl : out  STD_LOGIC_VECTOR (3 downto 0):="0000"); --Ausgang Zähler 4 bit        
24
end taster_flanken_binaer_new;
25
26
architecture Behavioral of taster_flanken_binaer_new is
27
signal a_out:std_logic:='0';
28
signal a_up:std_logic:='0';
29
signal b_down:std_logic:='0';
30
31
32
---------------A--------------------
33
type zustanda is(za1,za2,za3,za4); --Deklarierung der Zustände
34
  signal zalta, zneua: zustanda;
35
  signal takt10hza: std_logic:='0';
36
  signal t10hza:std_logic:='0';
37
  signal ausgabe: std_logic:='0';  
38
  constant t10hz_a :integer:=5000000;         --Setzte Zähler auf wert für 100 ms  
39
  signal counta : integer range 0 to t10hz_a :=0; --setzte Zähler Anfang auf 0
40
  signal clkout: std_logic:='0';  --Setze Ausgangssignal auf 0
41
  signal freigabetimer : std_logic:='0'; --Setzte freigabe auf 0
42
  signal t10hzab : std_logic:='0';
43
  signal impulsa:std_logic:='0';
44
  signal qint: std_logic_vector(3 downto 0):="0000";
45
  signal za:std_logic:='0';
46
  signal xa:std_logic:='0';
47
  
48
--------------B------------------  
49
type zustandb is(zb1,zb2,zb3,zb4); --Deklarierung der Zustände
50
  constant t10hzb :integer:=5000000;         --Setzte Zähler auf wert für 100 ms  
51
  signal zaltb, zneub : zustandb;
52
  signal ausgabeb: std_logic:='0';
53
  signal countb : integer range 0 to t10hzb :=0; --setzte Zähler Anfang auf 0
54
  signal clkoutb: std_logic:='0';  --Setze Ausgangssignal auf 0
55
  signal freigabetimerb : std_logic:='0'; --Setzte freigabe auf 0
56
  signal takt10hzb : std_logic;
57
  signal b_out: std_logic;
58
  signal state: std_logic_vector (3 downto 0);
59
  signal impulsb: std_logic:='0';
60
  signal t10hzb1: std_logic:='0';  
61
62
63
-------FLANKENERKENNUNG-----------  
64
  type ZUSTAENDE_fl is (A_fl, B_fl, C_fl);
65
signal ZUSTAND_fl, FOLGEZUSTAND_fl: ZUSTAENDE_fl;
66
67
type ZUSTAENDE_fl_b is (A_fl_b, B_fl_b, C_fl_b);
68
signal ZUSTAND_fl_b, FOLGEZUSTAND_fl_b: ZUSTAENDE_fl_b;
69
70
--PB
71
  type zustand is(z1,z2,z3,z4,z5,z6,z7,z8); --Deklarierung der Zustände
72
  constant t10hz:integer:=25000000;         --Setzte Zähler auf wert für 500 ms  
73
  signal zalt, zneu: zustand;
74
  signal ausgabe1: std_logic:='0'; --Signale werden auf 0 gesetzt
75
  signal ausgabe2: std_logic:='0';
76
  signal ausgabe3: std_logic:='0';
77
  signal ausgabe4: std_logic:='0';  
78
  signal count : integer range 0 to t10hz :=0; --setzte Zähler Anfang auf 0
79
  signal clkoutpb: std_logic:='0';  --Setze Ausgangssignal auf 0  
80
  signal takt10hzpb : std_logic;
81
  signal PB_Balken :  STD_LOGIC:='0';
82
  signal TonF1K: std_logic;
83
  signal TonF05K: std_logic;
84
  signal blabla: std_logic_vector (3 downto 0);
85
  signal impulspb: std_logic:='0';
86
  signal t10hzpb1: std_logic:='0';
87
  
88
  
89
  
90
  --ERZEUGUN TON
91
  signal c : integer range 0 to 99999 := 0;  -- 500 Hz 
92
  signal d : integer range 0 to 49999 := 0;  -- 1000 Hz 
93
  signal x : std_logic := '0'; 
94
  signal y : std_logic := '0'; 
95
  signal Ton1000 : std_logic;
96
  signal Ton0500  : std_logic;
97
98
99
100
begin
101
102
takta:process (clk,freigabetimer) 
103
    begin    
104
if reset='1' then counta<=0;    
105
   elsif freigabetimer='1'  then    
106
            if (rising_edge(clk))then        --wenn steigene Flange von Clock dann zählen
107
                    if(counta < t10hz_a) then          --vergleiche zähler mit maximalen wert
108
                                  counta <= counta+1;          --addiere 1 auf zähler
109
                                  elsif counta=t10hz_a then
110
                                  clkout <= not clkout;            
111
                                  counta <=0;  
112
                    end if;
113
            end if;
114
end if;
115
  end process takta;
116
  
117
  process (takt10hza,impulsa) 
118
  begin  
119
  if impulsa='1' then t10hza<='0';
120
  elsif falling_edge (takt10hza) then  t10hza<=not t10hza;  end if;            
121
  end process;
122
  
123
    -----------------
124
  process(clk,reset)
125
  begin
126
  
127
    if reset='1' then zalta <=za1; --Setzen bei reset Zustand z1
128
    elsif clk='1' and clk'event then zalta<=zneua; --weiterschaltung bei clock
129
    end if;
130
  end process;
131
  
132
133
  process (a, zalta, t10hza)
134
  begin
135
136
    case zalta is
137
      when za1 =>  if a='0'
138
              then zneua <=za1;              
139
              else zneua <=za2;
140
              end if;
141
              ausgabe<='0';
142
              state<="0001";
143
              freigabetimer<='0';
144
              impulsa<='1';
145
              
146
              
147
              
148
    
149
      when za2 =>                                      
150
              if  t10hza='1'                    
151
              then zneua <=za3;
152
              else zneua <=za2;
153
              end if;
154
              ausgabe<='1';
155
              state<="0010";
156
              freigabetimer<='1';
157
                impulsa<='0';
158
              
159
      
160
      when za3 =>  if  a='1'
161
              then zneua <=za3;
162
              else zneua <=za4;
163
              end if;
164
              ausgabe<='1';
165
              state<="0011";
166
              freigabetimer<='0';
167
                impulsa<='1';
168
            
169
      
170
      when za4 =>  if t10hza='1'        
171
              then zneua <=za1;
172
              else zneua <=za4;
173
              end if;
174
              ausgabe<='0';
175
              state<="0100";
176
              freigabetimer<='1';
177
                impulsa<='0';
178
                  
179
  end case;
180
end process;  
181
  
182
  --TASTE B
183
    process(clk,reset)
184
  begin
185
    if reset='1' then zaltb <=zb1; --Setzen bei reset Zustandb z1
186
    elsif clk='1' and clk'event then zaltb<=zneub; --weiterschaltung bei clock
187
    end if;
188
  end process;  
189
190
  process (b, zaltb, t10hzb1)
191
  begin
192
193
    case zaltb is
194
      when zb1 =>  if b='0'
195
              then zneub <=zb1;              
196
              else zneub <=zb2;
197
              end if;
198
              ausgabeb<='0';
199
              --stateb<="0001";
200
              freigabetimerb<='0';
201
              impulsb<='1';
202
              
203
    
204
      when zb2 =>                                      
205
              if  t10hzb1='1'                      
206
              then zneub <=zb3;
207
              else zneub <=zb2;
208
              end if;
209
              ausgabeb<='1';
210
              --stateb<="0010";
211
              freigabetimerb<='1';
212
              impulsb<='0';
213
              
214
      
215
      when zb3 =>  if  b='1'
216
              then zneub <=zb3;
217
              else zneub <=zb4;
218
              end if;
219
              ausgabeb<='1';
220
              --stateb<="0011";
221
              freigabetimerb<='0';
222
              impulsb<='1';
223
              
224
              
225
      
226
      when zb4 =>  if t10hzb1='1'   
227
              then zneub <=zb1;
228
              else zneub <=zb4;
229
              end if;
230
              ausgabeb<='0';
231
              --stateb<="0100";
232
              freigabetimerb<='1';
233
              impulsb<='0';
234
                  
235
  end case;
236
  
237
end process;
238
  
239
240
taktb:process (clk) 
241
    begin  
242
  
243
   if reset='1' then countb<=0;
244
   
245
   elsif freigabetimerb='1' then    
246
      if (rising_edge(clk))then        --wenn steigene Flange von Clock dann zählen
247
        if(countb < t10hzb) then          --vergleiche zähler mit maximalen wert
248
        countb <= countb+1;              --addiere 1 auf zähler
249
      else
250
      clkoutb <=not clkoutb;            --
251
      countb <=0;                  -- setze zähler auf 0
252
          end if;
253
      end if;
254
    end if;  
255
  end process taktb;
256
  
257
    process (takt10hzb,impulsb) 
258
  begin  
259
  if impulsb='1' then t10hzb1<='0';
260
  elsif falling_edge (takt10hzb) then  t10hzb1<=not t10hzb1;  end if;              
261
  end process;
262
  
263
264
-------------------------
265
266
ZUSTANDSAKTUALISIERUNG_fl: process (clk,RESET)
267
begin
268
if RESET = '1' then ZUSTAND_fl <= A_fl;
269
elsif clk = '1' and clk'event then  ZUSTAND_fl <= FOLGEZUSTAND_fl;
270
end if;
271
end process ZUSTANDSAKTUALISIERUNG_fl;
272
273
FOLGEZUSTANDSBERECHNUNG_fl: process (a_out,ZUSTAND_fl)
274
begin
275
case ZUSTAND_fl is 
276
when A_fl =>   if  a_out = '1' THEN    FOLGEZUSTAND_fl <= A_fl;
277
else     FOLGEZUSTAND_fl <= B_fl;
278
end if ;
279
za <= '0'; 
280
when B_fl =>   if  a_out = '1' THEN   FOLGEZUSTAND_fl <= C_fl;
281
else    FOLGEZUSTAND_fl <= B_fl;
282
end if;
283
za <= '0';
284
when C_fl =>  if  a_out = '1' THEN   FOLGEZUSTAND_fl <= A_fl;
285
else    FOLGEZUSTAND_fl <= B_fl;
286
end if;
287
za <= '1';
288
end case;
289
end process FOLGEZUSTANDSBERECHNUNG_fl;
290
291
ZUSTANDSAKTUALISIERUNG_fl_b: process (clk,RESET)
292
begin
293
if RESET = '1' then ZUSTAND_fl_b <= A_fl_b;
294
elsif clk = '1' and clk'event then  ZUSTAND_fl_b <= FOLGEZUSTAND_fl_b;
295
end if;
296
end process ZUSTANDSAKTUALISIERUNG_fl_b;
297
298
FOLGEZUSTANDSBERECHNUNG_fl_b: process (ausgabeb,ZUSTAND_fl_b)
299
begin
300
case ZUSTAND_fl_b is 
301
when A_fl_b =>   if  ausgabeb = '1' THEN    FOLGEZUSTAND_fl_b <= A_fl_b;
302
else     FOLGEZUSTAND_fl_b <= B_fl_b;
303
end if ;
304
xa <= '0'; 
305
when B_fl_b =>   if  ausgabeb = '1' THEN   FOLGEZUSTAND_fl_b <= C_fl_b;
306
else    FOLGEZUSTAND_fl_b <= B_fl_b;
307
end if;
308
xa <= '0';
309
when C_fl_b =>  if  ausgabeb = '1' THEN   FOLGEZUSTAND_fl_b <= A_fl_b;
310
else    FOLGEZUSTAND_fl_b <= B_fl_b;
311
end if;
312
xa <= '1';
313
end case;
314
end process FOLGEZUSTANDSBERECHNUNG_fl_b;
315
316
317
hoch:process(reset,clk,za)
318
begin  
319
if reset='1' then qint<="0000"; -- Setze Zähler auf 0 wenn reset
320
  elsif clk='1' and clk'event  -- wenn Takt anliegt und weiterläuft dann
321
    then --qint<=qint; -- ausgabe wird gleich ausgabe gesetzt
322
  if za='1'--a_up='1'--Fallende Flanke von a zählt hoch
323
    then
324
      if qint="1000" then qint<="1000"; -- zählerbegrenzung auf 8
325
      else qint<=qint+1;      -- addition um 1 wenn 8 noch nicht erreicht
326
        end if;
327
        end if;
328
  if xa='1' then -- Fallende Flanke von b zählt runterthen
329
  if qint="0000" then qint<="1000"; -- wenn Zähler vorher 0 ist wird auf 8 gesetzt
330
    else qint<=qint-1;      -- subtraktion um 1 wenn 0 noch nicht erreicht ist
331
  end if;
332
  end if;
333
end if;
334
end process;
335
336
--PB
337
  process(clk,reset)
338
  begin
339
    if reset='1' then zalt <=z1; --Setzen bei reset Zustand z1
340
    elsif clk='1' and clk'event then zalt<=zneu; --weiterschaltung bei clock
341
    end if;
342
  end process;  
343
  
344
    process (takt10hzpb,impulspb) 
345
  begin  
346
  if impulspb='1' then t10hzpb1<='0';
347
  elsif falling_edge (takt10hzpb) then  t10hzpb1<=not t10hzpb1;  end if;              
348
  end process;
349
350
  process (pb, zalt, t10hzpb1)
351
  begin
352
353
    case zalt is
354
      when z1 =>  if pb='0' --Zustand 1
355
              then zneu <=z1;              
356
              else zneu <=z2;
357
              end if;
358
                  ausgabe1<='0'; -- Zuweisung der Ausgänge
359
                  ausgabe2<='0'; 
360
                  ausgabe3<='0';
361
                  ausgabe4<='0';
362
                  blabla<="0001";
363
                  impulspb<='1';
364
              
365
    
366
      when z2 =>                                      
367
              if  t10hzpb1  ='1'
368
              then zneu <=z3;
369
              else zneu <=z2;
370
              end if;
371
              ausgabe1<='1'; -- Zuweisung der Ausgänge
372
              ausgabe2<='1';
373
              ausgabe3<='0';
374
              ausgabe4<='1';
375
              blabla<="0010";
376
                impulspb<='0';
377
                
378
      when z3 =>  if  pb='1'
379
              then zneu <=z3;
380
              else zneu <=z4;
381
              end if;
382
              ausgabe1<='1';-- Zuweisung der Ausgänge
383
              ausgabe2<='0';
384
              ausgabe3<='0';
385
              ausgabe4<='0';
386
              blabla<="0011";
387
                impulspb<='1';
388
              
389
      
390
      when z4 =>  if t10hzpb1='1'     --statt a freigabe von 100ms !!!!
391
              then zneu <=z5;
392
              else zneu <=z4;
393
              end if;
394
              ausgabe1<='1';-- Zuweisung der Ausgänge
395
              ausgabe2<='0';
396
              ausgabe3<='0';
397
              ausgabe4<='1';
398
              blabla<="0100";
399
                impulspb<='0';
400
              
401
      when z5 =>  if pb='1'     --statt a freigabe von 100ms !!!!
402
              then zneu <=z6;
403
              else zneu <=z5;
404
              end if;    
405
              ausgabe1<='1';-- Zuweisung der Ausgänge
406
              ausgabe2<='0';
407
              ausgabe3<='0';    
408
              ausgabe4<='0';
409
              blabla<="0101";
410
                impulspb<='1';
411
                  
412
      when z6 =>  if t10hzpb1='1'     --statt a freigabe von 100ms !!!!
413
              then zneu <=z7;
414
              else zneu <=z6;
415
              end if;
416
              ausgabe1<='0';-- Zuweisung der Ausgänge
417
              ausgabe2<='0';
418
              ausgabe3<='1';
419
              ausgabe4<='1';
420
              blabla<="0110";
421
                impulspb<='0';
422
423
      when z7 =>  if pb='1'     --statt a freigabe von 100ms !!!!
424
              then zneu <=z7;
425
              else zneu <=z8;
426
              end if;
427
              ausgabe1<='0';-- Zuweisung der Ausgänge
428
              ausgabe2<='0';
429
              ausgabe3<='0';
430
              ausgabe4<='0';
431
              blabla<="0111";
432
                impulspb<='1';
433
434
      when z8 =>  if t10hzpb1='1'   --statt a freigabe von 100ms !!!!
435
              then zneu <=z1;
436
              else zneu <=z8;
437
              end if;
438
              ausgabe1<='0';-- Zuweisung der Ausgänge
439
              ausgabe2<='0';
440
              ausgabe3<='0';
441
              ausgabe4<='1';
442
              blabla<="1000";
443
                impulspb<='0';
444
445
446
  end case;
447
  end process;
448
-----------------------------------------------------------------------------------------------  
449
  
450
  takt:process (clk)  --Erzeugung des Taktes für die Entprellung
451
    begin
452
      if reset='1' then count<=0;
453
      
454
      elsif ausgabe4 ='1' then      
455
        if (rising_edge(clk))then        --wenn steigene Flange von Clock dann zählen
456
          if(count  < t10hz ) then          --vergleiche zähler mit maximalen wert
457
          count  <= count+1;              --addiere 1 auf zähler
458
          else
459
          clkoutpb  <=not clkoutpb ;            --
460
        count  <=0;                  -- setze zähler auf 0
461
          end if;
462
        end if;
463
      end if;    
464
end process takt;
465
466
--ERZEUGUNG TON
467
process begin 
468
wait until rising_edge(clk);  -- kommenden Takt abwarten 
469
if(c < 99999)then
470
c <= c + 1;    -- solange 99999 nicht erreicht, weiter zählen 
471
else          -- wenn Zählerende erreicht: 
472
c <= 0;      -- Zähler zurücksetzen 
473
x <= not x;      -- Signal x togglen 
474
end if; 
475
if( d < 49999) then
476
d <= d + 1;    -- solange 49999 nicht erreicht, weiter zählen 
477
else          -- wenn Zählerende erreicht: 
478
d <= 0;      -- Zähler zurücksetzen 
479
y <= not y;      -- Signal y togglen 
480
end if; 
481
end process; 
482
483
  
484
--VERKNÜPFUNG
485
process (TonF1K,TonF05K,Ton1000,Ton0500 )
486
  begin
487
  
488
    if 
489
    TonF1K='1' and TonF05k='0'  then
490
    Ton <= Ton1000  after 1 ns, '0' after 1000 ms;
491
   elsif
492
    TonF1K='0' and TonF05k='1'  then
493
    Ton <= Ton0500 after 1 ns, '0' after 1000 ms;
494
   else
495
    Ton <='0';
496
   end if;
497
498
   
499
  end process;
500
  
501
--DEKODER
502
process (qint, PB_Balken) 
503
begin 
504
Led <= "00000000"; 
505
if(PB_Balken = '1')then          -- Punkt-Betrieb 
506
case qint is 
507
when "0000" => Led <= "00000001";  -- Nur erste Led an 
508
when "0001" => Led <= "00000010";  -- Nur zweite Led an 
509
when "0010" => Led <= "00000100";  -- Nur dritte Led an 
510
when "0011" => Led <= "00001000";  -- Nur vierte Led an 
511
when "0100" => Led <= "00010000";  -- Nur fünfte Led an 
512
when "0101" => Led <= "00100000";  -- Nur sechste Led an 
513
when "0110" => Led <= "01000000";  -- Nur siebte Led an 
514
when "0111" => Led <= "10000000";  -- Nur achte Led an 
515
when others => Led <= "00000000";  -- Alle Led's aus 
516
end case; 
517
518
else                -- Balken-Betrieb 
519
case qint is 
520
when "0000" => Led <= "00000001";  -- Erste Led an 
521
when "0001" => Led <= "00000011";  -- Zweite Led an 
522
when "0010" => Led <= "00000111";  -- Dritte Led an 
523
when "0011" => Led <= "00001111";  -- Vierte Led an
524
when "0100" => Led <= "00011111";  -- Fünfte Led an 
525
when "0101" => Led <= "00111111";  -- Sechste Led an 
526
when "0110" => Led <= "01111111";  -- Siebte Led an 
527
when "0111" => Led <= "11111111";  -- Achte Led an
528
when others => Led <= "00000000";  -- Alle Led's aus 
529
end case; 
530
531
end if; 
532
end process; 
533
534
535
536
  
537
takt10hzb <= clkoutb;  
538
a_out    <=  ausgabe;
539
takt10hza <= clkout;
540
PB_Balken  <=  ausgabe1 ;
541
TonF1k    <=  ausgabe2 ;
542
TonF05k    <=  ausgabe3 ;
543
takt10hzpb   <= clkoutpb ;  
544
Ton0500 <= x;        -- Signal x an Ton0500 übergeben 
545
Ton1000 <= y;        -- Signal y an Ton1000 übergeben 
546
end Behavioral;

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


Lesenswert?

Jack D. schrieb:
> was meines erachtens für ein Clock Problem spricht.
Ich tippe auf den beliebtesten aller Anfängerfehler: asynchrone 
Eingänge.
Probier mal,  die Eingänge einzutakten...

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


Lesenswert?

Nochmal drauf geschaut...
Dazu ein asynchroner kombinatorischer Reset. Und zudem irgendein 
asynchroner abgeleiteter Takt. Das läuft in der Praxis niemals stabil:
 if impulspb='1' then t10hzpb1<='0';
elsif falling_edge (takt10hzpb) then
     t10hzpb1<=not t10hzpb1;
end if;

Such mal nach "Postulate" hier im Forum. Eines davon ist: nur 1 Takt im 
ganzen Design.
Und jede Missachtung eines der anderen Postulate führt ebenfalls zu 
Fehlern,  die eine Simulation nicht findet...

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

@Jack D. (jack99)

"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

Taktung FPGA/CPLD

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


Lesenswert?

Noch 2 Worte dazu:
1
if reset='1' then counta<=0;    
2
   elsif freigabetimer='1'  then    
3
            if (rising_edge(clk))then        --wenn steigene Flange von Clock dann zählen
4
                    if(counta < t10hz_a) then          --vergleiche zähler mit maximalen wert
5
                                  counta <= counta+1;          --addiere 1 auf zähler
6
                                  elsif counta=t10hz_a then
7
                                  clkout <= not clkout;            
8
                                  counta <=0;  
9
                    end if;
10
            end if;
11
end if;
1. so werden in FPGAs keine Takte erzeugt. Das ist "bad design 
practice"...
2. Wo hast du diese Art der Beschreibung eines Clock-Enables gefunden?

Zum Them "Reset" speziell auf dem Spartan3 sieh dir mal den 
Beitrag "Xilinx und die Resets" und sieh dir auch die darin 
enthaltenen Links einmal genauer an.

Und dann noch diese recht gefährliche Stelle hier:
1
use ieee.numeric_std.all;
2
use ieee.std_logic_arith.all;
3
use ieee.std_logic_unsigned.all;
Dazu z.B. der Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Die numeric_std hat alles was du zum Rechnen und zum Wandeln zwischen 
den Datentypen brauchst:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

Sieh dir einfach mal an, wie ich einen Drehgeber auswerte:
http://www.lothar-miller.de/s9y/categories/46-Encoder
Dort siehst du auch im ersten Beispiel, dass man Vieles simulieren kann, 
was letztlich aber der Synthesizer nicht auf Hardware abgebildet 
bekommt.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich habe aucham Rotary Knob meine experimente gemacht.
Da gibt es zwei Knackpunkte. Auf meiner PCB fehlten Pull-up Widerstände.
Da musste ich die internen Widerstände im UCF file aktivieren.

Und das zweite sind Glitches beim Schalter durch den Schaltvorgang.
Da hilft ein gray-Code Coder.
Sehr schön von Ken Chapman erklärt.

http://www.eng.utah.edu/~cs3710/xilinx-docs/examples/s3esk_rotary_encoder_interface.pdf

von Falk B. (falk)


Lesenswert?

@  René D. (Firma: www.dossmatik.de) (dose)

>Und das zweite sind Glitches beim Schalter durch den Schaltvorgang.
>Da hilft ein gray-Code Coder.

Den braucht man IMMER! Siehe Drehgeber.
Außerdem ist ein ein Gray-DEcoder, denn der Drehgeber geibt schon 
Gray-Code aus.

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.