Hallo, könnte eine banale Frage sein, aber irgendwie komme ich nicht auf die Lösung. Kann mir da bitte jemand helfen? Wie kann ich bei jeder steigenden Flanke des CLK mit jedem kurzen Impuls des Signals "Nächste" einen "Ausgang" abwechselnd umschalten. Also bei jedem "Nächste" soll "Ausgang" von 0 auf 1 und umgekehrt wechseln, das ganze aber synchron zum CLK und in VHDL. Vielen Dank für eure Vorschläge. Mein Ansatz wäre sowas (ist natürlich falsch): --------- if naechste='1' then zahl <= zahl + 1; elsif zahl_a="1" then Ausgang<='1'; zahl<="0"; else Ausgang<='0'; end if; --------
[vhdl] if (CLK'event and CLK = '1') then if (naechste = '1') then ausgang = '1'; else ausgang = '0'; end if; end if; [vhdl] meinst du sowas?
Ich vermute er meint so etwas:
1 | if (CLK'event and CLK = '1') then |
2 | if (naechste = '1') then |
3 | ausgang <= not ausgang; |
4 | end if; |
5 | end if; |
Wow Danke Leute, ging ja super schnell!!! Ich werds gleich ausprobieren und euch hoffentlich die Funktion bestätigen. Vi-Ta-Lee
Hab nun folgendes drin: Die Ausgänge CS und WR bleiben aber ständig 0, warum?
1 | ---
|
2 | signal Puffer1: STD_LOGIC; |
3 | signal Puffer2: STD_LOGIC; |
4 | |
5 | begin
|
6 | |
7 | process (CLK, Reset) |
8 | begin
|
9 | if Reset='1' then |
10 | CS <= '0'; |
11 | WR <= '0'; |
12 | |
13 | |
14 | elsif CLK>='1' and CLK'event then |
15 | |
16 | -- if ......
|
17 | |
18 | elsif (naechste = '1') then |
19 | Puffer1 <= not Puffer1; |
20 | Puffer2 <= not Puffer2; |
21 | CS <= Puffer1; |
22 | WR <= Puffer2; |
23 | end if; |
24 | |
25 | end if; |
26 | |
27 | end process; |
28 | |
29 | |
30 | end Behavioral; |
Weil das ziemlich albern ist... Das letzte "else if" ist deiner Originalaufgabenstellung nach falsch (sollte stattdessen nur ein "if" sein). außerdem: Welchen Wert hat RESET?
Schreib mal zur Sicherheit:
1 | signal Puffer1: STD_LOGIC := '0'; |
2 | signal Puffer2: STD_LOGIC := '0'; |
Zumindest ISim kommt damit besser klar.
1 | > elsif CLK>='1' and CLK'event then |
Was soll denn dieses >='1' bedeuten? Ein CLK='1' sollte doch wohl reichen.
1 | > -- if ...... |
Bist du sicher, dass diese Bedingung auch irgendwann mal false wird, sodass das darauf folgende elsif überhaupt eine Wirkung haben kann? Ansonsten kann ich keinen direkten Fehler erkennen; dazu muss mehr des drumherum bekannt sein.
Nun habe ich das elsif gegen if ersetzt. Der Reset tritt nur ganz kurz am Anfang auf und "Resetet" mir alles. Die jetzige Simulation setzt mir die nach dem Reset die Ausgänge (WR und CS) auf 0, nach dem ersten "naechste" Takt sind jedoch die Ausgänge ständig "undefiniert"
So es funktioniert, vielen DANK an alle!!!! Ihr glaubt garnicht, wie lange mich das beschäftigt hat! Der Fehler lag diesmal an dem ISim
1 | signal Puffer1: STD_LOGIC := '0'; |
2 | signal Puffer2: STD_LOGIC := '0'; |
1 | signal Puffer1: STD_LOGIC := '0'; |
2 | signal Puffer2: STD_LOGIC := '0'; |
3 | |
4 | begin
|
5 | |
6 | process (CLK, Reset, Puffer1, Puffer2) |
7 | begin
|
8 | if Reset='1' then |
9 | CS <= '0'; |
10 | WR <= '0'; |
11 | else
|
12 | if (CLK'event and CLK = '1') then |
13 | if (naechste = '1') then |
14 | Puffer1 <= not Puffer1; |
15 | Puffer2 <= not Puffer2; |
16 | CS <= Puffer1; |
17 | WR <= Puffer2; |
18 | end if; |
19 | end if; |
20 | end if; |
21 | end process; |
22 | |
23 | end Behavioral; |
Äh, Moment mal. Welchen FPGA-Typ verwendest du? Viele Typen erlauben eine automatische Initialisierierung, d.h. die Zustände der FFs nach der Konfiguration können in VHDL durch das := festgelegt werden. Dadurch würdest du dir den Reset sparen - solche Resets sind nicht ganz ungefährlich (hier Beitrag "FPGA: Verständnisproblem, asynch. Reset" wurde das ausgiebig diskutiert, hoffentlich hab ich den richtigen Beitrag erwischt). Außerdem setzt du bei deinem Reset die Ausgänge CS und WR auf '0' - es wäre vermutlich besser, Puffer1/2 auf 0 zu setzen. Und:
1 | elsif (naechste = '1') then |
2 | Puffer1 <= not Puffer1; |
3 | Puffer2 <= not Puffer2; |
4 | CS <= Puffer1; |
5 | WR <= Puffer2; |
Dir ist klar, dass das ein FIFO ist: Bei einer Taktflanke wird Puffer1 auf '1' gesetzt, bei der folgenden Flanke wird dann auch CS auf '1' gesetzt, während im gleichen Moment Puffer1 auf '0' gesetzt wird. Vermutlich meinst du so etwas:
1 | process (CLK,Reset) |
2 | begin
|
3 | if (Reset = '1') then |
4 | Puffer1 <= '0'; |
5 | Puffer2 <= '0'; |
6 | else
|
7 | if (CLK'event and CLK='1') then |
8 | if (Naechste = '1') then |
9 | Puffer1 <= not Puffer1; |
10 | Puffer2 <= not Puffer2; |
11 | end if; |
12 | end if; |
13 | end if; |
14 | end process; |
15 | CS <= Puffer1; |
16 | WR <= Puffer2; |
Allerdings könntest du dir dabei die 2 Puffer sparen, da sie ja eh ständig den gleichen Wert haben.
Vielen Dank Leute, es waren alles sehr nützliche Tips: 1. Problem gelöst (Wechsel durch Takt) 2. Viel gelernt: Nämlich: Sehr nützlicher Tip mit dem FIFO (anderes Problem gelöst) und das man die Variablen = 0 setzen sollte und nicht den Ausgang!
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.