Forum: FPGA, VHDL & Co. FSM von ISE nicht erkannt


von T.M. (Gast)


Lesenswert?

Hallo,
habe ein Problem mit dem Webpack bei einem kleinen Versuch ein LCD
anzusteuern. Ich habe eine FSM implementiert, die auch von Modelsim
ordentlich wir gewünscht simuliert wurde, nur erkennt das Webpack diese
nicht als FSM an, und synthetisiert stattdessen einzelne Register...
Hier mein Codeausschnitt:
1
  aktualisierung: process(clk_in)
2
  begin
3
    if clk_in'event and clk_in = '0' then
4
      if cs_intern = '0' then
5
      zustand <= folgezustand;
6
      end if;
7
    end if;
8
  end process aktualisierung;
9
10
  zustandsermittlung: process(zustand)
11
  begin
12
    case zustand is
13
      when 0 => folgezustand <= 1;
14
      when 1 => folgezustand <= 2;
15
      when 2 => folgezustand <= 3;
16
      when 3 => folgezustand <= 4;
17
      when 4 => folgezustand <= 5;
18
      when 5 => folgezustand <= 6;
19
      when 6 => folgezustand <= 7;
20
      when 7 => folgezustand <= 8;
21
      when 8 => folgezustand <= 9;
22
      when 9 => folgezustand <= 10;
23
      when 10 => folgezustand <= 11;
24
      when 11 => folgezustand <= 12;
25
      when 12 => folgezustand <= 13;
26
      when 13 => folgezustand <= 14;
27
      when 14 => folgezustand <= 15;
28
      when 15 => folgezustand <= 16;
29
      when 16 => folgezustand <= 17;
30
      when 17 => folgezustand <= 18;
31
      when 18 => folgezustand <= 19;
32
      when 19 => folgezustand <= 20;
33
      when 20 => folgezustand <= 21;
34
      when 21 => folgezustand <= 22;
35
      when 22 => folgezustand <= 23;
36
      when 23 => folgezustand <= 24;
37
      when 24 => folgezustand <= 25;
38
      when others => folgezustand <= 0;
39
    end case;
40
  end process zustandsermittlung;
41
42
  ausgabe: process(zustand, befehl_intern)
43
  begin
44
    sid_out <= befehl_intern(zustand-1);
45
   if (zustand = 0 or zustand = 25) then 
46
     sid_out <= '0';
47
    end if;
48
  end process ausgabe;

folgende Fehlermeldung erscheint, die ich mir nicht erklären kann:

INFO:Xst:1813 - Unable to extract FSM on signal <zustand> : outputs
depend on both state and next state.

Ich weiss was sie heisst, nur sehe ich nicht wo die Ausgabe vom akt.
Zustand und Folgezustand abhängen soll?

Danke schonmal für eure Ratschläge...

Grüße
T.M.

von Dirk (Gast)


Lesenswert?

Hi,

ich bin ein blutiger Anfaenger aber koennte da sowas in der richtung
Fehlen?

  type state_type is (IDLE, LESE, READY,SCHREIBE,COUNT);
  signal next_state, current_state: state_type;

Gruß,

Dirk

von T.M. (Gast)


Lesenswert?

Ich habe das Problem gelöst.
In einem weiterem Prozess, der nicht oben mit steht, hatte ich den
Folgezustand mit abgefragt. Und das hat mir die Synthese übel
genommen.
Naja, habs entfernt, nur richtig ging das trotzdem nicht. Bin grad
dabei das Ganze mit nem Zähler zu lösen, hänge nun aber auch fest...
Naja, mal sehen ob nochwas rauskommt heute...

Grüße
T.M.

von high_speed (Gast)


Lesenswert?

Hallo T.M.

In was für eine Zielhardware soll das Modell implementiert werden.

Für einen CPLD ist eine Zählerstruktur günstig.
Bei einem FPGA sollte man lieber auf eine Schieberegisterstruktur
zurückgreifen, weil dadurch für die Vergleichsoperationen weniger
Logikelemente benötigt werden.

