Forum: FPGA, VHDL & Co. mehrere Modelle richtig verbinden


von Tetramam (Gast)


Lesenswert?

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


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.