www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Wie Takt in VHDL umschalten?


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich würde gern den Takt für einen Prozess umschalten. Es dreht sich
dabei um einen BCD-Zähler der mit 1Hz rückwärts laufen soll (Timer).
Den würde ich aber auch gern per Tastendruck hochzählen lassen, und das
nicht nur mit 1Hz sondern mit höheren Takt.
Als Anfänger (bin ich) würde man die zwei Taktsignale ja einfach mit
ein paar Gattern und dem Taster verknüpfen, was aber laut einiger
Tutorials nicht so "schön" sei. Deshalb wollte ich mal nachfragen wie
ihr sowas handhabt?

Gruß,
Sebastian

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einigen FPGAs gibt es sogenannte BUFGMUX, die haben 2 Clockeingänge,
zwischen denen man umschalten kann. Sie müssen mit einem Template
instanziiert werden, musst du mal nachschauen, ob es sowas in deinem
FPGA gibt (User Guide)


T.M.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das gibts glaube ich auch als ip.
nutze also den Core generator falls  du mit der xilink ise arbeitest.
Stichwort DCM =Digial Clock Manager
  Chris

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe zwar ein Spartan 3 Starterkit, aber wollte die Hardware
eigentlich in einem CPLD (XC9572XL) unterbringen. Das soll eine kleine
Zeitschaltuhr mit Minuten und Sekunden werden. Ich dachte mir das ich
diesmal keinen AVR verwende um etwas VHDL zu üben.
Einbauen wollte ich:
- 3x 7-Segmentanzeigen
- 3x Taster (Reset, Set, Start)
- 1x 32.768kHz Quarz

Gibt es da nicht noch andere Lösungen? Ich weiß ja nicht ob was
vernünftiges dabei raus kommt, wenn ich den Zähler mit dem schnelleren
Takt betreibe und vor das ENABLE-Signal eine zusätzliche Logik hänge.
Die könnte dann abhängig vom Tastersignal (entprellt) den 1Hz Takt
zuführen und gleichzeitig das UP_DOWN-Signal betätigen.

Gruß,
Sebastian

Autor: Sven Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin...

das enable Signal zu schalten ist (eigentlich) der einzige richtige
Weg. Takte sind in den FPGA immer eine eigene Welt und sollten
tunlichst nicht mit Logik vermischt werden. Das Timing ist danach sogut
wie erledigt.

--
 SJ

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie "klug" ist es, wenn ich den BCD-Zähler so gestalte das er ladbar
ist. Dann könnte ich eine Variable in einem seperaten Prozess
hochzählen lassen und beim Loslassen des Tasters den BCD-Zähler mit dem
neuen Wert laden. Braucht halt mehr FFs und evtl. wäre nicht mehr alles
synchron.

Sebastian

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arbeite nur mit deinem Systemtakt!!!
Die FFs des Zählers sollten alle mit dem Systemtakt arbeiten.
Für die langsameren Zeitbasen (hoch und abwärstzählen) beschreibst du
dir Frequenzeiteiler. Die Ausgangssignale dieser führst du kombiniert
mit der Tasterstellung auf deinen Zähler. Allerdings nicht als Takt,
sondern als Enable für das hoch- oder runterzählen.. Dann biste perfekt
synchron und hast keine Probleme.

prinzip:
if SysCLK'event and SysCLK = '1' then
  if Taste = 1 and DivCLK1 = 1 then count <= count - 1
  elsif Taste = 0 and DivCLK2 = 1 then count <= count + 1
  else count <= count;
  end if;
end if;

PS: Code ist so natürlich syntaktisch nicht richtig!

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur zur Info, fall es dich interessiert:

