Forum: FPGA, VHDL & Co. ISE erkennt FSM nicht


von Dirk (Gast)


Lesenswert?

Hallo,

ich versuche gerade eine FSM zu erstellen, sie bekommt Daten über ein 
SPI interface und je nachdem welches Kommando kam wir dann halt was 
gemacht.

Im RTL wird allerdings nirgends eine FSM angezeigt. :(

Programmiert wird in Xilinx ISE 11.1

(Gekürzte Version):
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity Controller is
12
    Port ( MCLK : in STD_LOGIC;                    --Master Clock Input
13
        Din : in  STD_LOGIC_VECTOR (7 downto 0);      --Data from SPI
14
           Dout : out  STD_LOGIC_VECTOR (7 downto 0);      --Data to SPI
15
           SlaveSel : in  STD_LOGIC;                --SPI Slave Selected (1: is selected)
16
           DRDY : in  STD_LOGIC;                    --New Data from SPI Slave Controller
17
           DRDY_CLR : out  STD_LOGIC;                --Clear the new Data indicator of SPI Slave
18
           MatrixOut : out  STD_LOGIC_VECTOR (63 downto 0);  --Desired Output of the LED-Matrix
19
           KeyChange : in  STD_LOGIC_VECTOR (7 downto 0);  --Which Key of Key-Matrix has Changed?
20
           SSG1 : out  STD_LOGIC_VECTOR (7 downto 0);      --Output Val for 1st 7-Segment Display (7th Bit->LED)
21
           SSG2 : out  STD_LOGIC_VECTOR (7 downto 0));    --Output Val for 2nd 7-Segment Display (7th Bit->LED)
22
end Controller;
23
24
architecture Behavioral of Controller is
25
  type state_t is (  Idle, 
26
              SPIDecode,
27
              SPIWaitForData, 
28
              LEDMtrStR0, 
29
              LEDMtrStR1, 
30
              LEDMtrStR2, 
31
              LEDMtrStR3, 
32
              LEDMtrStR4, 
33
              LEDMtrStR5, 
34
              LEDMtrStR6, 
35
              LEDMtrStR7, 
36
              WaitForRst);
37
  signal state, SANS : state_t := idle;              --SANS: State after next State
38
39
  begin
40
41
     Ctrl_FSM: process(MCLK, SlaveSel)
42
    begin
43
    
44
    if (SlaveSel='0') then
45
         state <= Idle;
46
      
47
      elsif rising_edge(MCLK) then
48
       case state is
49
         when Idle =>     if DRDY='1' then 
50
                    state <= SPIDecode;
51
                    DRDY_CLR <= '1';
52
                  end if;
53
                      
54
         when SPIDecode => 
55
                  DRDY_CLR <= '0';
56
                  if Din="10000000" then
57
                    SANS <= LEDMtrStR0;
58
                    state <= SPIWaitForData;
59
                 
60
                    elsif Din="10000001" then
61
                    SANS <= LEDMtrStR1;
62
                    state <= SPIWaitForData;
63
                    
64
                  else
65
                    state <= WaitForRst;  --if SPI-OpCode is unknown wait until SlaveSel toggle
66
                  end if;
67
        
68
       when SPIWaitForData => 
69
                  if DRDY='1' then 
70
                    
71
                    DRDY_CLR <= '1';
72
                    state <= SANS;
73
                  end if;
74
                  
75
         when LEDMtrStR0 =>
76
                  DRDY_CLR <= '0';
77
                  MatrixOut(7 downto 0) <= Din;
78
                  state <= Idle;
79
                  
80
      when LEDMtrStR1 =>
81
                  DRDY_CLR <= '0';
82
                  MatrixOut(15 downto 8) <= Din;
83
                  state <= Idle;
84
85
                  
86
      when WaitForRst =>
87
                  state <= WaitForRst; --waits until state is set to idle from SlaveSel='0'
88
      
89
       end case;
90
      end if;
91
   end process Ctrl_FSM;
92
93
  end Behavioral;

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


Lesenswert?

> Im RTL wird allerdings nirgends eine FSM angezeigt. :(
Was denn? Ein paar Flipflops und Kombinatorik?

Das würde ich erwarten, den eine "FSM" als Bauteil gibt es nicht. Eine 
FSM besteht aus FFs (als Speicherglieder) und Kombinatorik (zum 
Weiterschalten).

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Lothar,

das es eine FSM als Bauteil nicht gibt weiß ich auch, allerdings hatte 
ich erwartet das ein Block auftaucht wo FSM drunter steht - bei deinen 
Beispielen passiert das nämlich immer ;)

Deine Seite ist übrigens Klasse!!

Grüße
Dirk

von Dirk (Gast)


Lesenswert?

Ich habe gerade noch mal rumgebastelt..

Meinen Code mit der FSM instanziere ich in einem Top File - da finde ich 
den oben erwähnten "FSM Block" nicht im RTL wieder.

Nehme ich mir allerdings ein neues Projekt in dem es als einzigstes File 
den obigen Code gibt macht er mir auch einen Block wie ich es erwarte 
(s. Bild)

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


Lesenswert?

Such mal in den Synthese-Properties einen Schalter mit Namen "Keep 
Hierarchiy" und mach ein Häckchen dran.

von Dirk (Gast)


Lesenswert?

Also erstens stimmt das RTL nicht immer ist wohl ein bekannter Bug.. 
muss mal ISE updaten..

Im Moment scheint es so als ob er das

state <= SANS

im SPIWaitForData nicht mag? Kann das sein?

Das mit dem Keep Hierarchiy hat nichts geändert..

Danke für deine Hilfe by the way :)

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


