Hallo, ich bin neu in VHDL und muss ein zähler mit FPGA programmieren.ich muss ein VHDL-block erstellen, der die Takt-frequenz des FPGA-board(25Mhz)auf 2hz herunter teilt und der ausgangssignal soll dabei zur kontrolle mit einer LED verknüpft werden,so dass die generierte frequenz sichtbar gemacht wird.ich habe schon etwas gemacht aber klappt nicht.ein freund meinte ich soll der cnt bis 28 zählen warun verstehe ich gar nicht.bitte helfen sie mir.
> ich habe schon etwas gemacht aber klappt nicht.
Ich könnte das schon schnell hinschreiben, aber damit wäre dir nicht
unbedingt geholfen. Lass doch sehen, was du schon hast.
Ein Tipp:
Du brauchst einen Zähler, der von 0 bis (25000000/2)-1 zählt.1 | |
Der wird jetzt mit jedem Takt (25MHz) hochgezählt und beim Endwert wieder auf 0 gesetzt. Das MSB davon schließt du an die LED an. Fertig.
Ok, ich habe den Anhang übersehen :-/ (Aber docx ist numal auch kein gängiges vhdl-Fileformat) Ich verbessere mich: Mit dem Integer ist die Rückwandlung des MSB etwas umständlich. Einfacher geht es mit dem Vektortyp unsigned aus der numeric_std Lib.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
28 Bit scheinen mir etwas zuviel, damit kannst du auf fast 270Mio zählen, das ist nicht nötig.
danke ich hatte schon gedacht dass etwas nicht stimmt.ich versuche nochmal
ich gerade auch eine schnittstelle von der aufgabe bekommen und die lautet so: eingänge: clk, reset_n(werden alle ausgangssignale auf null gesetz) ausgänge: clk_out selbst erzeugte frequenz von 2hz interne signal : count--zähler und clk_temp es kann auch ein interne signal verwenden, dass die fpga-taktzyklen zählt.beim erreichen durch die vorgegeben frequenzen zu bestimmenden zeipunktes wird das interne signal "clk_temp" invertiert.dann wird clk_temp an das ausgangssignal clk_out übergeben welches mit der LED auf der board verknüpfen ist.
Gast
#1124448
Wenn das Puls-Pausen Verhältnis des Ausgangstaktest 50% sein soll, würde ich einen Counter machen, der nicht 0,5s lang läuft, sondern 0,25s. Dann jedesmal wenn der Counterwert erreicht ist, den Ausgang für die LED toggeln.
der muss aber 0,5s laufen.dieser aufgabe macht mich schon fertig ich weiss est nicht mehr weiter.wenn eine weiss wie das geht bitte hilfe.
Gast
#1124462
Na wenn du deine LED für 0,25 sekunden an und dann für 0,25 sekunden aus hast, dann ist doch eine Periode 0,5s = 2 Hz lang.
Gast
#1124480
also mal ganz ausführlich: 2Hz ist eine Zeit von 0,5 Sekunden. In dieser Zeit muss das Signal einmal High und dann Low sein. Das heisst dann eine Periode. Und wenn du willst, dass das Signal ein Rechteck ist, in dem die Zeit, wo es Hig und die Zeit, wo es low ist, gleich lang sind.. also sowas -- ---- -- -- ------ -- | | | | | | | | ---- ---- und NICHT sowas: -- -- dann ist doch die LED für 0,25s an und für 0,25s aus. Und dann ist es doch recht naheliegend, einen Zähler zu bauen, der auf 0,25s zählt, dann den Zustand der LED umdreht und wieder von vorne anfängt zu zählen usw.. Dein Zähler läuft mit 25MHz. Das heisst, er zählt alle 40ns um eins weiter. Wie oft muss man um 40ns zählen, um auf 0,25 sekunden zu kommen? --> 0,25s / 40 ns = 6 250 000. Und da der Zähler üblicherweise bei null anfängt, zählst auf 6 249 999. Also: Ein Zähler, der von 0 auf 6249 999 zählt. Und immer, wenn er diesen Wert erreicht hat, schaltet er den Zustand der LED um, setzt sich selbst wieder auf 0 zurück und beginnt von vorne. Ich hoff, ich konnte dir helfen.
So etwa: (jetzt darfs wieder integer sein, das ist einfacher ;-)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
Gast
#1124491
Ganz genau so mein ich es, Lothar ;-)
so hatte ich eben geschrieben.
ich danke euch, dass ihr mir hilft
Gast
#1124539
im Prinzip richtig, wenn ich das auf die Schnelle seh. Allerdings geh ich davon aus, dass reset_n low-aktiv ist, also sollte auch die Abfrage auf '0' erfolgen. Ausserdem glaub ich nicht, dass du count <= count + 1 schreiben kannst, wenn count std_logic_vector ist. Könnte sein, dass du dann den vollen Vektor addieren musst. Also count <= count + "000000000000000000000000001";
Das geht:
> count <= count + '1';
EDIT:
6249999 sind bei mir x"5F5E0F"
Das korreliert gar nicht mit
"10111110101111000010000000"
So wird das mit dem Vektor nicht gehen:1 | |
Du kannst nicht nur die Sahnehäubchen aus meinem Code naschen, nein das geht nicht ;-) Versuch mal zu verstehen, was ich da hingeschrieben habe. Und der Vergleich wäre so etwas übersichtlicher: > if count = "10111110101111000010000000" then > if count = "10" & x"FAF080" then Aber wie oben schon gesagt: sowieso die falsche Zahl :-(
Gast
#1124547
ok, Lothar, das wusste ich auf die Schnelle nicht mehr.
ok der Reset_n ist auf low-aktiv hatte ich vergessen aber was mir noch stört ist diese übergabe weil mein count ist ein Vector und LED variable und habe gelesen das mann die so nicht konvertieren kann. danke
Gast
#1125218
Hmm, Sandra, ich glaub, bei dir müssen wir ein wenig weiter ausholen. Woher kommt die Aufgabe eigentlich, die du da lösen sollst? Also ist das im Rahmen einer Vorlesung oder Unterricht? Ich schau mir grad deinen Code nochmal an. Also ich weiss nicht, wie du drauf kommst, dass LED ne Variable ist. Die LED ist ein Port vom Typ std_logic, so wie alle Signale auch, die du verwendest. Daher gibt es da keine Probleme bei irgendwelchen "Übergaben". Ausserdem übergibst du ja eh nicht den Zähler an die LED, sondern du machst Folgendes (versuch dir das mal in Hardware mit Gattern aufgebaut vorzustellen): Du nimmst einen Zähler. (count <= count + '1'). Diesen Zähler vergleichst du über einen Vergleicher mit deinem Grenzwert (if count = xxxxxx then...) Wenn der Zähler also den Wert erreicht hat, dann wird der Zähler zurückgesetzt und gleichzeitig wird das SIGNAL clk_temp invertiert. Du "übergibst" also nirgends irgendwelche Signale oder Variablen, sondern führst in Abhängigkeit des Zustandes des Zählers Veränderungen am Signal clk_temp durch. Dieses Signal wird am Ende auf deinen Port LEDx verdrahtet. uffz. ich hoff, das hat dir geholfen
> versuch dir das mal in Hardware mit Gattern aufgebaut vorzustellen Diese Abstraktion der Beschreibung ist überhaupt das wichtigste. z.B. Hardwareentwicklung: Ich zeichne einen Schaltplan, aber ich denke in ICs und Bauteilen. entsprechend FPGA-Design: Ich schreibe VHDL, aber ich denke in Gattern und Logik.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.