VHDL einfacher up/down Counter

Gast #3890679
Lesenswert?

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 ;)
#3890731
Lesenswert?

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 #3890865
Lesenswert?

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 #3890873
Lesenswert?

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 #3891656
Lesenswert?

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

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