Forum: FPGA, VHDL & Co. Synchrone Prozesse


von Felix O. (felixanius)


Lesenswert?

Hallo alle,

ich bin noch unerfahren in VHDL und habe eine kurze Frage. Ich arbeite 
an einem Projekt bei dem ich alle Prozesse synchron über den globalen 
Takt laufen lasse. Ich vereinfache mal das Projekt und hoffe ihr könnt 
trotzdem folgen:

In einem Prozess läuft ein Zähler hoch und bei einem bestimmten Wert x, 
soll ein "enable"-Signal ("blinksignal")auf 1 gesetzt werden. Im 
nächsten Prozess soll, immer wenn enable auf 1 ist, ein Output generiert 
werden. Beide Prozesse haben in der Sensitivitätsliste nur die clock.

Das enable ist also nur einen Taktzyklus lang auf 1, wechselt wieder auf 
0, wenn die neue steigende Taktflanke erkannt wird. Genau dann sollte 
aber eignetlich mein zweiter Prozess das enable Signal verarbeiten, aber 
jetzt ist es ja schon wieder auf 0...

Wie geht man hier vor? Macht man das dann so, dass das enable beim Wert 
x auf 1 springt und bei x+1 noch einen Takt lang aktiv bleibt? Oder 
macht man den zweiten Prozess dann asynchron mit enable in der 
Sensiliste? Oder gibt es noch eine andere Möglichkeit?

Hier der noch nicht funktionierende Code:
1
if rising_edge(clk_50) then
2
      if (data_in(7 downto 3) = "11001") or (data_in = "11100000") then         -- Blinklicht, langsam/ einzelne LEDs, alle LEDs
3
        if (blink_counter < unsigned(blinklicht_langsam)) then
4
          blink_counter <= blink_counter + 1;
5
          blinksignal <= '0';
6
          
7
        elsif  (blink_counter = unsigned(blinklicht_langsam)) then               -- wenn counter bei 50 Mio, also nach 1s -> aktiviere Blinksignal
8
          blink_counter <= (others => '0');                    -- und resette counter
9
          blinksignal <= '1';                          -- LED soll aufblinken
10
        end if;

und im zweiten Prozess sowas wie:
1
if rising_edge(clk_50) then
2
if (blinksignal = '1') then  
3
...

von Tippgeber (Gast)


Lesenswert?

nein, nur den Takt. Die Signale fragst Du intern ab und damit dann, wenn 
der Takt taktet und eben nicht wenn sich das Signal irgendwann vorher 
ändert.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix O. schrieb:
> Oder macht man den zweiten Prozess dann asynchron mit enable in der
> Sensiliste?
Vielleicht ein kleiner Hinweis: die Sensitivliste ist nur und 
ausschließlich für die Simulation interessant. Der Synthesizer meldet 
nur, wenn sie nicht vollständig ist, und zeigt damit an, dass die 
erzeugte Hardware nicht zur Simulation passt...

> wenn die neue steigende Taktflanke erkannt wird.
Du denkst zu sehr in "Software". Überleg dir mal, wie das "Erkennen 
einer steigenden Taktflanke" in Hardware aussieht. Klar: das ist ein 
stinknormales Flipflop. Kein anderes Bauteil in einem FPGA kann eine 
Taktflanke "erkennen". Und nicht mal das Flipflop "erkennt" die 
Taktflanke, sondern es "übernimmt" mit dieser Taktflanke lediglich den 
Pegel, der dabei gerade an seinem Eingang anliegt.

: Bearbeitet durch Moderator
von Felix O. (felixanius)


Lesenswert?

Lothar Miller schrieb:

>
>> wenn die neue steigende Taktflanke erkannt wird.
> Du denkst zu sehr in "Software". Überleg dir mal, wie das "Erkennen
> einer steigenden Taktflanke" in Hardware aussieht. Klar: das ist ein
> stinknormales Flipflop. Kein anderes Bauteil in einem FPGA kann eine
> Taktflanke "erkennen". Und nicht mal das Flipflop "erkennt" die
> Taktflanke, sondern es "übernimmt" mit dieser Taktflanke lediglich den
> Pegel, der dabei gerade an seinem Eingang anliegt.

Heißt, es würde funktionieren so wie ich das gemacht habe, da ja bei der 
nächsten steigenden Taktflanke das enable noch den Wert 1 hat?


Wenn es so wäre hätte ich an anderer Stelle einen Fehler, da mir die 
Simulation anzeigt, dass der output immer nur derjenige ist, der bei 
enable = 0 ausgegeben werden soll :/

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix O. schrieb:
> Heißt, es würde funktionieren so wie ich das gemacht habe, da ja bei der
> nächsten steigenden Taktflanke das enable noch den Wert 1 hat?
Ja.

> Wenn es so wäre hätte ich an anderer Stelle einen Fehler, da mir die
> Simulation anzeigt, dass der output immer nur derjenige ist, der bei
> enable = 0 ausgegeben werden soll :/
Das kann man am geposteten Code nicht erkennen...

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.