Dreieckgenerator programmieren

Gast #1400417
Lesenswert?
• ▲
▼
Hi...
gidf !
Hast du schon mal die SUCHE benutzt?

Deine Frage ist sehr offen gestellt...
Willst du nur den Zählbefehl? -> a <= a + 1
Oder den kompletten VHDL-Code? -> hier z. B. ein "hoch"-Zähler
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use work.std_arith.all;
4

5
entity COUNT is
6
  port( CLK, ENA : in std_logic;
7
        Q        : buffer std_logic_vector(3 downto 0);
8
        UEB      : out std_logic);
9
end COUNT;
10

11
architecture A1 of COUNT is
12
begin
13
   P1: process( CLK )
14
   begin
15
      if( CLK'event and CLK = '1' ) then
16
         if( ENA = '1' ) then
17
            Q <= Q + 1;
18
         end if;
19
      end if;
20
   end process;
21
   UEB <= '1' when Q = "1111" else '0';
22
end A1;
Hast du schon VHDL-Kentnisse?
Gruß Boris
Gast #1400469
Lesenswert?
• ▲
▼
>Hast du schon VHDL-Kentnisse?

Gerade daran arbeite ich ja im Moment.

Ich würde es wahrscheinlich so programmieren:
1
  Triangle_counter: process(Takt)
2
  begin
3
    if (Takt ='1' and Takt'event) then
4
      case Counter_up_down is
5
        when 0  => Counter_up_down <= 1;
6
        when 1  => Counter_up_down <= 2;
7
        when 2  => Counter_up_down <= 3;
8

9

10

11
        when 253  => Counter_up_down <= 254;
12
        when 254  => Counter_up_down <= 255;
13
        when 255  => Counter_up_down <= 254;
14
        when 254  => Counter_up_down <= 253;
15
        when 253  => Counter_up_down <= 252;
16
        when 252  => Counter_up_down <= 251;
17
             end case;
18
    end if;
19
  end process Triangle_counter;

Das ist natürlich STUSS so, weil jede Zahl doppelt vorkommt.

Besser von 0 bis 255 hochzählen und dann von 511 auf 256 wieder 
runterzählen und das Bit8 einfach wegschmeissen.
Das kann man doch bestimmt auch anders schreiben, ohne das einem die 
Finger bluten?
Gast #1400484
Lesenswert?
• ▲
▼
Den VHDL_Code den ich weiter oben als Beispiel gepostet habe kannst du 
für den Anfang vielleicht erweitern. Du musst dir nur die Zählrichtung 
"merken" und immer vergleichen ob du bei 255 bzw. 0 angekommen bist und 
dann die Richtung ändern... Ist eine schöne Übung für den Anfang:)
Moderator (Firma: Titel) Persönliche Seite #1400496
Lesenswert?
• ▲
▼
So:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4

5
signal counter : integer range 0 to 255 := 0;
6
signal up : std_logic := '1';
7

8
process begin
9
  wait until rising_edge(clk);
10
  if (up='1') then
11
     counter <= counter + 1;
12
     if counter=254 then  up <= '0';  end if;
13
  else
14
     counter <= counter - 1;
15
     if counter=1 then    up <= '1';  end if;
16
  end if;
17
end process;
18
ausgang <= std_logic_vector(to_unsigned(counter,8));

Als Tipp: kauf dir ein Buch, z.B. VHDL-Synthese von Reichardt/Schwarz
Gast #1400536
Lesenswert?
• ▲
▼
> Das ist natürlich STUSS so, weil jede Zahl doppelt vorkommt.

Natürlich, der Zustand, ob man gerade aufwärts zählen sollte, oder 
abwärts, ist ein zusätzliches Bit, von dem aus man entscheiden muss, 
wass bei CLK passiert. Ohne dieses bit, ohne diesen Zustand, kann deine 
Schaltung nicht wissen, wo's lang geht.

Wo du dieses bit unterbringt, im count selber von dem dann eben 8 als 
Zähler genutzt werden und das neunte als Richtungszustandsbit, oder ob 
du es extra Wert nimmst, bleibt dir überlassen.

Und glücklicherweise kann VHDL Arithmetik, du brauchst nicht 512 when 
Fälle zu schreiben.
Moderator (Firma: Titel) Persönliche Seite #1400572
Lesenswert?
• ▲
▼
Der hier ist auch schön kompakt, er hat aber jeweils 2 Takte 0 und 255:
1
-- 0 und 255 sind jeweils 2 Takte lang
2
architecture Behavioral of CntTriangle is
3
signal cnt : unsigned (8 downto 0) := (others=>'0');
4
begin
5
   process begin
6
     wait until rising_edge(clk);
7
     cnt <= cnt + 1;
8
     if cnt(8)='1' then     
9
        counter <= std_logic_vector(    cnt(7 downto 0));
10
     else
11
        counter <= std_logic_vector(255-cnt(7 downto 0));
12
     end if;
13
   end process;
14
end Behavioral;

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.