Forum: FPGA, VHDL & Co. VHDL, FPGA zwei clock cycles langen Puls erzeugen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von zimmerpflanze (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin noch blutiger VHDL und FPGA Anfänger, desshalb diese 
wahrscheinlich sehr einfache Frage für die ich aber leider trotzdem 
keine Antwort gefunden habe..

Ich habe einen 50 Mhz Taktgeber (Quarzoszillator) und möchte in 
regelmäßigen Abständen, also mit fester Frequenz einen kurzen, zwei 
clock cycles langen Puls erzeugen.

Mein VHDL Code dafür sieht bisher so aus:
  
 -- signale in der architecture: 
 signal r_pulse   : std_logic := '0';
 signal r_count1   : integer range 0 to 25000000 := 0;
 signal r_count2   : integer range 0 to 2 := 0;

  
 -- Prozess nach begin Key-Word..
pulse_generator: process(i_main_Clk)
 
 begin
  if rising_edge(i_main_Clk) then
    if r_count1 = (25000000-1) then
      r_count1 <= 0;
      r_pulse <= not r_pulse;
    else 
      r_count1 <= r_count1 + 1;
    end if;
    
    if r_pulse = '1' and r_count2 < 2 then
      r_count2 <= r_count2 + 1;
    elsif r_count2 = 2 then
      r_pulse <= '0';
      r_count2 <= 0;
    end if;
  end if;
 end process;

 o_pulse  <= r_pulse;


i_main_Clk ist der 50 Mhz Takt. Und r_pulse soll der zwei clock cycles 
lange Puls werden.

Das funktioniert in meinem FPGA auch (fast) so wie ich es mir vorstelle.
Im Anhang ein Bild vom Logic Analyzer.
1. Der Puls ist 60ns Sekunden lang. Wie schaffe ich es ihn nur 40ns 
Sekunden lang zu machen? Das Register r_count2 wird ja schon auf <2 
verglichen..
2. Gibt es für das Problem eine schönere Lösung, ich habe das Gefühl das 
ist eher keine wirklich schöne Lösung, aber mir fehlt da glaub ich noch 
die Erfahung.

Danke schonmal für jede Hilfe. Gruß

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Achtung: Es sieht aus als zaehlst du von 0 bis 2, sprich der Zaehler 
durchlaeuft die Zustaende 0, 1, 2, also 3 Cycles! Aendere mal die 2 ab 
zu eienr 1. ;-)

Kleiner Tipp: Verwende am besten eine Konstante!

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Tobias B. schrieb:
> Es sieht aus als zaehlst du von 0 bis 2
Das ist ein gern gemachter Fehler, er nennt sich Off-by-one Error.

zimmerpflanze schrieb:
> 2. Gibt es für das Problem eine schönere Lösung, ich habe das Gefühl das
> ist eher keine wirklich schöne Lösung, aber mir fehlt da glaub ich noch
> die Erfahung.
Ich würde es so probieren
begin
  if rising_edge(i_main_Clk) then
    if r_count1 = 25000000-1 then
      r_count1 <= 0;
      o_pulse  <= '1';
    else 
      r_count1 <= r_count1 + 1;
    end if;
    if r_count1 = 1 then 
      o_pulse  <= '0';
    end if;
  end if;
end process;
Und ich würde die Unterstriche weglassen. Sie machen den Text durch die 
vielen Lücken schlecht lesbar.

BTW: wenn ich den Code mit seinen Unterstrichen so sehe, habe ich ein 
DejaVu vom Beitrag "[VHDL] Komplexität von Prozessen"
Kennt ihr euch?

: Bearbeitet durch Moderator
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Tobias B. schrieb:
>> Es sieht aus als zaehlst du von 0 bis 2
> Das ist ein gern gemachter Fehler, er nennt sich Off-by-one Error.

Exakt. Und damit der TO noch ein bisschen mehr Lernstoff hat, kann er 
sich nebem dem OBOE auch mal den Fencepost Error anschauen:

https://de.wikipedia.org/wiki/Off-by-one-Error
https://de.wikipedia.org/wiki/Zaunpfahlfehler

von zimmerpflanze (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tobias B. schrieb:
> Achtung: Es sieht aus als zaehlst du von 0 bis 2, sprich der Zaehler
> durchlaeuft die Zustaende 0, 1, 2, also 3 Cycles! Aendere mal die 2 ab
> zu eienr 1. ;-)

Danke, das war natürlich auch mein erster Gedanke. Ich hab nur leider 
vergessen die Zahl in der elsif Abfrage ebenfalls zu ändern..
Hab das jetzt in eine Konstante gepackt, damit sollte mir sowas nicht 
mehr passieren.

Lothar M. schrieb:
> Ich würde es so probieren

Danke, das ist auf jeden Fall eine bessere Lösung.

Lothar M. schrieb:
> BTW: wenn ich den Code mit seinen Unterstrichen so sehe, habe ich ein
> DejaVu vom Beitrag "[VHDL] Komplexität von Prozessen"
> Kennt ihr euch?

Nein, der Post war nicht von mir. Ich dachte die Konvention, Signale in 
vhdl mit [Buchstabe für Funktion]_[Name] zu schreiben wäre so üblich. 
Das habe ich in vielen Texten so gelesen. Mir hilft das tatsächlich 
ziemlich gut. So sehe ich auf den ersten Blick was ein Register, ein 
Ein- oder Ausgang, oder nur ein 'wire' Signal ist bzw. verstehe den Code 
von anderen Leuten viel schneller.
Falls das jemanden interessiert, hier ein Link zu dem Thema.
https://www.nandland.com/articles/coding-style-recommendations-vhdl-verilog.html

Tobias B. schrieb:
> https://de.wikipedia.org/wiki/Off-by-one-Error
> https://de.wikipedia.org/wiki/Zaunpfahlfehler

Danke, werde ich mir anschauen.

von Christoph Z. (christophz)


Bewertung
0 lesenswert
nicht lesenswert
zimmerpflanze schrieb:
> Nein, der Post war nicht von mir. Ich dachte die Konvention, Signale in
> vhdl mit [Buchstabe für Funktion]_[Name] zu schreiben wäre so üblich.

Die gleiche Diskussion gibt es in jeder Programmiersprache. Nennt sich 
Prefix Notation.

Ich mag das gar nicht, da es mit der Autocompletion von Editoren bricht. 
Ich möchte den Beginn des Namen eintippen können und dann automatisch 
vervollständigen. Dass dann danach (Postfix Notation) auch gleich 
dransteht, was das für ein Ding ist, das mache ich auch und finde ich 
auch hilfreich.

Ob Unterstriche oder Grossbuchstaben, da wird es dann schon fast 
religiös bei manchen Diskussionen. Wichtigster Punkt dabei ist für mich, 
dass ein Code einen Stil konsequent anwendet, sonst bekomme ich Knoten 
in meinen Hirnwindungen, wenn ich daran arbeiten soll :-)

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.