Lesenswert?

> Im Moment scheint es so als ob er das
> state <= SANS
> nicht mag
Wie kommst du darauf?

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

>> Im Moment scheint es so als ob er das
>> state <= SANS
>> nicht mag
>Wie kommst du darauf?

Wenn ich das state<=SANS auskommentiere und stattdessen testweise sowas 
reinschreibe
1
                    if SANS=LEDMtrStR0 then
2
                      state <= LEDMtrStR0;
3
                    elsif SANS=LEDMtrStR1 then
4
                      state <= LEDMtrStR1;
5
                    else 
6
                      state <= WaitForRst;
7
                    end if;

ist ein FSM Block da, schreibe ich state <=SANS - ist die FSM weg (s. 
Bilder).

Er scheint das auch tatsächlich nicht als FSM zu interpretieren. One-Hot 
oder Compact hat keine Änderung der FF zur Folge. (wird das state<=sans 
weggelassen und die FSM erkannt gibt es eine Änderung in der Anzahl der 
FF)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Erkennt den der Synthesereport eine FSM?

von Dirk (Gast)


Lesenswert?

wenn ich state<=SANS drin habe wird keine FSM detektiert (auch nicht im 
Synth Report). Wenn ich state<=SANS rausnehme wird die FSM gefunden.

Da scheint er sich die ZÄhne dran auszubeißen..

Wie kann ich das denn anders realisieren?
Ich muss halt sehr oft auf das Rdy Signal warten. Immer dafür ein 
eigener State scheint mir unsinning.
Mit folgendem Code funktioniert es
1
if SANS=LEDMtrStR0 then
2
                      state<=LEDMtrStR0;
3
                    elsif SANS=LEDMtrStR1 then
4
                      state<=LEDMtrStR1;
5
                    elsif SANS=LEDMtrStR2 then
6
                      state<=LEDMtrStR2;
7
                    elsif SANS=LEDMtrStR3 then
8
                      state<=LEDMtrStR3;
9
                    else
10
                      state<=WaitForRst;
11
                    end if;
Aber das kann doch auch irgendwie nicht Sinnd er Sache sein?!

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


Lesenswert?

Vergiss mal diesen SANS. Es geht auch nur mit 1 Zustandsmerker:
1
         when Idle =>     
2
                  if DRDY='1' then 
3
                    state <= SPIDecode;
4
                    DRDY_CLR <= '1';
5
                  end if;
6
7
         when SPIDecode => 
8
                  DRDY_CLR <= '0';
9
                  if DRDY='1' then     -- hier: warten bis fertig...
10
                    DRDY_CLR <= '1';
11
                    if    Din="10000000" then
12
                        state <= LEDMtrStR0;
13
                    elsif Din="10000001" then
14
                        state <= LEDMtrStR1;
15
                    :
16
                    else
17
                      state <= WaitForRst;  -- das hier nochmal ansehen...
18
                    end if;
19
                  end if;                    
20
21
         when LEDMtrStR0 =>
22
                  DRDY_CLR <= '0';
23
         :
24
         :
Ob das jetzt schon richtig implementiert ist, steht in den Sternen. Mir 
geht es um die Idee, dieses leidige SANS loszuwerden...

von Fpgakuechle K. (Gast)


Lesenswert?

Hm, es werden nicht alle Zustände von state im case behandelt ...

von Dirk (Gast)


Lesenswert?

>Hm, es werden nicht alle Zustände von state im case behandelt ...

Doch werden sie, ich hab sie nur der Übersichtlichkeit halber oben 
rausgenommen.


>Vergiss mal diesen SANS. Es geht auch nur mit 1 Zustandsmerker

Ich werde meine FSM mal so umbauen das es mit nur einem Zustansmerker 
funktioniert. Allerdings nicht mehr heute ;)

Ich fand die Idee halt toll einen Zustand für mehrere verschiedene 
Sachen benutzen zu können. (Also das man einen Zustand von mehreren 
Punkten aus aufruft aber nach diesem Zustand abhängig vom vorherigen 
Zustand weiterspringt) Aber das scheint wohl doch nicht so günstig zu 
sein..

Ich danke euch auf jeden Fall für die Hilfe!

Viele Grüße
Dirk

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Dirk schrieb:
> Ich fand die Idee halt toll einen Zustand für mehrere verschiedene
> Sachen benutzen zu können. (Also das man einen Zustand von mehreren
> Punkten aus aufruft aber nach diesem Zustand abhängig vom vorherigen
> Zustand weiterspringt) Aber das scheint wohl doch nicht so günstig zu
> sein..

Habe ich bei meinem LCD Controller auch so gemacht, ich mein da hatte er 
aber ne FSM erkannt... hm....

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.