VHDL einfacher up/down Counter

Gast #3890679
Hallo zusammen,
ich bin VHDL Einsteiger und programmiere erst seit kurzer Zeit 
damit(Uni).
Ich möchte auf meinem Altera FPGA DE1 Board eine Laufschrift auf den 
Siebensegmentanzeigen ausgeben, die immer von links nach rechts und von 
rechts nach links hin und her pendelt. Dies möchte ich unter anderem 
gerne mit einem Counter probieren.

Hier mal mein Counter-Code:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4

5
entity Up_Down is
6
  port (clk : in std_logic;
7
      enable: in std_logic;  
8
      up_down :in  std_logic; 
9
  pos: out std_logic_vector (2 downto 0));
10
end Up_Down;
11

12

13
architecture Verhalten of Up_Down is 
14
  signal modulo: natural range 0 to 7;
15
begin
16

17
  process (all) begin
18
    
19
    if rising_edge (clk) then
20
      if enable = '1' then    
21
        if (up_down = '1') then
22
          modulo <= modulo + 1;
23
            pos <= not std_logic_vector (to_unsigned(modulo + 1, 3));  
24
        else
25
            modulo <= modulo - 1;
26
            pos <= not std_logic_vector (to_unsigned(modulo - 1, 3));
27
        end if;  
28
      end if;
29
    end if;  
30
  end process;
31
  
32
end Verhalten;

"enable" ist hierbei ein Signal dass nur jede 5. Taktperiode aktiv ist.
Der Counter steuert einen Decoder an (über pos) der die verschiedenen 
Stellungen auf den Anzeigen ausgibt.

Leider läuft meine Laufschrift immer nur von links nach rechts und 
pendelt nicht. Vll. kann mir der eine oder andere ein paar nützliche 
Tipps geben. Wie gesagt ich bin noch ein sehr früher Einsteiger ;)
Dur erwartest dass "modulo" überläuft und wieder von 0 anfängt. Dieser 
Verhalten kannst du durch ein UNSIGNED erreichen.

Also einfach NATURAL mit UNSIGNED(2 downto 0) austauschen. Mit NATURAL 
solltest du ein Fehlermeldung in der Simulation bekommen wenn "modulo" 
von 7 auf 8 wechseln sollte.

Und am besten "CLK" anstatt "ALL" in der Sensitivity List vom Prozess 
eintragen.

Gruss
Gast
peter schrieb:
> ....ist es das ganze VHDL....?
>
> Gruss

Hallo Peter

nein das ist nicht mein gesamter Code. Ich habe gedacht mein Fehler 
liegt genau in diesem Bereich.

Hier mein gesamter Code:
1
library ieee;
2
use ieee.std_logic_1164.all; -- wg. des Datentyps std_logic_vector
3

4
entity fpga is
5
  port (  clock_50:            in std_logic;
6
        up_down :            in  std_logic;
7
        hex3, hex2, hex1, hex0:   out std_logic_vector (6 downto 0)     -- 7S-Anzeigen
8
  );
9
end fpga;
10

11
architecture Struktur of fpga is
12
  signal enable: std_logic;
13
  signal pos:   std_logic_vector (2 downto 0);
14
  signal wort: std_logic_vector (7 downto 0);
15
  begin
16
    t:  entity work.Teiler     generic map (50_000_00)
17
                      port map (clock_50, enable);
18
    u:  entity work.Up_Down   port map (clock_50, enable, up_down, pos);
19
    l:  entity work.Lauftext   port map (pos,wort);
20
    d3: entity work.Dec       port map (wort(7 downto 6), hex3);
21
    d2: entity work.Dec       port map (wort(5 downto 4), hex2);
22
    d1: entity work.Dec       port map (wort(3 downto 2), hex1);
23
    d0: entity work.Dec       port map (wort(1 downto 0), hex0);
24
end Struktur;

Frequenzteiler:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4

5

6
entity Teiler is
7
  generic (n: positive);
8
  port     (clk : in std_logic ;
9
        enable: out std_logic);
10
end Teiler;
11
  
12
architecture Verhalten of Teiler is
13
  signal z: natural range 0 to n-1;
14
begin
15
  process (all) begin
16

17
    if rising_edge(clk) then 
18
      if z >= n - 1 then
19
        enable <= '1';
20
        z <= 0;
21
      else
22
        enable <='0' ;
23
        z <= z + 1;
24
      end if;
25
    end if ;
26
  end process;
27
  
28
end Verhalten;

Decoder:
1
library ieee;
2
use ieee.std_logic_1164.all;
3

4
entity Dec is 
5
  port  (c: in std_logic_vector (1 downto 0);
6
      hex: out std_logic_vector (6 downto 0)
7
  );
8
end Dec;
9

10
architecture Verhalten of Dec is
11
begin
12
    
13
    hex  <="1000111" when c="00" else
14
          "1000000" when c="01" else
15
         "0001100" when c="10" else
16
         "1111111" when c="11";
17

18
end Verhalten;

Lauftext:
1
library ieee;
2
use ieee.std_logic_1164.all;
3

4
entity Lauftext is 
5
  port  (c: in std_logic_vector  (2 downto 0);
6
       x: out std_logic_vector (7 downto 0)
7
  );
8
end Lauftext;
9

10
architecture Verhalten of Lauftext is
11
begin
12
  process (all) begin
13
  
14
    case c is
15
      when "000" => x <= "11111111";
16
      when "001" => x <= "11111100";
17
      when "010" => x <= "11110001";
18
      when "011" => x <= "11000101";
19
      when "100" => x <= "00010110";
20
      when "101" => x <= "01011011";
21
      when "110" => x <= "01101111";
22
      when "111" => x <= "10111111";
23
    end case;
24
    
25
  end process;
26

27
end Verhalten;

Und der Counter wie oben schon beschrieben.
Es wird das Wort "LOOP" von links nach rechts laufend ausgegeben. Es 
sollte aber von links nach rechts und von rechts nach links laufen also 
"pendeln"
Gast
Valko Zapalko schrieb:
> Dur erwartest dass "modulo" überläuft und wieder von 0 anfängt.
> Dieser
> Verhalten kannst du durch ein UNSIGNED erreichen.
>
> Also einfach NATURAL mit UNSIGNED(2 downto 0) austauschen. Mit NATURAL
> solltest du ein Fehlermeldung in der Simulation bekommen wenn "modulo"
> von 7 auf 8 wechseln sollte.
>
> Und am besten "CLK" anstatt "ALL" in der Sensitivity List vom Prozess
> eintragen.
>
> Gruss

Hallo Valko Zapalko,

wenn ich NATURAL mit UNSIGNED (2 down to 0) ersetzte erhalte ich einen 
Error. Ich komm nur nicht drauf weshalb?!
Gast
Lothar Miller schrieb:
> Toni H. schrieb:
>> Ich komm nur nicht drauf weshalb?!
> Der Fehlertext hat sicher eine gewisse Aussagekraft...

Hallo Lothar Miller,

ups ich habe mir den Fehlertext jetzt genau angeschaut und erfolgreich 
NATRUAL durch UNSIGNED (2 downto 0) ersetzt. Leider verstehe ich noch 
immer nicht weshalb meine Laufschrift nicht pendelt. =(

Gruss

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.