mikrocontroller.net

Forum: FPGA, VHDL & Co. einstellbares Taktverhältnis


Autor: theo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich, VHDL-Beginner, versuche gerade den Ansatz für folgende Aufgabe zu 
finden:

Aus einem Takt, z.b. 1MHz soll ein 1sec langer Takt generiert werden.
So weit so gut, wie ich das mache ist mir eigentlich klar.
Ich arbeite dafür mit Zählern.

Die Frage die jedoch noch offen ist, wie kann ich das 
Einschaltverhältnis dieses Taktes verändern?
Nehmen wir an, man will innerhalb von einer Sekunde 100ms ein und 900ms 
aus erzeugen.
Wie könnte man dies realiseren, bzw. in Angriff nehmen?

Fehlen euch noch Infos, dann gebt Bescheid.

Habe wohl eine Denkblockade und hoffe Ihr könnt mir helfen.

Schöne Grüße

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Sichwort lautet Pulsweitenmodulation.(PWM)

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ein Beispiel mit wie man das über einen %-Duty Cycle Bereich lösen 
kann. Interessant ist hier vorallem das concurrent statement ganz am 
Ende.

Das mit der Zeit über den Zähler bekommst sicher selbst hin.

Achja : bitte den neuen Takt nur als enable nutzen und nicht direkt als 
Takt ;)



library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity count is
  generic(
  constant length : natural := 100;  
  constant duty_cycle : natural := 10  -- hier 0 bis 100 %
  
  );
    Port(
       clk       : in std_logic;
       clk2      : out std_logic);
end count;

architecture Behavioral of count is


signal counter : integer range 1 to length;

begin

process (clk)
begin
 if rising_edge(clk) then
  if counter < length then 
    counter <= counter +1;
      else
    counter <= 1 ; 
  end if;
 end if;
end process;

clk2 <= '1' when (counter*100) < (length *duty_cycle) else '0';

end Behavioral;


Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Das Stichwort nennt sich : Zaehlen. Einen Zaehler fuer die 
Repetitionsrate. einen Zaehler fuer die Pulsbreite.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht auch mit einem Zähler...

Autor: theo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
sorry das ich mich erst jetzt wieder blicken lasse.

Also ich muß sagen, das mir der Beispielcode vom Iulius sehr gut 
gefällt.
Find ich sehr universell um ein Taktsignal zu erzeugen, ich kann ja den 
duty_cycle auch auf die hälfte setzen und erhalte so einen universellen 
Zähler, bzw Taktgenerator.(mit ein paar Anpassungen)

Vielen Dank

Was mir noch einfällt zu fragen:
Was versteht man denn wirklich unter einem asynchronem reset?
Ist es nur das taktunabhängige Rücksetzen der Speicherzellen?
Asynchron bedeutet ja eigentlich das 2 Signale in ihren 
Änderungszeitpunkten nicht übereinstimmen und keine bekannte/konstante 
Zeitverschiebung aufweisen.

Muß ich dazu beim Programmieren etwas spezielles beachten (bei 
asynchronem reset)?
Ich frage doch in meiner architecture nur folgendes ab:
...begin...
if reset = '0' Then  oder if reset ='1' Then
...
Also nur Abfrage auf high oder low aktiv, sonst doch nix - oder doch?

Danke schon mal...

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

Bewertung
0 lesenswert
nicht lesenswert
> Find ich sehr universell um ein Taktsignal zu erzeugen, ich kann ja den
> duty_cycle auch auf die hälfte setzen und erhalte so einen universellen
> Zähler, bzw Taktgenerator.(mit ein paar Anpassungen)
Die Denkweise ist falsch. In einem FPGA-Design brauchst du keine 50% 
Takte, sondern hast (idealerweise) nur 1 Mastertakt. Alle anderen zeit- 
bzw. taktabhängigen Sachen werden mit Clock-Enable-Signalen gemacht, die 
nur 1 Mastertaktzyklus lang aktiv sind.

Autor: theo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, da muß ich nochmal nachfragen.

Nehmen wir an, ich habe einen bestimmten externen Takt 
(hardwareerzeugt), welchen ich innerhalb meines Systems benötige, jedoch 
in einer anderen Frequenz.
Ich würde jetzt so vorgehen:
Ich ändere mir in einem Process den externen Takt in das gewünschte 
innere Taktverhältnis(also 50% dutycycle).
In einem zweiten (oder weiteren) Process(en) stelle ich mir aus dem 
externen Takt ein enable-Signal her, eben auch über das einstellbare 
Taktverhältnis.

