Forum: FPGA, VHDL & Co. Lauflicht mit VHDL


von Marco (Gast)


Lesenswert?

Hallo!

ich bin VHDL Anfänger und versuche mich gerade an einem einfachen
Lauflicht. Leider sind meine bisherigen Versuche(*) gescheitert. :-(

Vielleicht wäre jemand mal so nett mich auf den richtigen Zug zu
setzen.

Danke

(*)
- rol/ror
- led <= led(6 downto 0) & led(7);

von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

schau dir mal den angehängten Code an.

Gruss Jörn

von Mathias G. (mgiaco)


Lesenswert?

Hallo kann mir mal jemand das mit dem led<=led(6 downto0) & led(7)
erklären?

LEDSTATE:process(tick,reset)
    begin

     if reset='1' then
  led<="00000001";
     elsif(tick'event and tick = true) then
  led<=led(6 downto 0) & led(7);
        if led(7)='1' then
        led<="00000001";
        end if;
     end if;
end process;

mfg mathias

von :::: (quad colon) (Gast)


Lesenswert?

1
LEDSTATE:process(tick,reset)
2
begin
3
   if reset='1' then                 -- Bei anligendem Reset
4
      led <= "00000001";             -- auf Ausgangszustand
5
zurücksetzen
6
   elsif(tick'event and tick = true) then -- alternativ bei steigende
7
8
                                          -- Flanke von tick
9
                                     -- Bitzuweiszung
10
      led<=led(6 downto 0) & led(7); -- |76543210| <- |65432107|
11
      if led(7)='1' then             -- wenn höchstwertige LED an,
12
dann
13
         led<="00000001";            -- auf Ausgangszustand
14
zurücksetzen
15
      end if;
16
   end if;
17
end process;

:::: (quad colon)

von Henrik K. (henrik)


Lesenswert?

Vorsicht, falls "tick" ein Signal und kein eigens def. Aufzählungtyp
ist: "true" ist weder zwingend eine 0 noch eine 1! Es hängt vom
Synthesetool ab, wie das interpretiert wird.

Gruss Henrik

von undercover (Gast)


Lesenswert?

Wie könnte ich denn die Geschwindigkeit des Lauflichts beeinflussen ???

von Sebastian (Gast)


Lesenswert?

Durch den Takt, der am Takteingang des CPLD anliegt, oder durch einen 
vorgeschalteten Teiler (Binärzähler aus Flipflops).

von undercover (Gast)


Lesenswert?

genau, und wie könnte ich den takt z.b teilen ? muss ich da ein extra 
taktteiler programm schreiben ? oder gibt es eine möglichkeit den takt 
der cpld schon im vorhinein zu teilen ?

von Sebastian (Gast)


Lesenswert?

Einerseits kann man natürlich einen Teiler in die Taktversorgung des 
CPLD schalten. Hardwarelösung sozusagen. Wenn man aber noch Ressourcen 
frei hat, ist es sicher möglich, einen mehrstufigen Binärzähler in VHDL 
zu beschreiben sowie einen Multiplexer, der das Taktsignal für den 
"LEDSTATE" Prozeß ("tick") auf den gewünschten Ausgang des Binärzählers 
schaltet. Dann hat man einen einstellbaren Vorteiler in binären 
Schritten (:2, :4, :8 usw).
VHDL-Code dazu kann ich leider nicht liefern. Aber es sollte gehen.

von Marcel (Gast)


Lesenswert?

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use work.all;
4
5
entity SR8 is
6
  port (
7
  RD, CLK: in std_logic;
8
  A: in std_logic_vector (1 downto 0);
9
  D: out std_logic_vector (1 to 8)
10
  );
11
end entity SR8;
12
13
architecture behavior of SR8 is
14
signal Qn: std_logic_vector (7 downto 0);
15
signal Q: std_logic_vector (7 downto 0); 
16
signal X: std_logic_vector (7 downto 0);
17
18
begin
19
 
20
  SR: process (RD, CLK) is
21
  begin
22
    
23
    if (Qn = "00000000") then
24
    X(1) <= '1';
25
    else
26
    X(1) <= '0';
27
    end if;
28
    
29
    if RD = '1' then
30
      Qn <= "00000000";
31
        
32
        
33
        
34
      else 
35
      if CLK'event and CLK = '1' then
36
        if (A(0)='1') then        
37
        Qn <= X(1) & Qn(7 downto 1);
38
        end if;
39
        if (A(0) = '0') then
40
        Qn <= Qn(6 downto 0) & X(1);
41
        end if;
42
      end if;
43
      end if;
44
      
45
      
46
      
47
--  Ausgabe    
48
    if (A= "10") then
49
    Q <= (not (Qn));
50
    D(1) <= Q(7);
51
    D(2) <= Q(6);
52
    D(3) <= Q(5);
53
    D(4) <= Q(4);
54
    D(5) <= Q(3);
55
    D(6) <= Q(2);  
56
    D(7) <= Q(1);
57
    D(8) <= Q(0);
58
    else
59
    if (A = "00") then
60
      D(1) <= Qn(7);
61
      D(2) <= Qn(6);
62
      D(3) <= Qn(5);
63
      D(4) <= Qn(4);
64
      D(5) <= Qn(3);
65
      D(6) <= Qn(2);  
66
      D(7) <= Qn(1);
67
      D(8) <= Qn(0);
68
      else
69
      if (A = "11") then
70
        Q <= (not (Qn));
71
        D(1) <= Q(7);
72
        D(2) <= Q(6);
73
        D(3) <= Q(5);
74
        D(4) <= Q(4);
75
        D(5) <= Q(3);
76
        D(6) <= Q(2);  
77
        D(7) <= Q(1);
78
        D(8) <= Q(0);
79
        else  
80
          D(1) <= Qn(7);
81
          D(2) <= Qn(6);
82
          D(3) <= Qn(5);
83
          D(4) <= Qn(4);
84
          D(5) <= Qn(3);
85
          D(6) <= Qn(2);  
86
          D(7) <= Qn(1);
87
          D(8) <= Qn(0);
88
        end if;
89
      end if;
90
    end if;
91
92
end process SR;
93
end architecture behavior;


hier meine Ausführung das mit der Ausgabe geht noch einfacher nur komme 
ich nicht drauf :(

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


Lesenswert?

Marcel schrieb:
> geht noch einfacher nur komme ich nicht drauf
Und warum zerrst du für diese Feststellung einen uralten Thread ans 
Tageslicht? Oder soll das eine Frage sein? Dann fehlt die eigentliche 
Aufgabe...


BTW: 1. man macht keine solchen seltsamen kombinatorisch-getakteten 
Prozesse.
2. die Sensitivliste des Prozesses ist unvollständig: Qn fehlt.

Und zum Thema Lauflicht:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html

: Bearbeitet durch Moderator
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.