Entwerfen eines Kombinationsschlosses FSM: Konvertieren des Zustandsdiagramms in Logikgatter

Ich versuche, ein Synchronkombinationsschloss für meine digitale Logikklasse zu entwerfen. Ich habe das Zustandsdiagramm, da ich verstehe, wie ich die Logik darstelle, der ich folgen möchte. Ich kämpfe jedoch damit, diese ganze Abfolge von Schritten in digitale Logik umzuwandeln. Ich verstehe, wie man eine Zustandstabelle für jeden der Zustände und ihre nächsten Zustände erstellt. Aber wie viele Zustandstabellen brauche ich? Wie gebe ich nach dem Erstellen dieser Tabellen "U" aus? Dieses Zeug ist mir irgendwie fremd und es fällt mir schwer, mich damit zu beschäftigen.

Einige Erläuterungen zu diesem Diagramm. Ich möchte, dass der Eingang "a" immer aktiviert wird, wenn eine farbige Taste gedrückt wird (Rot, Grün oder Blau). Ich habe mich entschieden, jeden Eingabeausdruck als "arg'b'" zu adressieren, wo ich ihn einfach zu "ar" hätte vereinfachen können, um einen roten Knopfdruck zu berücksichtigen, weil ich sicherstellen wollte, dass Sie nicht einfach alle Knöpfe drücken und sein können in der Lage, die Sequenz brutal zu erzwingen. Die Sequenz, die ich programmieren möchte, ist das Drücken der Tasten [START][R][G][B][R] in dieser Reihenfolge.

Jede Hilfe, Tipps, Videolinks sind sehr willkommen. Danke schön!Geben Sie hier die Bildbeschreibung ein

Der erste Schritt besteht darin, jedem Zustand einen numerischen Wert zuzuweisen. ZB „Start“ ist 000, „rote 1“ ist 001, „blaue 1“ ist 010 usw. Schreiben Sie dann bitweise die logische Gleichung für den nächsten Zustand.

Antworten (2)

Sie können dies entweder auf traditionelle Weise mit Stift, Tinte, Zustandstabellen, dem TTL-Datenbuch tun oder es einfach direkt in VHDL oder Verilog schreiben, indem Sie dem nachstehenden Teilbeispiel folgen.

Welche Vorgehensweise die beste ist, hängt von den Umständen ab.

Wenn das Hausaufgaben sind, musst du wahrscheinlich Ersteres machen.

Wenn Sie dafür bezahlt werden, Dinge zu erledigen, und letzteres nicht tun, suchen Sie sich einen neuen Job.

   type State   : State_Type is (Start, Red_1, ..., Wait);
   signal State : State_Type;
   signal argb  : std_logic_vector(3 downto 0);

   argb <= a & r & g & b; -- simplify condition testing...

   Process(Clk) is
   begin 
      case State is
      when Start =>
         if argb = "1100" then
            State <= Red_1;
            u     <= '0';
         elsif a = '1' then
            State <= Wait;
            u     <= '0';
         end if;
      when -- and so on for all the other states 
      end case;
   end process;

Ich gebe eine Verilog-Version als Referenz.

Schritt 1: Weisen Sie jedem Zustand, der derzeit in menschlicher Sprache benannt ist, einen anderen Binärwert zu.

parameter WAIT  = 3'h0;
parameter START = 3'h1;
...

Schritt 2: Die DFF-Entität, die den aktuellen Zustand hält. (Ich nehme an, der Standardzustand ist WAIThier)

reg [2:0] st, st_nxt;
always@(posedge clk or negedge rstn)begin
  if(~rstn)begin
    st <= WAIT;
  end else begin
    st <= st_nxt;
  end
end

Schritt 3: Solange alle Zustandsübergangszweige abgeschlossen sind (alle möglichen Zweige und ihre Prioritäten definiert sind), können Sie nun den nächsten Zustand erzeugen.

Zustand betrachten START:

current state  |        input      |  next state
    START ------ a & (r & ~g & ~b) ---> RED1
            +--- a & ~(r & ~g & ~b) --> WAIT
            +-------- (others) -------> (stay in START)

Wir codieren wie folgt:

always@(*)begin
  case(st)
    START:begin
      if(a & (r & ~g & ~b))begin
        st_nxt = RED1;
      end else if(a & ~(r & ~g & ~b))begin
        st_nxt = WAIT;
      end else begin
        st_nxt = st;
      end
    end
    (code for other states)
    default: st_nxt = WAIT;
  endcase
end

Schritt 3: Generieren Sie Signale, die von der Zustandsmaschine gesteuert werden.

Hier behaupte ich einfach ufür den gesamten RED2Zustand. Sie können Ihre eigene generieren, wenn eine sequentielle Ausgabe erforderlich ist oder andere Anforderungen bestehen.

assign u = (st == RED2);

Schließlich müssen Sie in der realen Welt möglicherweise auch eine Auszeit in Betracht ziehen.