Für beide Processe würde ich doch nun den Code so verwenden können, wie 
es Iulius netterweise oben angab und so die verschieden benötigten 
"Takte" erzeugen.
Klar das man bei dem enable-Signal dann nicht mehr von einem Takt 
spricht.
Aber ansonsten kann ich das doch so machen, oder?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wenn du einen 'externen Takt' in deinem FPGA verwenden willst, dann tust 
du gut daran, den in deinen 'internen Takt' einzusynchronisieren. Also 
ueber ein paar FFs eintakten und sauber de-glitchen. Wenn das nicht geht 
(aus Timing-Gruenden), dann genau an dieser Stelle eben asynchron 
arbeiten und sich vorher genau ueberlegen, was da alles passieren kann!

Und by the way, der Code oben hatten einen Multiplier mit Faktor *100 
drin. Das kann dir eventuell die Synthese zu einem vorhandenen 
HW-Multiplier mappen, oder auch eine mehrfache Addition mit den Faktoren 
64, 32 und 4 (alles als shift-left). Aber du solltest bei solchen 
Statements eben auch genau wissen, was daraus gemacht wird/werden soll. 
Das haengt dann sehr schnell von deiner verwendeten Zielplattform ab...

Autor: Iulius (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Welche Synthese soll dafür bitte einen Multiplier nutzen ?

Für den Vergleich sind gerade mal 2 schlappe Lookuptables nötig, mit 
exakt so viel Eingängen wie man Zählerbits hat.

Siehe Bild.

>> wenn du einen 'externen Takt' in deinem FPGA verwenden willst, dann tust
>> du gut daran, den in deinen 'internen Takt' einzusynchronisieren


Ich weiß wie diese Aussage gemeint ist, aber so ist das zu allgemein.
Auch ein Clock von einem Oszi ist ein externer Takt und den 
synchronisiert man hoffentlich nicht ein.



>> Aber ansonsten kann ich das doch so machen, oder?

Nein, da hat Lothar schon Recht. Intern wirst du praktisch nie ein 10% 
oder 50% verhältnis brauchen, sondern wenn dann toggelndes verhalten, 
also 'high' alle paar clockzyklen.


Es kann zwar auch vorkommen, etwa wenn du bestimmte Funktionionen nur 
für z.b. 10% der Gesamtzeit laufen lassen willst, aber das ist extrem 
selten und für den Anfang meist unnötig und verwirrend.


Wenn du intern einen niedrigen Takt benötigst, dann :

- nimmst du z.b. eine PLL und setzt gleich den Takt runter (lohnt nur 
wenn große Teile/gesamte Chip damit betrieben werden)
oder
- gehst über einen Zähler der EINMAL(z.b. beim Überlauf) eine Eins 
ausspuckt die du dann als enable nutzt.

Autor: theo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wenn ich das über einen Zähler realisiere und beim Überlauf eine 1 
ausgebe, bleibt dann das Problem der Beeinflussung der Länge des 
enable-Signales doch aber bestehen. Wie lang liegt nach einem steigenden 
Flanke das enable-Signal auf High, bevor es wieder auf Low zurückkehrt?
Mein derzeitiger Wissensstand sagt mir doch ,dass ich keine "wait for 
100 ms" in synthetisierbare Prozesse einbinden kann.

Also müsste ich, um es mit einem Zähler zu realisieren, doch den Zähler 
über die gesamte Periodendauer des enablesignals (Highzeit+Lowzeit) 
laufen lassen. So kann ich dann sagen bei Zählerstand 399 --> High und 
bei Zählerstand 699 --> Low, um den Zähler bei 999 letztlich zu reseten.

(Alles Beispielwerte)

Hoffe das ich das so richtig verstehe...

Danke für die Unterstützung

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Denkweise ist entweder falsch oder wir reden aneinander vorbei...

>> beim Überlauf eine 1
>> ausgebe, bleibt dann das Problem der Beeinflussung der Länge des
>> enable-Signales

das enable signal benötigt keine länge, es ist immer genau EINEN takt 
lang aktiv.

bsp :

32mhz und zähler bis 32. alle 1µs wird ein enable erzeugt.

Zusammen mit dem 32mhz clock und dem enable vom zähler ergibt das z.b. 
ein Flipflop das höchstens mit 1 mhz "schaltet".


was du vorhast ist
a) entweder ein gated clock den es zu vermeiden gilt : 
http://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD

b) eine PWM die z.b. nach der Methode in meinem ersten Post 
funktioniert.


In jedem Fall kann ich mir nur schwer vorstellen warum man ein enable 
für mehrere aufeinander folgende Takte benutzen will, was Möglichkeit c) 
wäre.

Das wäre dann eine Schaltung die z.b. 10% der Zeit full-speed läuft und 
90% der zeit garnicht und ich halte es für unwarscheinlich das du sowas 
suchst.

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.