von
Tetramam (Gast)
29.10.2009 12:00
Ich bin Neuling im VHDL -Programmieren. Wie kann ich einen Zähler mit
einem Lauflicht richtig verbinden? D.H. ich will mit Hilfe eines Zählers
den Takt eines Oszillators herunterstufen und das letzte Signal des
Zählers an das Lauflicht als Takt weitergeben. Die Bücher und auch die
Recherchen im Internet haben mir nicht allzuviel gebracht. Das meiste
ist sehr hochtrabend geschrieben und deshalb verstehe ich das nicht.
Bitte helft mir!!! Ich bin total verzweifelt.
Zähler: 1 library IEEE ;
2 use IEEE . std_logic_1164 . all ; -- importiere std_logic types
3 use IEEE . std_logic_arith . all ; -- importiere add/sub vom std_logic_vector
4 use IEEE . STD_LOGIC_UNSIGNED . ALL ;
5
6 ENTITY counter_updown is
7 PORT ( -- Zähler Steuersignals
8 clock : IN std_logic ; -- Zähler Takt
9 reset : IN std_logic ; -- Zähler Rücksetzeingang
10 updown : IN std_logic ; -- count Richtung up/down
11 count : IN std_logic ; -- count enable
12 -- Zähler Ausgangssignals
13 c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8 , c9 , c10 , c11 , c12 , c13 , c14 , c15 , c16 , c17 , c18 , c19 : OUT std_logic ); -- Zähler bit 0..20
14 END counter_updown ;
15
16 ARCHITECTURE Behavioral OF counter_updown IS
17 -- interne Signal Deklaration
18 SIGNAL counter : std_logic_vector ( 19 DOWNTO 0 );
19 BEGIN
20
21 count_process : PROCESS
22
23 BEGIN -- Dieser Prozess startet den Zähler
24 WAIT UNTIL clock 'EVENT AND clock = '1' ; -- warten auf ansteigende Flanke von clock(0->1)
25 IF reset = '0' THEN -- WENN reset den Wert Null hat DANN
26 counter <= ( others => '0' ); -- setze alle Zählerbits auf Null
27 ELSE -- SONST
28 IF ( count = '1' ) AND ( updown = '1' ) THEN -- WENN count den Wert Null und updown den Wert 1 hat DANN
29 counter <= CONV_STD_LOGIC_VECTOR ( UNSIGNED ( counter ) + 1 , 20 ); -- count nach oben zählen: n, n+1, n+2, ..., 15, 0, 1, ...
30 ELSIF ( count = '1' ) AND ( updown = '0' ) THEN -- SONST WENN count den Wert 1 und updown den Wert 0 hat DANN
31 counter <= CONV_STD_LOGIC_VECTOR ( UNSIGNED ( counter ) - 1 , 20 ); -- count nach unten zählen: n, n-1, n-2, ..., 0, 15, 14, ...
32 ELSE -- SONST
33 counter <= counter ; -- halte Zähler auf den gleichen Wert, wie vorher
34 END IF ;
35 END IF ;
36 END PROCESS ;
37
38 -- Verbinde die internen Zähler mit den Ausgängen
39 c0 <= counter ( 0 );
40 c1 <= counter ( 1 );
41 c2 <= counter ( 2 );
42 c3 <= counter ( 3 );
43 c4 <= counter ( 4 );
44 c5 <= counter ( 5 );
45 c6 <= counter ( 6 );
46 c7 <= counter ( 7 );
47 c8 <= counter ( 8 );
48 c9 <= counter ( 9 );
49 c10 <= counter ( 10 );
50 c11 <= counter ( 11 );
51 c12 <= counter ( 12 );
52 c13 <= counter ( 13 );
53 c14 <= counter ( 14 );
54 c15 <= counter ( 15 );
55 c16 <= counter ( 16 );
56 c17 <= counter ( 17 );
57 c18 <= counter ( 18 );
58 c19 <= counter ( 19 );
59
60
61
62 END Behavioral ;
Lauflicht: 1
2 library IEEE ;
3 use IEEE . STD_LOGIC_1164 . ALL ;
4 use IEEE . NUMERIC_STD . ALL ;
5
6 ENTITY Lauflicht is
7 Port ( clk : in STD_LOGIC ; -- Eingangssignal
8 leds : out STD_LOGIC_VECTOR ( 7 downto 0 )); -- Ausgangssignal
9 END Lauflicht ;
10
11 ARCHITECTURE Behavioral OF Lauflicht IS
12 type Rom is array ( 0 to 7 )
13 of std_logic_vector ( 7 downto 0 ); -- Typ Rom ist ein Vektor, der die Werte 0 bis 7 enthält
14 -- und heruntergezählt wird
15 constant ledarray : Rom : = -- Die Konstante ledarray enthält folgende Werte:
16 ( "10000000" , -- Bei 1 leuchtet die entsprechende LED und bei 0 leuchtet LED nicht.
17 "00100000" , -- Bei
18 "00001000" ,
19 "00000010" ,
20 "10000001" ,
21 "00000100" ,
22 "00010000" ,
23 "01000000" );
24 signal cnt : integer range 0 to 7 : = 0 ;
25
26 begin
27 process begin
28 wait until rising_edge ( clk );
29 if ( cnt < 7 ) then
30 cnt <= cnt + 1 ;
31 else
32 cnt <= 0 ;
33 end if ;
34 end process ;
35 leds <= ledarray ( cnt );
36 end Behavioral ;
von
Lothar M.
(Firma: Titel)
(lkmiller )
(Moderator )
29.10.2009 12:21
Ohne das genauer angeschaut zu haben: 1 -- Zähler Ausgangssignals
2 c0 , c1 , c2 , c3 , c4 , c5 , c6 , c7 , c8 , c9 , c10 , c11 , c12 , c13 , c14 , c15 , c16 , c17 , c18 , c19 : OUT std_logic ); -- Zähler bit 0..20
Warum gibst du nicht (wie alle anderen) einen Vektor aus: 1 -- Zähler Ausgangssignals
2 c : OUT std_logic_vector [ 23 downto 0 ] ); -- Zähler bit 0..20
Zur Aufgabe.
The hard way:
Du nimmst dein (mein) Lauflicht als Top-Entity und bindest deinen
Taktteiler als Komponente ein.
The short way:
Du machst den Taktteiler in den Lauflichtcode mit rein: 1 library IEEE ;
2 use IEEE . STD_LOGIC_1164 . ALL ;
3 use IEEE . NUMERIC_STD . ALL ;
4
5 ENTITY Lauflicht is
6 Port ( clk : in STD_LOGIC ; -- Eingangssignal
7 leds : out STD_LOGIC_VECTOR ( 7 downto 0 )); -- Ausgangssignal
8 END Lauflicht ;
9
10 ARCHITECTURE Behavioral OF Lauflicht IS
11 signal vorteiler : integer range 0 to 9999999 ; -- z.B. um aus 10MHz einen Sekundentakt zu machen
12 signal llenable : std_logic : = '0' ;
13 :
14 :
15 begin
16 process begin -- Vorteiler
17 wait until rising_edge ( clk );
18 if ( vorteiler < 9999999 ) then
19 vorteiler <= vorteiler + 1 ;
20 llenable <= '0' ;
21 else
22 vorteiler <= 0 ;
23 llenable <= '1' ;
24 end if ;
25 end process ;
26
27 process begin
28 wait until rising_edge ( clk );
29 if ( llenable = '1' ) then -- 1 Sekunde vorbei?
30 if ( cnt < 7 ) then
31 cnt <= cnt + 1 ;
32 else
33 cnt <= 0 ;
34 end if ;
35 end if ;
36 end process ;
37 leds <= ledarray ( cnt );
38 end Behavioral ;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.