2 Verschiedene Zählschleifen für FPGA

Gast #3636830
Lesenswert?

Hallo, guten Tag.
Ich habe hier 2 verschiedene Programme wo die 8 LED hochgezählt werden
und dann bei 255 wieder gelöscht werden und wieder von vorn geginnen.
Beide funktionieren.

Dies ist ein Programm aus einem Buch:
1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity binary_led is 
6
    Port ( clk  : in  STD_LOGIC; 
7
           leds : out STD_LOGIC_VECTOR(7 downto 0)); 
8
end binary_led; 
9
 
10
architecture Behavioral of binary_led is 
11

12
signal c : integer range 0 to 4999999 := 0; 
13
signal x : integer range 0 to 255 := 0;  
14

15
begin 
16
   process begin  
17
      wait until rising_edge(clk); 
18
      if (c<4999999 ) then        
19
        c <= c+1;                  
20
      else                         
21
        c <= 0;                    
22
        if (x<255) then            
23
          x <= x+1;               
24
        else
25
          x <= 0;                  
26
        end if;
27
      end if; 
28
   end process; 
29
   -- Signal konvertieren und casten und an LEDs ausgeben 
30
   leds <= std_logic_vector(to_unsigned(x,8)); 
31
end Behavioral;

Dann habe ich hier dieses Programm so umgeschrieben das der Rangewert
zum Zählen benutzt wird ohne eine IF:
1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity binary_led is 
6
    Port ( clk  : in  STD_LOGIC; 
7
           leds : out STD_LOGIC_VECTOR(7 downto 0)); 
8
end binary_led; 
9
 
10
architecture Behavioral of binary_led is 
11

12
signal c : integer range 0 to 4999999 := 0; 
13
signal x : integer range 0 to 255 := 0;  
14

15
begin 
16
   process begin  
17
      wait until rising_edge(clk); 
18
      c <= c+1;   
19
      if (c=1 ) then                                               
20
        x <= x+1;                              
21
      end if; 
22
   end process; 
23
   -- Signal konvertieren und casten und an LEDs ausgeben 
24
   leds <= std_logic_vector(to_unsigned(x,8)); 
25
end Behavioral;

Auch haben sich die Warnmeldungen von "11" bei beiden =rogrammen nicht 
geändert.

Was könnte hier bei meinem umgesetzten Programm für ein Fehler 
auftreten?

Danke.
GRuss
Moderator (Firma: Titel) Persönliche Seite #3636871
Lesenswert?

peter schrieb:
> Dann habe ich hier dieses Programm so umgeschrieben das der Rangewert
> zum Zählen benutzt wird ohne eine IF
Es wäre zwar schön, aber das funktioniert nicht.

> Was könnte hier bei meinem umgesetzten Programm für ein Fehler
> auftreten?
Du wirst in der Simulation für beide Zähler einen Fehler beim 
Erreichen des Wertebereichs bekommen. Es wird natürlich gelich beim 
ersten Überlauf des Zählers c abgebrochen, so dass du den Effekt für den 
Zähler x nicht beobachten kannst.
Der Zähler c wird in der Realität weiter zählen bis 67108863 und dann 
erst überlaufen. Du solltest also beobachten können, dass die LEDs 
langsamer als erwartet weiterschalten. Nämlich bei 50MHz Taktfrequenz 
nur alle 1,342 Sekunden statt wie erwartet mit jeder Sekunde...

> Dies ist ein Programm aus einem Buch
Ach Peter komm, es ist KEIN Programm.
Gast #3637112
Lesenswert?

Hallo habe jetzt den Zählerwert:
signal c : integer range 0 to 400000 := 0;  Zeit gestoppt ca 2.1
signal c : integer range 0 to 500000 := 0;  Zeit gestoppt ca 2,5

Auch die hochwandernden Zähler-LED verhalten sich nach meiner gestoppten 
Zeit.

Gibt es doch einen Überlauf nach meinem gestoppten Zeiten?
Warum sieht die Praxis jetzt anders aus wie die theoretische Aussage?

Gruss
Moderator (Firma: Titel) Persönliche Seite #3637435
Lesenswert?

peter schrieb:
> Dies ist ein Programm aus einem Buch
Auch in Büchern sind Fehler.

peter schrieb:
> Hallo habe jetzt den Zählerwert:
> signal c : integer range 0 to 400000 := 0;  Zeit gestoppt ca 2.1
> signal c : integer range 0 to 500000 := 0;  Zeit gestoppt ca 2,5
>
> Nachtrag bei : clk=50000000
Das passt irgendwie gar nicht zusammen. Schon die 2,5 Sekunden bei 50MHz 
passen nicht zum Range. Was kommt raus, wenn der Zähler bei 49999999 
zurückgesetzt wird?
Gast #3637526
Lesenswert?

------------------------------------------------------
passen nicht zum Range. Was kommt raus, wenn der Zähler bei 49999999 -
------------------------------------------------------
Da stoppe ich ca 255 Sekunden wenn alle 8 LED'S an in.


Vielleicht hast du das oben nicht verstanden, ich habe die Zeit gestoppt 
wenn alle 8 LED'S an sind: 1/50000000*400000*255 oder 
1/50000000*500000*255

Gruss
Gast #3637684
Lesenswert?

Ich kenne den Inhalt des Compilers nicht von Quartus und kann auch nicht 
nachlesen was in den letzten Versioenn dort anders gemacht worden ist.

Mir macht die Unkenntnis nichts aus, ich habe das Ergebnis eigentlich 
auch so erwartet. Aber die Firmen die sich damit rumschlagen müssen. Da 
müsst ihr dann schon tätig werden damit nicht dem Kunden so etwas 
aufgetischr wird zwischen Theorie und Praxis. Heute ist man als Firma 
sonst schnell weg vom Fenster, Twitter....Facebook und andere... sorgen 
dafür.

Gruss
#3638259
Lesenswert?

peter schrieb:
> Da
> müsst ihr dann schon tätig werden damit nicht dem Kunden so etwas
> aufgetischr wird zwischen Theorie und Praxis.

Was schimpfst Du da herum ohne Dich auszukennen!
VHDL ist eben eine Sprache zur Verifikation von Hardware.
1
 
2
signal c : integer range 0 to 4999999 := 0;
bedeutet, dass der Wert von c im Betrieb immer im  Bereich von 0 bis 
4999999 bleiben und dass bei der Simulation ein Fehler gemeldet werden 
muss, wenn dieser Bereich verlassen wird.
Es bedeutet NICHT, dass bei erreichen von 4999999 wieder bei 0 
weitergezählt wird.

Das Nicht-Behandeln des Überlaufs ist ein FEHLER im Entwurf und den will 
man bei der Simulation entdecken!

Nur weil Deine Vorstellungen nicht getroffen werden, muss etwas noch 
lange nicht falsch sein.
Moderator (Firma: Titel) Persönliche Seite #3638342
Lesenswert?

Klaus Falser schrieb:
> bedeutet, dass der Wert von c im Betrieb immer im  Bereich von 0 bis
> 4999999 bleiben und dass bei der Simulation ein Fehler gemeldet werden
> muss, wenn dieser Bereich verlassen wird.
Und es bedeutet, dass tortzdem ein Fehler bei der Simulation auftauchen 
wird und muss, auch wenn der implizite(!) Überlauf in der Hardware 
"automatisch" (und ressourcenaufwendig) behandelt wird.

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