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
signalr_pulse:std_logic:='0';
4
signalr_count1:integerrange0to25000000:=0;
5
signalr_count2:integerrange0to2:=0;
1
2
-- Prozess nach begin Key-Word..
3
pulse_generator:process(i_main_Clk)
4
5
begin
6
ifrising_edge(i_main_Clk)then
7
ifr_count1=(25000000-1)then
8
r_count1<=0;
9
r_pulse<=notr_pulse;
10
else
11
r_count1<=r_count1+1;
12
endif;
13
14
ifr_pulse='1'andr_count2<2then
15
r_count2<=r_count2+1;
16
elsifr_count2=2then
17
r_pulse<='0';
18
r_count2<=0;
19
endif;
20
endif;
21
endprocess;
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ß
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!
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
ifrising_edge(i_main_Clk)then
3
ifr_count1=25000000-1then
4
r_count1<=0;
5
o_pulse<='1';
6
else
7
r_count1<=r_count1+1;
8
endif;
9
ifr_count1=1then
10
o_pulse<='0';
11
endif;
12
endif;
13
endprocess;
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?
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.htmlTobias B. schrieb:> https://de.wikipedia.org/wiki/Off-by-one-Error> https://de.wikipedia.org/wiki/Zaunpfahlfehler
Danke, werde ich mir anschauen.
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 :-)