Forum: FPGA, VHDL & Co. VHDL-Anfänger verzweifelt an einfachem LED-Zähler


von trollo (Gast)


Lesenswert?

Folgenden code habe ich mir hier www.youtube.com/watch?v=Ob7B6x5g6tw 
abgeguckt.

Eigentlich idiotensicher, doch nicht bei mir :)
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity Main is
7
  port (
8
    CLK : in std_logic;
9
    OUT_LED : out std_logic_vector(254 downto 0)
10
  );
11
end Main;
12
13
architecture Behavioral of Main is
14
  signal COUNTER: std_logic_vector(254 downto 0);
15
  signal PRESCALER: std_logic_vector(31 downto 0);
16
begin
17
18
  CounterProcess: process (CLK)
19
  begin
20
    if rising_edge(CLK) then
21
      if PRESCALER < "100110001001011010000000" then
22
        PRESCALER <= PRESCALER + 1;
23
      else
24
        PRESCALER <= (others => '0');
25
        COUNTER <= COUNTER + 1;
26
      end if;
27
    end if;
28
  end process;
29
  
30
  OUT_LED <= COUNTER;
31
32
end Behavioral;


Ich habe einen 10MHz Takt der eine (!) LED im Sekundentakt (da Prescaler 
auf 10.000.000) zum Leuchten bringt (1 Sek. an 1 Sek. aus => Takt ok).

Wie schaff ich es, die 255 LEDs hochzuzählen...

von Bernie (Gast)


Lesenswert?

In dem Du 2 hoch 254 Sekunden wartest,
oder den Takt erhöhst,
oder die LEDs mit Schieberegister fährst.

von Strickwettbewerbgewinner (Gast)


Lesenswert?

trollo schrieb:
> if PRESCALER < "100110001001011010000000"
Ganz böse, da ressourcenfressend... Lieber bei dieser Zahl anfangen, 
nach unten zählen, und auf Gleichheit mit 0 prüfen.

von trollo (Gast)


Lesenswert?

Tss, vielleicht einfach mal darüber nachdenken, was Du da machst, Du 
Trollo! Ein Zähler, der im Sekundentakt eine 255 Bit Zahl hochzählt ... 
wenn dann davon 100 LEDs nicht angeschlossen sind, oh Mann.

2^100 Sekunden warten ist echt keine Freude.

Ich bin aber doch noch darauf gekommen, als ich darüber nachgedacht 
habe, wie dieses Blinken zustande kommen kann. Das letzte Bit toggelt 
fleißig und die höheren sind nicht angeschlossen...

Sorry, dass ich Euch mit dieser Dummheit belästigt habe.

Danke an Bernie und den Meisterstricker.

Eine gute Nacht wünsche ich Euch :)

von hjk (Gast)


Lesenswert?

Strickwettbewerbgewinner schrieb:
> Ganz böse, da ressourcenfressend

Den Vergleich würde ich gerne sehen. Wie beschreibst du das dann bitte?

Prozess 1 braucht 285LE auf einem Cyclone 4,
Prozess 2 hingegen braucht 303LE.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.Numeric_std.ALL;
4
5
entity bla is
6
  port (
7
    CLK : in std_logic;
8
    OUT_LED : out std_logic_vector(254 downto 0)
9
  );
10
end bla;
11
12
architecture Behavioral of bla is
13
  signal COUNTER: unsigned(254 downto 0);
14
  signal PRESCALER: unsigned(23 downto 0);
15
begin
16
17
--  CounterProcess: process (CLK)
18
--  begin
19
--    if rising_edge(CLK) then
20
--      if PRESCALER < "100110001001011010000000" then
21
--        PRESCALER <= PRESCALER + 1;
22
--      else
23
--        PRESCALER <= (others => '0');
24
--        COUNTER <= COUNTER + 1;
25
--      end if;
26
--    end if;
27
--  end process;
28
  
29
   CounterProcess: process (CLK)
30
  begin
31
    if rising_edge(CLK) then
32
      if PRESCALER = 0 then
33
        PRESCALER <= "100110001001011010000000";
34
        COUNTER <= COUNTER + 1;
35
      else
36
        PRESCALER <= PRESCALER - 1;
37
      end if;
38
    end if;
39
  end process;
40
  
41
  OUT_LED <= std_logic_vector(COUNTER);
42
43
end Behavioral;

von O_o (Gast)


Lesenswert?

hjk schrieb:
> Strickwettbewerbgewinner schrieb:
>> Ganz böse, da ressourcenfressend
>
> Den Vergleich würde ich gerne sehen. Wie beschreibst du das dann bitte?

Das hat er doch auch nur irgendwo gelesen und blind übernommen ;-) 
Mitläufermentalität

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


Lesenswert?

Es ist bei FPGA-Designs durchschnittlich eher schlecht, auf "gleich" zu 
vergleichen. Besser ist, "grösser" oder "kleiner" zu verwenden 
(natürlich auch zusammen mit "gleich").
Es ist zudem eher ungünstig, einen Rückwärtszähler zu bauen, auf Null zu 
vergleichen und einen Wert zu laden. Das hat mit der Reset-Geschichte zu 
tun.

Aber am einfachsten ist da immer: ausprobieren...

von Berndl (Gast)


Lesenswert?

Wenn das letzte Bit im Vergleich mit drin ist, ist es egal, ob grösser 
oder grösser-gleich.

von Sigi (Gast)


Lesenswert?

Lothar Miller schrieb:
>Es ist bei FPGA-Designs durchschnittlich eher schlecht, auf "gleich" zu
>vergleichen. Besser ist, "grösser" oder "kleiner" zu verwenden
>(natürlich auch zusammen mit "gleich").

Wenn man die Std-Synthesetools (Xilinx/Altera) verwendet, schon. Dann
muss man nur noch das MSB-Bit (oder das nachfolgende Carry-Bit) auf
1 oder 0 testen.
Mit den Carry-Chains der Xilinx- (oder auch der Altera-)Chips kann
man auch auf Gleichheit testen, und das genauso schnell.
Nachteil: Die Schaltung muss man von Hand generieren.

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.