FPGA - VHDL - durch TAKT umschalten

OP #1287324
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;

--------
OP #1287384
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;
Persönliche Seite #1287393
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.
Gast #1287412
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;
Persönliche Seite #1287417
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren