Forum: FPGA, VHDL & Co. FPGA - VHDL - durch TAKT umschalten


von Vi-ta-lee U. (uv-777)


Lesenswert?

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;

--------

von Gast (Gast)


Lesenswert?

[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?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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;

von Vi-ta-lee U. (uv-777)


Lesenswert?

Wow Danke Leute,

ging ja super schnell!!!

Ich werds gleich ausprobieren und euch hoffentlich die Funktion 
bestätigen.

Vi-Ta-Lee

von ms (Gast)


Lesenswert?

SOWAS meint er garantiert nicht, schaus dir mal genau an

von ms (Gast)


Lesenswert?

Oder doch, mein fehler :)

von Vi-ta-lee U. (uv-777)


Lesenswert?

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;

von Gast (Gast)


Lesenswert?

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?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Vi-ta-lee U. (uv-777)


Lesenswert?

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"

von Vi-ta-lee U. (uv-777)


Lesenswert?

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';

von Gast (Gast)


Lesenswert?

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;

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ä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.

von Vi-ta-lee U. (uv-777)


Lesenswert?

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