Ich beschreibe synchrone Desings immer in 2 Prozessen. Ein Prozess
beschreibt nur die Register. Dafür spendiere ich pro register zwei
Signale, wobei eines den Eingang und das andere den Ausgang beschreibt.
(Registername_in, Registername_q)
Dann beschreibe ich in dem einen Prozess nur das Verhalten aller
Register, sowohl beim Flankenübergang von CLK als auch beim Reset.
Hier werden nur die Ausgänge der Register beschrieben!

if reset = '0' then
  register1_q <= '0';
  register2_q <= '0';
elsif clk'event and clk = '1' then
  register1_q <= register1_in;
  register2_q <= register2_in;
end if;

im anderen Prozess wird die Kombinatorik beschriben, die auf die
Eingänge der Register wirkt. Hier gibt es keine verknüpfungen mit dem
Systemtakt mehr (nix clk'event)

z.B.
register1_in <= A and B;
...

Vorteil: du musst dir keine Gedanken mehr über synchronität machen, da
es autoamtisch synchron wird. Und das ganze bleibt schön
übersichtlich.
Man kann sich darüber streiten, da es ein bisschen mehr code ist, aber
gerade bei größeren Projekten bin ich bis jetzt immer sehr gut damit
gefahren.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all

Danke für die Antworten!


@schlumpf

deine Beschreibung schaut, soweit ich das beurteilen kann, nach einer
brauchbaren Lösung aus. Ich muß das aber erstmal sacken lassen, bevor
ich deine Anregungen sinnvoll einsetzen kann.
Ich verwende ein eigenes Modul, welches mir 1Hz und 128Hz aus den
32,768kHz erzeugt. Soll ich dann die 128Hz oder die 32,768kHz als
Systemtakt nehmen? Die 128Hz wollte ich für das Multiplexen der
Anzeigen und das Entprellen der Taster verwenden. Bei der Frequenz wäre
es auch möglich noch ein paar Anzeigen dazu zu nehmen (z.B. bei einer
Uhr: HH:MM:SS).


Sebastian

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du nimmst indirekt den Eingangstakt des FPGA als Systemtakt, also einige
MHZ. Die erzeugst Du aus den 32 über ein PLL. Die Untertakte würde ich
als enables formulieren. Ein MUX schaltet dies enables um, und dein
Zähler sieht nur eines davon.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ungefähr so:
signal MUX :    bit_vector(1 downto 0);
signal ENABLE : bit;

MUX <= TASTE & RUN;

case MUX is
  when "01"   => ENABLE <= CLK_1HZ;
  when "10"   => ENABLE <= CLK_128HZ;
  when others => ENABLE <= "0";
end case;

process (SysCLK)
begin
  if (SysCLK = '1' and SysCLK'event) then
    if (TASTE = '1' and ENABLE = '1') then
      count <= count - 1;
    elsif (TASTE = '0' and ENABLE = '1') then
      count <= count + 1;
    else
      count <= count;
    end if;
  end if;
end process;

oder?
Sehe ich das richtig, dass der Zähler jetzt nicht mit einem 1Hz
hochzählt? Wenn ja, wie bekomme ich das in den Griff?
PLL hab ich leider nicht zur Verfügung, will ja die Schaltung in nen
kleinen CPLD unterbringen.

Sebastian

Autor: schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm doch deine 32 kHz als Systemtakt.
Der systemtakt bestimmt ja nur, wie oft du deine Abfrage durchläufst.
also, wie oft deine internen Register einen Takt erhalten.
Ob das FF dann schaltet oder auch nicht, hängt ja lediglich von deinen
Eingangssignalen ab (Taste und ENABLE)

Generiere dir einen Zeitbasis für´s Runterzählen und Raufzählen, die
immer nur einen Impuls von 1 Systemtakt Länge bringt und sonst auf Null
ist. Also z.B auf 32000 zählen und dann mit 00000 laden. Und immer wenn
der Zähle rauf 0000 steht, dann gibst du über einen Vergleicher einen
Impuls aus.
Dieser ist die Zeitbasis für deine langsame Geschwindikeit.

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.