Konfigurierbarer Zähler/Timer

Gast #2061183
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
Moderator (Firma: Titel) Persönliche Seite #2061321
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...  ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren