mikrocontroller.net

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


Autor: Dirk (Gast)
Datum:

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

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Controller is
    Port ( MCLK : in STD_LOGIC;                    --Master Clock Input
        Din : in  STD_LOGIC_VECTOR (7 downto 0);      --Data from SPI
           Dout : out  STD_LOGIC_VECTOR (7 downto 0);      --Data to SPI
           SlaveSel : in  STD_LOGIC;                --SPI Slave Selected (1: is selected)
           DRDY : in  STD_LOGIC;                    --New Data from SPI Slave Controller
           DRDY_CLR : out  STD_LOGIC;                --Clear the new Data indicator of SPI Slave
           MatrixOut : out  STD_LOGIC_VECTOR (63 downto 0);  --Desired Output of the LED-Matrix
           KeyChange : in  STD_LOGIC_VECTOR (7 downto 0);  --Which Key of Key-Matrix has Changed?
           SSG1 : out  STD_LOGIC_VECTOR (7 downto 0);      --Output Val for 1st 7-Segment Display (7th Bit->LED)
           SSG2 : out  STD_LOGIC_VECTOR (7 downto 0));    --Output Val for 2nd 7-Segment Display (7th Bit->LED)
end Controller;

architecture Behavioral of Controller is
  type state_t is (  Idle, 
              SPIDecode,
              SPIWaitForData, 
              LEDMtrStR0, 
              LEDMtrStR1, 
              LEDMtrStR2, 
              LEDMtrStR3, 
              LEDMtrStR4, 
              LEDMtrStR5, 
              LEDMtrStR6, 
              LEDMtrStR7, 
              WaitForRst);
  signal state, SANS : state_t := idle;              --SANS: State after next State

  begin

     Ctrl_FSM: process(MCLK, SlaveSel)
    begin
    
    if (SlaveSel='0') then
         state <= Idle;
      
      elsif rising_edge(MCLK) then
       case state is
         when Idle =>     if DRDY='1' then 
                    state <= SPIDecode;
                    DRDY_CLR <= '1';
                  end if;
                      
         when SPIDecode => 
                  DRDY_CLR <= '0';
                  if Din="10000000" then
                    SANS <= LEDMtrStR0;
                    state <= SPIWaitForData;
                 
                    elsif Din="10000001" then
                    SANS <= LEDMtrStR1;
                    state <= SPIWaitForData;
                    
                  else
                    state <= WaitForRst;  --if SPI-OpCode is unknown wait until SlaveSel toggle
                  end if;
        
       when SPIWaitForData => 
                  if DRDY='1' then 
                    
                    DRDY_CLR <= '1';
                    state <= SANS;
                  end if;
                  
         when LEDMtrStR0 =>
                  DRDY_CLR <= '0';
                  MatrixOut(7 downto 0) <= Din;
                  state <= Idle;
                  
      when LEDMtrStR1 =>
                  DRDY_CLR <= '0';
                  MatrixOut(15 downto 8) <= Din;
                  state <= Idle;

                  
      when WaitForRst =>
                  state <= WaitForRst; --waits until state is set to idle from SlaveSel='0'
      
       end case;
      end if;
   end process Ctrl_FSM;

  end Behavioral;


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

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

Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

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

Autor: Dirk (Gast)
Datum:

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

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

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

Autor: Dirk (Gast)
Datum:

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

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

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

Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
                    if SANS=LEDMtrStR0 then
                      state <= LEDMtrStR0;
                    elsif SANS=LEDMtrStR1 then
                      state <= LEDMtrStR1;
                    else 
                      state <= WaitForRst;
                    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)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erkennt den der Synthesereport eine FSM?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if SANS=LEDMtrStR0 then
                      state<=LEDMtrStR0;
                    elsif SANS=LEDMtrStR1 then
                      state<=LEDMtrStR1;
                    elsif SANS=LEDMtrStR2 then
                      state<=LEDMtrStR2;
                    elsif SANS=LEDMtrStR3 then
                      state<=LEDMtrStR3;
                    else
                      state<=WaitForRst;
                    end if;
Aber das kann doch auch irgendwie nicht Sinnd er Sache sein?!

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

Bewertung
0 lesenswert
nicht lesenswert
Vergiss mal diesen SANS. Es geht auch nur mit 1 Zustandsmerker:
         when Idle =>     
                  if DRDY='1' then 
                    state <= SPIDecode;
                    DRDY_CLR <= '1';
                  end if;

         when SPIDecode => 
                  DRDY_CLR <= '0';
                  if DRDY='1' then     -- hier: warten bis fertig...
                    DRDY_CLR <= '1';
                    if    Din="10000000" then
                        state <= LEDMtrStR0;
                    elsif Din="10000001" then
                        state <= LEDMtrStR1;
                    :
                    else
                      state <= WaitForRst;  -- das hier nochmal ansehen...
                    end if;
                  end if;                    

         when LEDMtrStR0 =>
                  DRDY_CLR <= '0';
         :
         :       
Ob das jetzt schon richtig implementiert ist, steht in den Sternen. Mir 
geht es um die Idee, dieses leidige SANS loszuwerden...

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

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

Autor: Dirk (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

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.