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
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... ;-)
Zum Einstieg: Reichardt&Schwarz: VHDL-Synthese Und dann zum Vertiefen: P.J. Ashenden: "The designer's guide to VHDL" und/oder "The VHDL Cookbook"
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.