mikrocontroller.net

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


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity divideby3 is
  port ( reset : in std_logic;
           clk : in std_logic;
             q : out std_logic
       );
end divideby3;

architecture behav of divideby3 is
  type statetype is (S0, S1, S2);
  signal state, nextstate : statetype;
begin
  process (reset, clk)
  begin
    if reset = '1' then
        state <= S0;
    elsif clk'event and clk = '1' then
        state <= nextstate;
    end if;
  end process;

-- Überführungsschaltnetz u. Ausgangsschaltnetz
  process (state) begin
    case state is
        when S0=> nextstate <= S1; q<='0';
        when S1=> nextstate <= S2; q<='1';
        when S2=> nextstate <= S0; q<='0';
   end case;
  end process;
end behav;

Autor: D. I. (Gast)
Datum:

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

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der untere Prozess "läuft" immer, weil es reine Logik ist!

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte eine Initiative zur Bekämpfung veralteter Gewohnheiten 
starten.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.