mikrocontroller.net

Forum: FPGA, VHDL & Co. Konfigurierbarer Zähler/Timer


Autor: Benedikt L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei mich in VHDL auf einem CPLD (Xillinx XL144) 
einzuarbeiten und benötige einen Timer, der konfigurierbar ein 
Clock-Signal erzeugt, das eine Periodendauer von 0,5s ,1s oder 2s aus 
einem 10MHz-Signal erzeugt.
Die Umschaltung der Periodendauern soll 2 Inputs 
geschehen.(Binär-Codiert)

Im Moment habe ich einen 1s Takt folgendermaßen realisiert:
clk_mono: 10MHZ-Input
clk: Signal das im Programm weiterverwendet wird und einstellbare 
Periodendauer haben soll


signal counter : std_logic_vector ( 27 downto 0) := (others =>'0');
....
prescaler : process (clk_mono,)
begin

if rising_edge(clk_mono) then
  counter <= counter+1;
end if;

if counter = 5000000 then
  clk <= '1';
  end if;
if counter = 10000000 then
  clk <= '0';
  counter <= (others =>'0');
  end if;

end process;
......


Nun habe ich bereits diverse Möglichkeite nausprobiert andere 
Periodendauern einstellen zu können:
- den Counter nicht mit Konstanten vergleichen, sondern mit vorher 
zugewie
ßenen Signalen
-einen zweiten Counter nachschalten

Beide Möglichkeiten haben einen relativ hohen Resourcenverbrauch.

Wie würde man das Problem professionell lösen?


Bin für Vorschläge dankbar!

mfg
Benedikt Lippert

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

Bewertung
0 lesenswert
nicht lesenswert
Benedikt L. schrieb:
> und benötige einen Timer, der konfigurierbar ein Clock-Signal erzeugt,
> das eine Periodendauer von 0,5s ,1s oder 2s aus einem 10MHz-Signal erzeugt.
Was erzeugt da wie wo was?
Aus 10MHz umschaltbar 2Hz, 1Hz und 1/2Hz?

> Wie würde man das Problem professionell lösen?
Man würde einen Zähler machen, der erst mal den 10MHz-Takt auf 4Hz 
herunterteilt. Dann dieses heruntergeteilte Signal zum Weiterschalten 
eines 3 Bit breiten Zählers (2Hz-1Hz-0,5Hz) verwenden, und anschliessend 
einen Multiplexer zur Anwahl des passenden Ausgangs.
      port ( clk: in ...
             sel: in std_logic_vector(1 downto 0);
             clkout: out ...  );

signal prescaler : integer range 0 to 10000000/4;
signal counter : unsigned (2 downto 0) := (others =>'0');

prescaler : process (clk)
begin
  if rising_edge(clk_mono) then
    if (prescaler<10000000/4) then
       prescaler <= prescaler+1;
    else     
       prescaler <= 0;
       counter <= counter+1;
    end if;
  end if;
end process;

clkout <=   counter(0) when sel = "11"  -- 2Hz
       else counter(1) when sel = "10"  -- 1Hz
       else counter(2) when sel = "01"  -- 1/2Hz
       else '0';                        -- Ausgeschaltet


> Beide Möglichkeiten haben einen relativ hohen Resourcenverbrauch.
Ja nun, um 10MHz auf 1/2 Hz herunterzuteilen brauchst du einen Teiler um 
20 000 000, das sind ca. 25 Flipflops. Da beißt keine Maus keinen Faden 
ab...  ;-)

Autor: Benedikt L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,

Danke für deine Hilfe.
Kannst du ein gutes VHDL-Buch empfehlen?


mfg Benedikt

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

Bewertung
0 lesenswert
nicht lesenswert
Zum Einstieg:
Reichardt&Schwarz: VHDL-Synthese
Und dann zum Vertiefen:
P.J. Ashenden: "The designer's guide to VHDL" und/oder "The VHDL 
Cookbook"

Autor: Benedikt L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für den Tipp.
Leider ist das erste Buch in der Bib meiner FH schon bis Juni belegt.
Hilft doch nur noch der Gang zur Buchhandlung;-)

Gruß
Benedikt

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt L. schrieb:
> Leider ist das erste Buch in der Bib meiner FH schon bis Juni belegt.
> Hilft doch nur noch der Gang zur Buchhandlung;-)

Oft kann die lokale Bibliothek das Buch auch von einer anderen 
Bibliothek beschaffen.

Duke

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.