VHDL-Anfänger verzweifelt an einfachem LED-Zähler

Gast #2703042
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...
Gast #2703143
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 :)
Gast #2703213
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;
Moderator (Firma: Titel) Persönliche Seite #2704490
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...
Gast #2704575
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.

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