Forum: FPGA, VHDL & Co. Fehler durch Signalabgreifen


von Flachmann (Gast)


Lesenswert?

Hallo,
ich habe folgendes Problem.
Um diverse Messungen durchzuführen brauche ich 2 Zählschleifen. Die eine 
zählt mir die Anzahl der Loops und die andere die Anzahl an clk_cycles 
in jedem Loop. Die Werte beider Counter müssen abgegriffen werden um 
diverse Switches zu setzen. Nun habe ich das folgende Problem.
Der Gesamtaufbau läuft einwandfrei und hört immer genau passend nach 
"set_n_samples" (dieser wert wird über twi gesetzt) auf.
Sobald ich nun aber die Werte der Counter abgreife "verzählt" sich 
alles.
setze ich n_samples höher als 65535 so stoppt alles immer nach einer 
bestimmten zeit, wobei mir unergründlich ist warum ausgerechnet an 
diesem zeitpunkt. manchmal hört der aufbau auch ganricht auf zu zählen.
ich habe ein paar tests vorgenommen und im folgenden ist dies 
rausgekommen("-" steht für "hält nicht an):
5->-
6->3
7->4
8->-
9->-
10->7
11->8
12->-
13->-
14->7
Ich habe absolut keine Ahnung wodran das liegt und hoffe ich kann hier 
Hilfe bekommen. Das ganzemuss bis Ende der Woche fertig sein.

Würde es vll. helfen die Counterwerte vorher noch extra in Latches zu 
legen? Ich bin mittlerweile echt ratlos. Der angehängte Code ist auch 
nur einer mehrerer Auswüchse um dem Problem Herr zu werden

Mit freundlichen Grüßen

Das ist der Code nur mit Counter:
1
    --start/stop pulsing      
2
    -- convert start signal
3
    process(reset, start)--, help_2)
4
    begin
5
      if reset='0' then
6
        start_signal<='0';
7
      elsif rising_edge(start) then
8
        if start_signal = '0' then
9
          start_signal<='1';
10
        end if;
11
      end if;
12
      if help_2='1' then
13
        start_signal<='0';
14
      end if;
15
    end process;
16
17
18
    ---- count_clks ----
19
    process(global_clk, reset) --, start_signal, reset)
20
    begin
21
      if reset = '0' then
22
        counter<=0;
23
      elsif start_signal='0' then
24
        counter<=1999;
25
      elsif start_signal='1' then
26
        if counter=0 then
27
          counter<=1999;
28
        elsif rising_edge(global_clk) and counter>0 then
29
          counter<=counter-1;  
30
        end if;
31
      end if;
32
    end process;
33
    
34
    --help counter/stopper
35
    process(global_clk, reset)
36
    begin
37
      if reset='0' then
38
        help<='0';
39
        help_2<='0';
40
      else
41
        if (counter = 0) then
42
          help<='1';
43
        else
44
          help<='0';
45
        end if;
46
        
47
        if (stopper = 0) then
48
          help_2<='1';
49
        elsif start_signal='0' then 
50
          help_2<='0';
51
        end if;
52
      end if;
53
    end process;
54
    
55
    ---- samples counter ----
56
    process(help, reset) --,counter, start_signal)
57
    begin
58
      if reset = '0' then
59
        stopper<=-1;
60
      elsif start_signal='0' then
61
        stopper<=-1;
62
      elsif start_signal='1' then
63
        if stopper=(-1) then
64
          stopper<=set_n_samples;
65
        elsif rising_edge(help) then
66
          stopper<=stopper-1;
67
        end if;
68
      end if;
69
    end process;

Hier der Teil der die Counter auswertet:
1
    -- generate pulses
2
    -- events
3
--    process(counter, reset)
4
--    begin
5
--      if reset='0' then
6
--        event_1<='0';
7
--      else 
8
--        if counter < 1600 then
9
--          event_1<='1';
10
--        else
11
--          event_1<='0';
12
--        end if;
13
--        if counter < (1600 - set_pw) then
14
--          event_2<='1';
15
--        else
16
--          event_2<='0';
17
--        end if;
18
--        if counter < (1600 - set_delay) then
19
--          event_3<='1';
20
--        else
21
--          event_3<='0';
22
--        end if;
23
--        if counter < (1600 - set_pw  - set_delay) then
24
--          event_4<='1';
25
--        else
26
--          event_4<='0';
27
--        end if;
28
--        if counter <(1000 + (set_pw/2)) then
29
--          event_5<='1';
30
--        else
31
--          event_5<='0';
32
--        end if;
33
--        if counter <(1000 - (set_pw/2)) then
34
--          event_6<='1';
35
--        else
36
--          event_6<='0';
37
--        end if;
38
--      end if;
39
--    end process;
40
    
41
    --convert events to pulses
42
--    process(event_1,event_2,event_3,event_4,event_5,event_6, reset, start_signal)
43
--    begin
44
--      if reset='0' or start_signal='0' then
45
--        TX_22<='0';
46
--        TX_35<='0';
47
--        TX_TR_22<='0';
48
--        TX_TR_35<='0';
49
--        LO_22<='0';
50
--        LO_35<='0';
51
--        RX_TR_22<='0';
52
--        RX_TR_35<='0';
53
--        ADC_Trigger<='1';      
54
--      else
55
--        case set_mode is
56
--          when "001" => -- copolar
57
--            TX_22<=event_1 and not(event_2);
58
--            TX_35<=event_1 and not(event_2);
59
--            TX_TR_22<=event_1 and not(event_2);
60
--            TX_TR_35<=event_1 and not(event_2);
61
--          
62
--            LO_22<=event_3 and not(event_4);
63
--            LO_35<=event_3 and not(event_4);
64
--            RX_TR_22<=event_3 and not(event_4);
65
--            RX_TR_35<=event_3 and not(event_4);
66
--            ADC_Trigger<=not(event_3 and not(event_4));
67
--                
68
--          when "010" => -- crosspolar
69
--            TX_22<=event_1 and not(event_2);
70
--            TX_35<=event_1 and not(event_2);
71
--            TX_TR_22<=event_1 and not(event_2);
72
--            TX_TR_35<=event_1 and not(event_2);
73
--          
74
--            LO_22<=event_3 and not(event_4);
75
--            LO_35<=event_3 and not(event_4);
76
--            RX_TR_22<=event_3 and not(event_4);
77
--            RX_TR_35<=event_3 and not(event_4);
78
--            ADC_Trigger<=not(event_3 and not(event_4));
79
--        
80
--          when "011" => -- calibrate
81
--            TX_22<=event_1 and not(event_2);
82
--            TX_35<=event_1 and not(event_2);
83
--            LO_22<=event_1 and not(event_2);
84
--            LO_35<=event_1 and not(event_2);
85
--            ADC_Trigger<=not(event_1 and not(event_2));
86
--        
87
--          when "100" => -- radiometer
88
--            LO_22<=event_5 and not(event_6);
89
--            LO_35<=event_5 and not(event_6);
90
--            RX_TR_22<=event_5 and not(event_6);
91
--            RX_TR_35<=event_5 and not(event_6);
92
--            ADC_Trigger<=not(event_5 and not(event_6));
93
--          
94
--          when others =>
95
--          
96
--        end case;
97
--      end if;
98
--    end process;
99
--  
100
--    -- set hv switch
101
--    process(reset, stopper, start_signal, modulator, event_2)
102
--    begin
103
--      if reset='0' or start_signal='0' then
104
--        POL_22<='0';
105
--        POL_35<='0';
106
--      else
107
--        case set_mode is
108
--          when "001" => -- copolar
109
--            if stopper mod 2 = 1 then
110
--              POL_22<='1';
111
--              POL_35<='1';
112
--            else
113
--              POL_22<='0';
114
--              POL_35<='0';
115
--            end if;
116
--                          
117
--          when "010" => -- crosspolar
118
--            if (event_2='1' and modulator='1') or (event_2='0' and modulator='0') then
119
--              POL_22<='1';
120
--              POL_35<='1';
121
--            else
122
--              POL_22<='0';
123
--              POL_35<='0';
124
--            end if;
125
--          
126
--          when "011" => -- calibrate
127
--            POL_22<='0';
128
--            POL_35<='0';
129
--          
130
--          when "100" => -- radiometer
131
--            if stopper mod 2 = 1 then
132
--              POL_22<='1';
133
--              POL_35<='1';
134
--            else
135
--              POL_22<='0';
136
--              POL_35<='0';
137
--            end if;
138
--          
139
--          when others =>
140
--        
141
--        end case;
142
--      end if;        
143
--    end process;

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


