mikrocontroller.net

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


Autor: Tetramam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
    use IEEE.std_logic_1164.all;           -- importiere std_logic types
    use IEEE.std_logic_arith.all;           -- importiere add/sub vom std_logic_vector
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

      ENTITY counter_updown is
      PORT ( -- Zähler Steuersignals
             clock           : IN  std_logic;    -- Zähler Takt
             reset           : IN  std_logic;    -- Zähler Rücksetzeingang
             updown          : IN  std_logic;    -- count Richtung up/down
             count           : IN  std_logic;    -- count enable
             -- Zähler Ausgangssignals
             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
      END counter_updown;

      ARCHITECTURE Behavioral OF counter_updown IS
        -- interne Signal Deklaration
        SIGNAL counter : std_logic_vector(19 DOWNTO 0);
        BEGIN

         count_process : PROCESS
         
         BEGIN                                    -- Dieser Prozess startet den Zähler
         WAIT UNTIL clock'EVENT AND clock = '1';                  -- warten auf ansteigende Flanke von clock(0->1)
         IF reset = '0' THEN                            -- WENN reset den Wert Null hat DANN
           counter <= (others => '0');                        -- setze alle Zählerbits auf Null
         ELSE                                    -- SONST
           IF (count = '1') AND (updown = '1') THEN                  -- WENN count den Wert Null und updown den Wert 1 hat DANN
             counter <= CONV_STD_LOGIC_VECTOR(UNSIGNED(counter) + 1, 20);      -- count nach oben zählen: n, n+1, n+2, ..., 15, 0, 1, ...
           ELSIF (count = '1') AND (updown = '0') THEN                -- SONST WENN count den Wert 1 und updown den Wert 0 hat DANN
             counter <= CONV_STD_LOGIC_VECTOR(UNSIGNED(counter) - 1, 20);      -- count nach unten zählen: n, n-1, n-2, ..., 0, 15, 14, ...
           ELSE                                    -- SONST
             counter <= counter;                          -- halte Zähler auf den gleichen Wert, wie vorher
           END IF;
         END IF;
         END PROCESS;

         -- Verbinde die internen Zähler mit den Ausgängen
         c0  <= counter(0);
         c1  <= counter(1);
         c2  <= counter(2);
         c3  <= counter(3);
         c4  <= counter(4);
         c5  <= counter(5);
         c6  <= counter(6);
         c7  <= counter(7);
         c8  <= counter(8);
         c9  <= counter(9);
         c10 <= counter(10);
         c11 <= counter(11);
     c12 <= counter(12);
         c13 <= counter(13);
         c14 <= counter(14);
         c15 <= counter(15);  
         c16 <= counter(16);
         c17 <= counter(17);
         c18 <= counter(18);
         c19 <= counter(19);

    

        END Behavioral; 

Lauflicht:
 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

ENTITY Lauflicht is
    Port ( clk : in  STD_LOGIC;                  -- Eingangssignal
           leds : out  STD_LOGIC_VECTOR (7 downto 0));  -- Ausgangssignal
END Lauflicht;

ARCHITECTURE Behavioral OF Lauflicht IS
  type Rom is array (0 to 7) 
  of std_logic_vector(7 downto 0);                 -- Typ Rom ist ein Vektor, der die Werte 0 bis 7 enthält 
                                      -- und heruntergezählt wird
  constant ledarray : Rom :=                     -- Die Konstante ledarray enthält folgende Werte:
  ("10000000",                              -- Bei 1 leuchtet die entsprechende LED und bei 0 leuchtet LED nicht. 
   "00100000",                              -- Bei 
   "00001000",
   "00000010",
   "10000001",
   "00000100",
   "00010000",
   "01000000");
  signal cnt : integer range 0 to 7 := 0;

  begin
    process begin
      wait until rising_edge(clk);
      if (cnt<7) then
         cnt <= cnt+1;
      else
         cnt <= 0;
      end if;
    end process;
   leds <= ledarray(cnt);
end Behavioral;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne das genauer angeschaut zu haben:
             -- Zähler Ausgangssignals
             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:
             -- Zähler Ausgangssignals
             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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

ENTITY Lauflicht is
    Port ( clk : in  STD_LOGIC;                  -- Eingangssignal
           leds : out  STD_LOGIC_VECTOR (7 downto 0));  -- Ausgangssignal
END Lauflicht;

ARCHITECTURE Behavioral OF Lauflicht IS
  signal vorteiler: integer range 0 to 9999999; -- z.B. um aus 10MHz einen Sekundentakt zu machen
  signal llenable : std_logic := '0';
  :
  :
  begin
    process begin -- Vorteiler
      wait until rising_edge(clk);
      if (vorteiler<9999999) then
         vorteiler <= vorteiler+1;
         llenable  <= '0';
      else
         vorteiler <= 0;
         llenable  <= '1';
      end if;
    end process;

    process begin
      wait until rising_edge(clk);
      if (llenable='1') then -- 1 Sekunde vorbei?
         if (cnt<7) then
            cnt <= cnt+1;
         else
            cnt <= 0;
         end if;
      end if;
    end process;
   leds <= ledarray(cnt);
end Behavioral;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.