www.mikrocontroller.net

Forum: FPGA, VHDL & Co. State Machine startet ohne Event


Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin verzweifelt. Ich habe folgende Statemachine die nach dem Reset 
im State eeprom_idle rumdümpeln sollte:
  stm_p : process(sys_clk, rst_s)
  begin
    if (rst_s = '1') then
      stm_eeprom_wrap <= eeprom_idle;
      start_write_s   <= '0';
      start_read_s    <= '0';
      ack_poll_flag_s <= '0';
    elsif rising_edge(sys_clk) then
      ready <= ready_falling_s;
      case stm_eeprom_wrap is
        when eeprom_idle =>
          if read_mode_i /= Idle_e then
            start_write_s   <= '1';
            stm_eeprom_wrap <= eeprom_send_slave_adr_read;
          else
            start_write_s   <= '0';
            stm_eeprom_wrap <= eeprom_idle;
          end if;

          if write_mode_i /= Idle_e then
            start_write_s   <= '1';
            stm_eeprom_wrap <= eeprom_send_slave_adr_write;
          else
          -- Do nothing here. Otherwise stm_eeprom_wrap 
          -- set in the if clause above will be overwritten.
          end if;

          if ack_poll_flag_s = '1' then
            start_write_s   <= '1';
            stm_eeprom_wrap <= eeprom_ack_poll;
          end if;
        .
        .
        .
        when others =>
          null;
      end case;
    end if;

Wenn ich dann dem Signal read_mode_i z.B. RandomRead_e zuweise (also 
read_mode_i /= Idle_e), sollte die Statemachine eigentlich über die 
Abfrage
if read_mode_i /= Idle_e then
...
in Richtung eeprom_send_slave_adr_read angestoßen werden.
Tatsächlich ist es aber so, dass egal was ich tue, die Statemachine als 
erstes in Richtung eeprom_send_slave_adr_write verlassen wird. Warum???

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil read_mode_i und/oder write_mode_i ungleich Idle_e sind, letzte 
signal zuweisung gewinnt und das waere die wenn write_mode_i ungleich 
Idle_e ist

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und danke für die schnelle Antwort!

Langsam beginne ich an VHDL zu zweifeln.

Nach 1.5 Tagen vergeblichen suchens findet man die Antwort nachdem man 
bei mikrocontroller.net gepostet hat... **grummel**

Das Problem was das folgende:
read_mode_i ist vom Typ

  type read_mode_t is (
    Idle_e,
    CurrentAddressRead_e,
    RandomRead_e,
    SequentialRead_e
    );
  

und write mode_i war vom Typ

  type write_mode_t is (
    ByteWrite_e,
    PageWrite_e,
    Idle_e
    );


Wenn ich jetzt den write_mode_i Typ auf

  type write_mode_t is (
    Idle_e,
    ByteWrite_e,
    PageWrite_e
    );


ändere, also den Zustand Idle_e an die Spitze setze, dann funktioniert 
es... nur warum?????????

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du ein signal ohne initialisierung anlegst, wird der linkeste Wert 
in der aufzaehlung als initialisierung genommen.

Erst war das bei dir ByteWrite_e jetzt Idle_e.

Bei std_logic ist das z.b. 'U';

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

Bewertung
0 lesenswert
nicht lesenswert
> ändere, also den Zustand Idle_e an die Spitze setze, dann funktioniert
> es... nur warum?????????
Der Defaultwert, der dem Zustand zugewiesen wird, ist der erste in der 
Aufzählung. Offenbar hast du nirgends eine Defaultzuweisung an 
write_mode_i. Das hättest du z.B. so machen können:
signal   write_mode_i : write_mode_t :=  Idle_e;

Sowas sieht man aber in der Simulation sofort  :-o

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Signal write_mode_i ist ein Signal der in die Entitiy hineingeführt 
wird. Daher kann man die Initialzuweisung im obigen Beispielcode nicht 
erkennen Die Zuweisung gibt's aber beim Reset in einem anderen 
synchronen Prozess. Das kann es also meiner Meinung nach nicht gewesen 
sein.

Hier der Codeschnipsel zum Reset:
  eeprom_controller : process(clk, rst)
  begin
    if(rst = '1') then
      [...]
      prom_read_mode_i  <= Idle_e;
      prom_write_mode_i <= Idle_e;
    elsif(clk'event and clk = '1') then
    [...]

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann könnte es sich auch um ein Problem in deinem Simulator handeln, der 
die beiden gleichnamigen "idle_e" nicht richtig aufloesen kann. Das 
kannst du umgehen, indem du den Zustand in einem der Typen umbenennst.

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das könnte sein. Ich nutze ghdl unter Ubuntu...

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

Bewertung
0 lesenswert
nicht lesenswert
> Das kannst du umgehen, indem du den Zustand in einem der Typen umbenennst.
Was kommt denn damit raus:
          :
          if read_mode_i /= read_mode_t'val(read_mode_t'pos(Idle_e)) then
          :
          if write_mode_i /= write_mode_t'val(write_mode_t'pos(Idle_e)) then
          :
Damit sollte er die Auflösung schaffen, er wird ja praktisch dazu 
gezwungen...

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.