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


von zimmerpflanze (Gast)


Angehängte Dateien:

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:
1
  
2
 -- signale in der architecture: 
3
 signal r_pulse   : std_logic := '0';
4
 signal r_count1   : integer range 0 to 25000000 := 0;
5
 signal r_count2   : integer range 0 to 2 := 0;
1
  
2
 -- Prozess nach begin Key-Word..
3
pulse_generator: process(i_main_Clk)
4
 
5
 begin
6
  if rising_edge(i_main_Clk) then
7
    if r_count1 = (25000000-1) then
8
      r_count1 <= 0;
9
      r_pulse <= not r_pulse;
10
    else 
11
      r_count1 <= r_count1 + 1;
12
    end if;
13
    
14
    if r_pulse = '1' and r_count2 < 2 then
15
      r_count2 <= r_count2 + 1;
16
    elsif r_count2 = 2 then
17
      r_pulse <= '0';
18
      r_count2 <= 0;
19
    end if;
20
  end if;
21
 end process;
22
23
 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


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
1
begin
2
  if rising_edge(i_main_Clk) then
3
    if r_count1 = 25000000-1 then
4
      r_count1 <= 0;
5
      o_pulse  <= '1';
6
    else 
7
      r_count1 <= r_count1 + 1;
8
    end if;
9
    if r_count1 = 1 then 
10
      o_pulse  <= '0';
11
    end if;
12
  end if;
13
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


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)


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)


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 :-)

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
Noch kein Account? Hier anmelden.