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


von Benedikt L. (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.
1
      port ( clk: in ...
2
             sel: in std_logic_vector(1 downto 0);
3
             clkout: out ...  );
4
5
signal prescaler : integer range 0 to 10000000/4;
6
signal counter : unsigned (2 downto 0) := (others =>'0');
7
8
prescaler : process (clk)
9
begin
10
  if rising_edge(clk_mono) then
11
    if (prescaler<10000000/4) then
12
       prescaler <= prescaler+1;
13
    else     
14
       prescaler <= 0;
15
       counter <= counter+1;
16
    end if;
17
  end if;
18
end process;
19
20
clkout <=   counter(0) when sel = "11"  -- 2Hz
21
       else counter(1) when sel = "10"  -- 1Hz
22
       else counter(2) when sel = "01"  -- 1/2Hz
23
       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...  ;-)

von Benedikt L. (Gast)


Lesenswert?

Hallo Lothar,

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


mfg Benedikt

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"

von Benedikt L. (Gast)


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

von Duke Scarring (Gast)


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

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.