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!
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 WAIT
hier)
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 u
für den gesamten RED2
Zustand. 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.
MarkU
Justin