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);
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
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)
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
Durch den Takt, der am Takteingang des CPLD anliegt, oder durch einen vorgeschalteten Teiler (Binärzähler aus Flipflops).
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 ?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.