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 | signal counter : integer range 0 to (25000000/2)-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 | LIBRARY ieee; |
2 | USE ieee.std_logic_1164.ALL; |
3 | USE ieee.numeric_std.ALL; |
4 | :
|
5 | :
|
6 | signal count : unsigned (23 downto 0); -- (25000000/2)-1 |
7 | :
|
8 | begin
|
9 | |
10 | process(clk) |
11 | begin
|
12 | if clk'event and clk = '1' then |
13 | if count < to_unsigned((25000000/2)-1,24) then |
14 | count <= count + 1; |
15 | else
|
16 | count <= to_unsigned(0,24); |
17 | end if; |
18 | end if; |
19 | end process; |
20 | |
21 | LED_1 <= count(23); |
22 | :
|
23 | :
|
28 Bit scheinen mir etwas zuviel, damit kannst du auf fast 270Mio zählen, das ist nicht nötig.
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.
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.
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.
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 | LIBRARY ieee; |
2 | USE ieee.std_logic_1164.ALL; |
3 | USE ieee.numeric_std.ALL; |
4 | :
|
5 | :
|
6 | signal count : integer range 0 to (25000000/4)-1 := 0 |
7 | signal led : std_logic := '0'; |
8 | :
|
9 | begin
|
10 | |
11 | process(clk) |
12 | begin
|
13 | if rising_edge(clk) then |
14 | if (count<(25000000/4)-1) then |
15 | count <= count + 1; |
16 | else
|
17 | led <= not led; |
18 | count <= 0; |
19 | end if; |
20 | end if; |
21 | end process; |
22 | |
23 | LED_1 <= led; |
24 | :
|
25 | :
|
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 | signal count : std_logic_vector(0 downto (25000000/2)-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 :-(
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.