Aber hier erst einmal der Zähler.
1
library ieee ;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
5
entity Controll_Counter is
6
  generic( N_Zustand  : natural := 26 ;
7
           N_Bit      : natural := 5
8
         );
9
  port(    clk_in     :in  std_logic;
10
           cs_intern  :in  std_logic;
11
           Reset      :in  std_logic;
12
           sid_out    :out std_logic_vector((N_Bit - 1) downto 0)
13
      );
14
end Controll_Counter;
15
16
17
architecture Verhalten of Controll_Counter is
18
signal zustand    : std_logic_vector((N_Bit - 1) downto 0);
19
begin
20
21
  aktualisierung: process(clk_in)
22
  begin
23
    if Reset = '0' then 
24
       zustand <= (others => '0');
25
    elsif clk_in'event and clk_in = '0' then
26
      if cs_intern = '0' and zustand <= (N_Zustand - 2) then
27
         zustand <= zustand + 1;
28
      elsif cs_intern = '0' then
29
          zustand <= (others => '0');
30
      end if;
31
    end if;
32
  end process aktualisierung;
33
  
34
  ausgabe: process(zustand) --, befehl_intern)
35
  begin
36
    sid_out <= zustand ; -- befehl_intern(zustand-1);
37
   if (zustand = 0 or zustand = 25) then 
38
     sid_out <= (others => '0');
39
    end if;
40
  end process ausgabe;
41
42
end Verhalten;

MfG
Holger

von T.M. (Gast)


Angehängte Dateien:

Lesenswert?

Danke. Werd den Code mal mit einbeziehen in meine Überlegungen. Das
ganze ist dazu gedacht, ein LCD-Display seriell über CS, SCLK und SID
anzusteuern. Dazu werden 24 bits von befehl_intern bei jeder steigenden
Flanke von SCLK eingelesen, wenn CS_intern 0 ist. Ich möchte es aber so
machen, dass ich von aussen nur kurz CS und den Befehl anlege, deshalb
das speichern in die internen Signale. Und diese sollen halt während
die 24 bits eingelesen werden in dem gespeicherten Zustand bleiben. Der
Befehl von aussen liegt als 8bit Vektor vor, der intern in einen 24bit
Vektor gespeichert wird.

Ja, und das im Anhang hab ich gestern Abend noch hinbekommen, mich
stört nur der kurze Spike bei sclk am Ende, kurz bevor cs_intern auch
wieder auf '1' geht...Hat jemand ne Ahnung an was das liegt,
eigentlich müsste der Zähler doch anstandslos zu 0 zurückkehren...
Im Anhang befinden sich Design, Testbench und nen Bild der Simulation.

Grüße
T.M.

von Positron (Gast)


Lesenswert?

>mich stört nur der kurze Spike bei sclk am Ende, kurz bevor cs_intern
>auch wieder auf '1' geht...Hat jemand ne Ahnung an was das liegt

Du generierst "sclk_intern" kombinatorisch:

    if (cs_intern = '0' and zustand > 0) then
        sclk_intern <= clk;
    else
      sclk_intern <= '1';
    end if;


Wenn der Zähler den Wert 24 hat, und "clk" von '1' auf '0'
wechselt,
ist der Ausdruch oben (cs_intern = '0' and zustand > 0) für einen
Simulationszyklus wahr, und "sclk_intern" wird '0'.
Einen Simulationszyklus später werden dann die Zählerflipflops
upgedatet und der Ausdruck ist wieder falsch.
Deshalb der mimimale Spike.

Wenn Du eine Timingsimulation machst, wirst Du feststellen, daß diese
Minimalspike dann eine reelle Länge hat, bei mir z.B. knappe 1,5 ns.
(ich habe die clk-Frequenz in der Testbench auf vernünftige Werte
erniedrigt, 100 ns anstatt 100 ps)


"sclk" rein kombinatorisch zu generieren, ist keine gute Idee.
Mach noch ein Flip-Flop dahinter.

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.