Forum: FPGA, VHDL & Co. VHDL einfacher up/down Counter


von Toni H. (Gast)


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 ;)

von peter (Gast)


Lesenswert?

....ist es das ganze VHDL....?

Gruss

von Valko Z. (hydravliska)


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

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


Lesenswert?

Toni H. schrieb:
> process (all) begin
Gewöhn dir das Denken lieber nicht ab...

> und pendelt nicht
Was sollte da "pendeln", die Richtung kommt ja von aussen. Fazit: das 
Problem ist nicht im geposteten Code.

> Vll. kann mir der eine oder andere ein paar nützliche Tipps geben.
Simuliere das Design.

von Toni H. (Gast)


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"

: Bearbeitet durch Moderator
von Toni H. (Gast)


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?!

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


Lesenswert?

Toni H. schrieb:
> Ich komm nur nicht drauf weshalb?!
Der Fehlertext hat sicher eine gewisse Aussagekraft...

von Toni H. (Gast)


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

von Lattice User (Gast)


Lesenswert?

Es pendelt nicht weil das up_down signal sich nicht ändert. Wo kommt 
dieses her?

von Valko Z. (hydravliska)


Lesenswert?

Hallo Toni

der beste Tipp kamm vom Lothar - simuliere dein Design. Bist du schon 
soweit?


Gruss

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.