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


von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Hallo!

Ich bin verzweifelt. Ich habe folgende Statemachine die nach dem Reset 
im State eeprom_idle rumdümpeln sollte:
1
  stm_p : process(sys_clk, rst_s)
2
  begin
3
    if (rst_s = '1') then
4
      stm_eeprom_wrap <= eeprom_idle;
5
      start_write_s   <= '0';
6
      start_read_s    <= '0';
7
      ack_poll_flag_s <= '0';
8
    elsif rising_edge(sys_clk) then
9
      ready <= ready_falling_s;
10
      case stm_eeprom_wrap is
11
        when eeprom_idle =>
12
          if read_mode_i /= Idle_e then
13
            start_write_s   <= '1';
14
            stm_eeprom_wrap <= eeprom_send_slave_adr_read;
15
          else
16
            start_write_s   <= '0';
17
            stm_eeprom_wrap <= eeprom_idle;
18
          end if;
19
20
          if write_mode_i /= Idle_e then
21
            start_write_s   <= '1';
22
            stm_eeprom_wrap <= eeprom_send_slave_adr_write;
23
          else
24
          -- Do nothing here. Otherwise stm_eeprom_wrap 
25
          -- set in the if clause above will be overwritten.
26
          end if;
27
28
          if ack_poll_flag_s = '1' then
29
            start_write_s   <= '1';
30
            stm_eeprom_wrap <= eeprom_ack_poll;
31
          end if;
32
        .
33
        .
34
        .
35
        when others =>
36
          null;
37
      end case;
38
    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
1
if read_mode_i /= Idle_e then
2
...
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???

von D. I. (Gast)


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

von Heinrich H. (Firma: Ich.AG) (hhanff)


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
1
  type read_mode_t is (
2
    Idle_e,
3
    CurrentAddressRead_e,
4
    RandomRead_e,
5
    SequentialRead_e
6
    );

und write mode_i war vom Typ
1
  type write_mode_t is (
2
    ByteWrite_e,
3
    PageWrite_e,
4
    Idle_e
5
    );

Wenn ich jetzt den write_mode_i Typ auf
1
  type write_mode_t is (
2
    Idle_e,
3
    ByteWrite_e,
4
    PageWrite_e
5
    );

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

von D. I. (Gast)


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';

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


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:
1
signal   write_mode_i : write_mode_t :=  Idle_e;

Sowas sieht man aber in der Simulation sofort  :-o

von Heinrich H. (Firma: Ich.AG) (hhanff)


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:
1
  eeprom_controller : process(clk, rst)
2
  begin
3
    if(rst = '1') then
4
      [...]
5
      prom_read_mode_i  <= Idle_e;
6
      prom_write_mode_i <= Idle_e;
7
    elsif(clk'event and clk = '1') then
8
    [...]

von Jan M. (mueschel)


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.

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Das könnte sein. Ich nutze ghdl unter Ubuntu...

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


Lesenswert?

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

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.