Lesenswert?

1
     elsif rising_edge(start) then
2
     :
3
        elsif rising_edge(global_clk) and counter>0 then
4
     :
5
        elsif rising_edge(help) then
Böse, böse: viele verschiedene Takte.
Genauso böse: Takt aus Kombinatorik abgeleitet (help).
1
      if reset = '0' then
2
        counter<=0;
3
      elsif start_signal='0' then
4
        counter<=1999;
5
      elsif start_signal='1' then
6
        if counter=0 then
7
          counter<=1999;
8
        elsif rising_edge(global_clk) and counter>0 then
Noch böser: kombinatorischer Reset.

Siehe dort:
http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozess
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

Dein Design ist durch diese Verknotungen zwar noch Verhaltensimulierbar 
(weil dort keine Laufzeiten und Timingverletzungen auftreten können), 
aber es wird niemals zuverlässig auf Hardware laufen. Mein Postulat:
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, der immer 
auf dieselbe Flanke aktiv ist. Es gibt keinen (und schon gar keinen 
asynchronen) Reset. Wenn du das einhältst, dann geht es.

BTW:
Das Design wird nicht mal richtig simuliert werden, denn hier ist die 
Sensitivliste falsch:
1
    process(global_clk, reset)
2
    begin
3
      if reset='0' then
4
        help<='0';
5
        help_2<='0';
6
      else
7
        if (counter = 0) then
8
        :
9
        end if;
10
        
11
        if (stopper = 0) then
12
        :
13
        end if;
14
      end if;
15
    end process;
Der global_clk wird im Prozess gar nicht verwendet, dafür fehlen 
counter und stopper. Dieser Prozess wird in der Simulation aussehen 
wie wenn er getaktet wäre, weil er ja mit einer Änderung von 
global_clk neu berechnet wird. Dieses Verhalten ist aber falsch.

von Klaus Falser (Gast)


Lesenswert?

Handelt es sich bei Dir um ein Problem mit der Simulation oder mit der 
Hardwae?
Mich wundert es nämlich, ob das folgende wirklich synthetisierbar ist:
1
    process(global_clk, reset) --, start_signal, reset)
2
    begin
3
      if reset = '0' then
4
        counter<=0;
5
      elsif start_signal='0' then
6
        counter<=1999;
7
      elsif start_signal='1' then
8
        if counter=0 then
9
          counter<=1999;
10
        elsif rising_edge(global_clk) and counter>0 then
11
          counter<=counter-1;  
12
        end if;
13
      end if;
14
    end process;

Normalerweise sollte das so aussehen :
1
    process(clk, reset)
2
    begin
3
      if reset = '0' then
4
        counter<=0;
5
      elsif rising_edge(global_clk) then
6
        if start_signal='0' then
7
           counter<=1999;
8
        elsif counter > 0 then  
9
          counter<=counter-1;
10
        else 
11
           counter<=1999;
12
        end if;  
13
      end if;
14
    end process;

Ich würde Dir stark empfehlen, den Reset-Zweig zu überarbeiten, sodass 
das
das ganze Rücksetzen des Zählers synchron zum Takt arbeitet.

von Flachmann (Gast)


Lesenswert?

Klaus Falser schrieb:
> Normalerweise sollte das so aussehen :    process(clk, reset)
>     begin
>       if reset = '0' then
>         counter<=0;
>       elsif rising_edge(global_clk) then
>         if start_signal='0' then
>            counter<=1999;
>         elsif counter > 0 then
>           counter<=counter-1;
>         else
>            counter<=1999;
>         end if;
>       end if;
>     end process;

so sah es anfangs aus. da es nicht funktioniert hat habe ich es halt 
umgeschrieben.

vielen dank für die antworten. wo die möglichkeit bestand habe ich die 
tipps umgesetzt bzw teile neugeschrieben.

