Forum: FPGA, VHDL & Co. Frage zu VHDL Programm


von Karl (Gast)


Lesenswert?

Hallo,

untenstehendes Programm ist die Musterlösung zu einer Übungsaufgabe. Das 
Programm soll einen 3:1 Taktteiler darstellen. Mein Frage dazu ist: 
weder "state" noch "nextstate" sind initialisiert. Ich nehme an, sie 
bekommen einen der Werte die für diesen Datentyp definiert sind 
zugewiesen. Wenn beide Signale den selben Werte zugewiesen bekommen, 
wird sich "state" nie ändern und das Ding läuft nie an es sei denn 
irgendwann wird ein Reset ausgeführt. Stimmt das oder übersehe ich 
irgendwas?
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.std_logic_unsigned.all;
4
entity divideby3 is
5
  port ( reset : in std_logic;
6
           clk : in std_logic;
7
             q : out std_logic
8
       );
9
end divideby3;
10
11
architecture behav of divideby3 is
12
  type statetype is (S0, S1, S2);
13
  signal state, nextstate : statetype;
14
begin
15
  process (reset, clk)
16
  begin
17
    if reset = '1' then
18
        state <= S0;
19
    elsif clk'event and clk = '1' then
20
        state <= nextstate;
21
    end if;
22
  end process;
23
24
-- Überführungsschaltnetz u. Ausgangsschaltnetz
25
  process (state) begin
26
    case state is
27
        when S0=> nextstate <= S1; q<='0';
28
        when S1=> nextstate <= S2; q<='1';
29
        when S2=> nextstate <= S0; q<='0';
30
   end case;
31
  end process;
32
end behav;

von D. I. (Gast)


Lesenswert?

wie kommst du drauf dass state sich nie ändern wird wenn state = 
nextstate am anfang gilt?

von Karl (Gast)


Lesenswert?

>wie kommst du drauf dass state sich nie ändern wird wenn state =
>nextstate am anfang gilt?

Weil nach allem was ich bisher gelernt hab (zugegebenermßen nicht viel) 
der untere Prozess nur aufgerufen wird wenn "state" sich ändert. Das 
passiert aber nicht wenn state = nextstate ist.

von Iulius (Gast)


Lesenswert?

Ist halt eine 2 Prozessbeschreibung...
Einen process getaktet und einen process nur kombinatorik.


Nextstate existiert demnach überhaupt nicht wirklich als Zustand in der 
hardware, sondern fasst lediglich die Kombinatorik für die 
weiterschaltung zusammen.

Eine der typischen Nachteile von vhdl : signal ist sowohl register als 
auch kombinatorik/Kabel.

Insbesondere übersieht man gerne mal das Prozesse garnicht getaktet sind 
und demzufolge darin (hoffentlich) kein FF steckt.


Die Beschreibung funktioniert also. Das sie jedoch sinnvoll ist wage ich 
nichtmal zu behaupten.


>> Weil nach allem was ich bisher gelernt hab (zugegebenermßen nicht viel)
der untere Prozess nur aufgerufen wird wenn "state" sich ändert

die Kombinatorik in Prozess 2 muss auch nur dann einmal aufgerufen 
werden wenn sich state geändert hat.

Das betrifft aber eh nur die simulation.

von Karl (Gast)


Lesenswert?

>die Kombinatorik in Prozess 2 muss auch nur dann einmal aufgerufen
>werden wenn sich state geändert hat.

Ja, aber der untere Prozess kann nur aufgerufen werden, wenn sich 
"state" ändert (richtig oder falsch?)

Das sich "state" aber  (zumindest für die von mir getroffenen Annahmen 
dass bei Programmstart sate=nextstate ist) nie ändert, wird auch nie der 
Prozess aufgerufen.

von Karl (Gast)


Lesenswert?

Der untere Prozess "läuft" immer, weil es reine Logik ist!

von Iulius (Gast)


Lesenswert?

Zu Beginn ändert sich state in der Simulation initial einmal auf 'U' 
oder was auch immer undefined bei einem State ist, deswegen wird einmal 
Prozess 2 ausgeführt.

Anders geht das halt bei dieser Art der Beschreibung nicht. Würdest du 
den Process mit clk aktualisieren, dann wäre das Verhalten ggf nicht 
mehr identisch, denn das Verhalten der Kombinatorik hinter den FFs 
ändert sich nunmal sofort wenn die FFs den Zustand ändern.

In der Hardware ist das wie gesagt egal.

von D. I. (Gast)


Lesenswert?

Man sollte eine Initiative zur Bekämpfung veralteter Gewohnheiten 
starten.

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


Lesenswert?

> Man sollte eine Initiative zur Bekämpfung veralteter Gewohnheiten
> starten.
Richtig, mann sollte eine Initiative zur Bekämpfung der 
Zwei-Prozess-Schreibweise starten  ;-)

>  deswegen wird einmal Prozess 2 ausgeführt.
Jeder Prozess mit Sensitivliste wird beim Start einmal komplett 
ausgeführt.
Jeder Prozess ohne Sensitivliste wird beim Start bis zum ersten wait 
ausgeführt.

von Karl (Gast)


Lesenswert?

>Zu Beginn ändert sich state in der Simulation initial einmal auf 'U'
>oder was auch immer undefined bei einem State ist, deswegen wird einmal
>Prozess 2 ausgeführt.



>Jeder Prozess mit Sensitivliste wird beim Start einmal komplett
>ausgeführt.


Ok, diese Information hat mir gefehlt, danke  ;)

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.