Forum: FPGA, VHDL & Co. 2 Verschiedene Zählschleifen für FPGA


von peter (Gast)


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

von Martin (Gast)


Lesenswert?

Weder bei  c  noch  bei  x wird der Überlauf  behandelt.

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


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.

: Bearbeitet durch Moderator
von peter (Gast)


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

von peter (Gast)


Lesenswert?

Nchtrag bei : clk=50000000

von peter (Gast)


Lesenswert?

Nachtrag bei : clk=50000000

von peter (Gast)


Lesenswert?

Hmmm...:
----------------------------------------
Dies ist ein Programm aus einem Buch
----------------------------------------

Im Buch steht : "Schlagen sie zu diesenm Program im Kapitel 7 nach.

Gruss

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


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?

von Olga (Gast)


Lesenswert?

Meinst du, Herr Bierbauch, unangemeldet erkennt dich keiner?

von peter (Gast)


Lesenswert?

---------------------------------
Meinst du, Herr Bierbauch, unangemeldet erkennt dich keiner?----
--------------------------------

Ach der schon wieder mit seinem Schlapphut...ha...ha...

von peter (Gast)


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

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


Lesenswert?

peter schrieb:
> Warum sieht die Praxis jetzt anders aus wie die theoretische Aussage?
Das sagt dir der RTL Schaltplan.
Evtl. ist der Synthesizer schon so schlau und erkennt deine Absicht...

von peter (Gast)


Lesenswert?

Hmm... Quatus 13 ist ja auch schon eine hohe Version ,könnte man der 
zutrauen.

von peter (Gast)


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

von Klaus F. (kfalser)


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.

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


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.

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.