aber es ist immernoch so, dass richtig gezählt wird wenn ich die werte 
nicht abgreife. implementiere ich nur das erste event, dann funktioniert 
es noch.
aber sobald alle laufen herrscht wieder großes chaos.

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


Lesenswert?

Wieviele Takte hast du?
Mehr als 1?

von Flachmann (Gast)


Lesenswert?

es gibt 2 takte. der eine hat 100MHz , global_clk und ist nur zur 
pulserzeugung da. das muss halt auf 10 ns genau sein.
der takt wird auf 1MHz runtergetaktet. dieser takt ist nur für die 
datenverarbeitung zuständig.
aus dem "datensegment" kommt dann auch der kurze startpuls, der 
umgeformt wird in ein sagen wir start_enable. die counter laufen während 
dieser high ist. wenn die n_samples abgelaufen sind muss das enable 
zurück gesetzt werden.

jetzt habe ich gerade einw enig ausprobiert und mir ist aufgefallen, 
dass ich den counter mit maximal 2 abfragen belasten darf. durch 
schreiben des counterwertes in ein latch kann ich dann auch 3 abfragen 
erreichen.
dummerweise komme ich nicht unter den angegebenen 6 davon.

sobald ich auf 4 abfragen gehe ist irgendetwas nicht mehr koscher.

von Klaus F. (kfalser)


Lesenswert?

Flachmann schrieb:
> jetzt habe ich gerade einw enig ausprobiert und mir ist aufgefallen,
> dass ich den counter mit maximal 2 abfragen belasten darf. durch
> schreiben des counterwertes in ein latch kann ich dann auch 3 abfragen
> erreichen.
> dummerweise komme ich nicht unter den angegebenen 6 davon.

Jetzt erzähle uns doch bitte einmal wie Du darauf kommst:
- Simulation oder Hardware, aber diese VHDL Files sollte man so 
eigentlich nicht ohne Warnungen oder Fehler durch die Synthese bekommen.
- Welcher Simulator
- Welche Hardware

Gerade beim Simulieren kann man viele Sachen sehen, dann schaut man sich 
den Zeitpunkt an bis wohin es stimmt und dann versucht man zu verstehen 
was an dieser Stelle falsch läuft.

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


Lesenswert?

> es gibt 2 takte.
D.h. die ganzen andern abfragen auf rising_edge sind jetzt raus? 
Alles, was mit rising_egde oder falling_edge oder 'event abgefragt wird, 
ist ein Takt.

> der eine hat 100MHz , global_clk und ist nur zur
> pulserzeugung da. das muss halt auf 10 ns genau sein.
> der takt wird auf 1MHz runtergetaktet.
Dann ändere dein Design so, dass aus dem 1 MHz Takt ein 1 MHz 
Clock-Enable wird. Erst dann ist das Design richtig synchron und 
handhabbar.

> jetzt habe ich gerade einw enig ausprobiert und mir ist aufgefallen,
> dass ich den counter mit maximal 2 abfragen belasten darf.
Innerhalb des FPGAs ist der Fan-Out wesentlich höher (min. 50) und falls 
nötig werden von der Toolchain die Signale einfach dupliziert. Mit 
asynchronen Abfragen auf den Counter und daraus resultierenden Resets 
wirst du aber garantiert Probleme mit Glitches bekommen...
Und genauso sieht deine Fehlerbeschreibung aus  :-o

von Flachmann (Gast)


Lesenswert?

Die Simulation funktioniert ja einwandfrei.
Ich benutze ModelSim 6.4b.
Das ganze läuft auf einem XC2C512-PQ208.

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


Lesenswert?

> Die Simulation funktioniert ja einwandfrei.
Mit dem obigen Code? Dann wundert mich nichts, denn die Simulation ist 
falsch. Siehe meine Anmerkungen oben:
>>> Dieser Prozess wird in der Simulation aussehen wie wenn er getaktet wäre
 :-o

von Flachmann (Gast)


Lesenswert?

Lothar Miller schrieb:
> Mit
> asynchronen Abfragen auf den Counter und daraus resultierenden Resets
> wirst du aber garantiert Probleme mit Glitches bekommen...

Der vorzufindende reset wird extern von einem µC erzeugt. Er dient nur 
dazu das Ganze hart zu reseten. aus den abfragen heraus werden keine 
resets generiert. wenn doch, dann erklär mit bitte wie das passiert.

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


Lesenswert?

> wenn doch, dann erklär mit bitte wie das passiert.
Das ist ein asynchroner kombinatorischer Reset:
1
      if reset = '0' then
2
        counter<=0;
3
      elsif start_signal='0' then
4
        counter<=1999;
5
      elsif start_signal='1' then
6
        if counter=0 then
7
          counter<=1999;
8
        elsif rising_edge(global_clk) and counter>0 then
9
          counter<=counter-1;  
10
        end if;
11
      end if;
Bestehend aus dem counter und dem startsignal.

Der Knackpunkt in der Hardware ist aber hier:
1
        if counter=0 then
2
          counter<=1999;
3
        elsif rising_edge(global_clk) and counter>0 then
4
          counter<=counter-1;  
5
        end if;
Denn wenn der Counter z.B. von binär 0001111 nach 0010000 zählt und nur 
kurz einen Glitch mit 00000000 erzeugt, was passiert dann? Ratzdifatz: 
der Counter ist für ein paar ps lang 0 und er wird auf 1999 gesetzt 
(oder wenigstens ein paar FFs des Counters.

von Flachmann (Gast)


Lesenswert?

ja das seh ich auch ein. aber warum treten dann die glitches nur auf 
wenn ich die abfragen für die anderen signale ala if counter<1600 
then...
auf den counter lege? bei bis zu 2 abfragen scheinen ja keine glitches 
aufzutreten. warum aber bei mehreren abfragen?

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


Lesenswert?

> warum aber bei mehreren abfragen?
Weil dann die Signale intern anders oder mehr belastet werden. Das Ganze 
ist z.B. auch temperaturabhängig und spannungsabhängig. Kurz: unsauber.

Es könnte schon reichen, dass du irgendwas änderst und deshalb das 
Design ein klein wenig anders platziert und gerouted wird und dann nicht 
mehr zuverlässig läuft. Und voila: du suchst den Fehler an der falschen 
Stelle, weil du meinst "vor der letzten Änderung ist es noch 
gegangen...".

von Flachmann (Gast)


Lesenswert?

ah ja gut. ich dachte nicht, dass die belastung direkt mit den races zu 
tun hat und auch nich, dass die races an besagten stellen auftreten. ich 
hoffe das löst das problem. dankeschön!

von Flachmann (Gast)


Lesenswert?

so,das problem ist immernoch das gleiche. der code sieht mittlerweile 
folgendermaßen aus. jemand eine idee?
1
  --start/stop pulsing      
2
    -- convert start signal
3
    process(reset, global_clk)-- help_2,stop)
4
    begin
5
      if reset='0' then
6
        start_signal<='0';
7
      elsif rising_edge(global_clk) then
8
        if start_signal = '0' and start='1' then
9
          start_signal<='1';
10
        elsif stop_event='1' then
11
          start_signal<='0';  
12
        end if;
13
      end if;
14
    end process;
15
    
16
    --generate stop_signal
17
    process(reset, global_clk)
18
    begin
19
      if reset='0' then
20
        stop_event<='0';
21
      elsif rising_edge(global_clk) then
22
        if stopper >= set_n_samples then
23
          stop_event<='1';
24
        else
25
          stop_event<='0';
26
        end if;
27
      end if;
28
    end process;
29
    
30
    ---- count_clks ----
31
    process(global_clk, reset)
32
    begin
33
      if reset='0' then
34
        counter <= 1999;
35
      elsif rising_edge(global_clk) then
36
        if start_signal='0' then
37
          counter<=1999;
38
        elsif start_signal = '1' then
39
          if counter = 0 then
40
            counter <= 1999;
41
          elsif counter>0 then
42
            counter <= counter-1;
43
          end if;
44
        end if;
45
      end if;  
46
    end process;
47
    
48
    ---- samples counter ----
49
    process(global_clk, reset)
50
    begin
51
      if reset = '0' then
52
        stopper<=0;
53
      elsif rising_edge(global_clk) then
54
        if start_signal = '0' then
55
          stopper<=0;
56
        elsif counter = 0 then
57
          stopper<=stopper+1;
58
        end if;
59
      end if;
60
    end process;
61
    
62
    -- generate pulses
63
    -- events
64
    process(global_clk, reset)
65
    begin
66
      if reset='0' then
67
        event_1<='0';
68
        event_2<='0';
69
        event_3<='0';
70
        event_4<='0';
71
        event_5<='0';
72
        event_6<='0';
73
      elsif rising_edge(global_clk) then
74
        if counter < 1600 then
75
          event_1<='1';
76
        else
77
          event_1<='0';
78
        end if;
79
        if counter < (1600 - set_pw) then
80
          event_2<='1';
81
        else
82
          event_2<='0';
83
        end if;
84
--        if counter < (1600 - set_delay) then
85
--          event_3<='1';
86
--        else
87
--          event_3<='0';
88
--        end if;
89
--        if counter_2 < (1600 - set_pw  - set_delay) then
90
--          event_4<='1';
91
--        else
92
--          event_4<='0';
93
--        end if;
94
--        if event_gen <(1000 + (set_pw/2)) then
95
--          event_5<='1';
96
--        else
97
--          event_5<='0';
98
--        end if;
99
--        if event_gen <(1000 - (set_pw/2)) then
100
--          event_6<='1';
101
--        else
102
--          event_6<='0';
103
--        end if;
104
      end if;
105
    end process;
106
    
107
    --convert events to pulses
108
    process(global_clk, reset, start_signal)
109
    begin
110
      if reset='0' or start_signal='0' then
111
        TX_22<='0';
112
        TX_35<='0';
113
        TX_TR_22<='0';
114
        TX_TR_35<='0';
115
        LO_22<='0';
116
        LO_35<='0';
117
        RX_TR_22<='0';
118
        RX_TR_35<='0';
119
        ADC_Trigger<='1';      
120
      elsif(rising_edge(global_clk)) then
121
        case set_mode is
122
          when "001" => -- copolar
123
            TX_22<=event_1 and not(event_2);
124
            TX_35<=event_1 and not(event_2);
125
            TX_TR_22<=event_1 and not(event_2);
126
            TX_TR_35<=event_1 and not(event_2);
127
          
128
            LO_22<=event_3 and not(event_4);
129
            LO_35<=event_3 and not(event_4);
130
            RX_TR_22<=event_3 and not(event_4);
131
            RX_TR_35<=event_3 and not(event_4);
132
            ADC_Trigger<=not(event_3 and not(event_4));
133
                
134
          when "010" => -- crosspolar
135
            TX_22<=event_1 and not(event_2);
136
            TX_35<=event_1 and not(event_2);
137
            TX_TR_22<=event_1 and not(event_2);
138
            TX_TR_35<=event_1 and not(event_2);
139
          
140
            LO_22<=event_3 and not(event_4);
141
            LO_35<=event_3 and not(event_4);
142
            RX_TR_22<=event_3 and not(event_4);
143
            RX_TR_35<=event_3 and not(event_4);
144
            ADC_Trigger<=not(event_3 and not(event_4));
145
        
146
          when "011" => -- calibrate
147
            TX_22<=event_1 and not(event_2);
148
            TX_35<=event_1 and not(event_2);
149
            LO_22<=event_1 and not(event_2);
150
            LO_35<=event_1 and not(event_2);
151
            ADC_Trigger<=not(event_1 and not(event_2));
152
        
153
          when "100" => -- radiometer
154
            LO_22<=event_5 and not(event_6);
155
            LO_35<=event_5 and not(event_6);
156
            RX_TR_22<=event_5 and not(event_6);
157
            RX_TR_35<=event_5 and not(event_6);
158
            ADC_Trigger<=not(event_5 and not(event_6));
159
          
160
          when others =>
161
          
162
        end case;
163
      end if;
164
    end process;
165
  
166
    -- set hv switch
167
    process(reset, global_clk, start_signal, modulator, event_2)
168
    begin
169
      if reset='0' or start_signal='0' then
170
        POL_22<='0';
171
        POL_35<='0';
172
      elsif rising_edge(global_clk) then
173
        case set_mode is
174
          when "001" => -- copolar
175
            if modulator = '1' then
176
              POL_22<='1';
177
              POL_35<='1';
178
            else
179
              POL_22<='0';
180
              POL_35<='0';
181
            end if;
182
                          
183
          when "010" => -- crosspolar
184
            if (event_2='1' and modulator='1') or (event_2='0' and modulator='0') then
185
              POL_22<='1';
186
              POL_35<='1';
187
            else
188
              POL_22<='0';
189
              POL_35<='0';
190
            end if;
191
          
192
          when "011" => -- calibrate
193
            POL_22<='0';
194
            POL_35<='0';
195
          
196
          when "100" => -- radiometer
197
            if modulator = '1' then
198
              POL_22<='1';
199
              POL_35<='1';
200
            else
201
              POL_22<='0';
202
              POL_35<='0';
203
            end if;
204
          
205
          when others =>
206
      
207
        end case;
208
      end if;        
209
    end process;
210
  
211
    process(global_clk)
212
    begin
213
      if rising_edge(global_clk) then
214
        if stopper mod 2 = 1 then
215
          modulator <= '1';
216
        else
217
          modulator <= '0';
218
        end if;
219
      end if;
220
    end process;

von Duke Scarring (Gast)


Lesenswert?

Flachmann schrieb:
> jemand eine idee?

Hast Du auch eine Testbench dazu?

Duke

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


Lesenswert?

Hmhmmmm:
      if reset='0' or start_signal='0' then

Aber weil start_signal synchron gesetzt wird, können schon mal keine 
Glitches mehr auftreten. Spannend könnte es allerdings werden, wenn 
start_signal auf '1' geht, dann wird ziemlich zeitgleich mit dem Takt 
der Reset weggenommen...

Was sagt denn die Synthese zum Thema "Maximalfrequenz des Designs"?

von Flachmann (Gast)


Lesenswert?

das dürfte doch egal sein. es passiert ja kein reset während 
start_signal auf 1 geht. zur maximalen freuenz hab ich in xilinx' ise 
jetzt leider ncihts gefunden. wo sollte das denn stehen? im 
synthetisierungsbericht stand nix drin..

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

im summary sollte es stehen, zumindest aber in der Konsole der ISE (das 
fenster ganz unten)

von Klaus F. (kfalser)


Lesenswert?

Flachmann schrieb:
> das dürfte doch egal sein. es passiert ja kein reset während
> start_signal auf 1 geht.

Doch, start_signal = 0 steht im Reset-Pfad der FFs, die davon 
betroffenen FFs werden asynchron mit start_signal = 0 zurückgesetzt.
Erst wenn start_signal auf '1' geht, werden die FF's für den Takt 
global_clk freigegeben.

von Flachmann (Gast)


Lesenswert?

aber die flipflops die durch start_signal gesteuert werden haben 
keinerlei rückwirkung auf die ganze zähleinheit. welche auswirkung kann 
das darauf haben, dass das signal stop_signal nicht mehr auf 1 gesetzt 
wird, weil die anzahl samples nicht mehr erreicht wird?

von SuperWilly (Gast)


Lesenswert?

Das wäre die bessere Variante:

1
if reset='0' then                      -- asynchroner reset
2
        
3
elsif rising_edge(global_clk) then
4
5
     if start_signal = '0' then        -- synchroner reset
6
7
     else
8
9
     end if;
10
end if;

Gruß,
SuperWilly

von Michael S. (Firma: www.das-labor.org) (laborsauron)


Lesenswert?

Hast du denn überhaupt deinen 100 Mhz Takt mit einer Period Constraint 
definiert. ?

Wenn ISE nicht weiss, wie schnell der Takt ist, dann gibt sich die 
Toolchain auch keine mühe beim Placen.

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


Lesenswert?

> Das wäre die bessere Variante:
Am besten wäre es, auf einen generellen (insbesondere asnychronen) Reset 
komplett zu verzichten. Dazu die Whitepapers WP272 und WP272 von Xilinx 
und hier im Beitrag "Theoriefrage asynchroner Reset"

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.