2016-05-03 17 views
-1

Also versuche ich meine erste FSM zu implementieren, und ich bin sehr verwirrt.Umgang mit vielen Ausgaben in einem endlichen Automaten verilog

Die Codes ein bisschen zu lang, so lassen Sie mich zusammenfassen: ich mit deklarieren Ein- und Ausgänge Dann Zustand Erklärungen (Ich habe fünf plus drei Platzhalter) Dann Aktueller Stand Zuordnung, beginnen die

sequentiell ist
always @(posedge clk) 
begin 
    if (rst == 1'b1) 
     Current_State <= MainGreen; 
    else 
     Current_State <= Next_state; 
end 

Und dann ... Ich verliere mich. Ich hatte ursprünglich nur eine große ol 'sequentielle Schaltung, die next_state und Ausgänge zugewiesen, aber das war chaotisch/wahrscheinlich hatte viele Fehler.

Was ich jetzt einfach haben muss next_state Logik, aber nichts mit Ausgängen zu tun:

always @* 
begin 
    Next_state = Current_State; 
    case (Current_State) 

     MainGreen: 
     begin 
      if (count && expired) 
      begin 
       Next_state = MainYel; 
      end 
     end 

     MainYel: 
     begin 
      if (WR && expired) 
       Next_state = AllRed; 
      else if (expired) 
       Next_state = SideGreen; 
     end 

     AllRed: 
     begin 
      if (expired) 
       Next_state = SideGreen; 
     end 

     SideGreen: 
     begin 
      if(sensor && expired) 
       Next_state = SideYel; 
     end 

     SideYel: 
     begin 
      if(expired) 
       Next_state = MainGreen; 
     end 
    endcase 
    end 

Ich habe etwa acht Ausgänge auf der Basis modern allein und vier auf der Basis modern und Eingang. Wie sollte ich sie zuordnen?

+0

Sie sehen aus, als ob Sie auf dem richtigen Weg sind. Warum nicht 'output foo; ... assign foo = (Current_State == AllRed); '? – toolic

+0

Sie könnten sie auch in Ihre Fallaussage aufnehmen; Sie haben bereits die Logik für 'Current_State == AllRed' über den Fall für' AllRed' – Unn

Antwort

0

Sie sind 90% des Weg dorthin. Es gibt zwei Möglichkeiten, um fortzufahren (wahrscheinlich wahrscheinlich mehr als das, aber ich gebe dir, was ich denke, sind zwei der besten Optionen):

Zuerst haben Sie eine Menge Ausgänge, die nur für eine kleine geltend gemacht werden Minderheit der Staaten? Wenn ja, würde ich so etwas in Ihrem kombi empfehlen immer blockieren:

always @* 
begin 
    // default output values 
    output1 = 1'b0; 
    output2 = 1'b0; 
    output3 = 1'b0; 
    .... 
    case (Current_State) 
    STATE1: 
    begin 
     output2 = 1'b1; 
     // calculate next state 
     ... 
    end 

    STATE2: 
    begin 
     output4 = 1'b1; 
     // calculate next state 
     ... 
    end 
    ... 
    endcase 
end 

Dies ist wahrscheinlich die effizienteste Art und Weise Ihre Zustandsmaschine zu codieren, da Sie nicht jede Ausgabe in jedem Staat definieren müssen. Wenn Sie nun jeden Ausgang in vielen verschiedenen Zuständen aktiv haben, ist es möglicherweise einfacher, diese Ausgänge in jedem Zustand in Ihrer Fallanweisung zu definieren.

Ein letzter Weg, den ich nicht empfehlen würde, ist, die SM-Ausgaben in separaten Assign-Anweisungen abzuleiten. Es wird genauso gut funktionieren, aber ich denke, dass das Beibehalten der Ausgaben zusammen mit der nächsten Zustandslogik viel einfacher für die Codepflege und eine gute Gewohnheit ist, sich zu entwickeln. Es ist eine Sache, schnell Code für eine Aufgabe zu hacken, eine andere, um Code für ein echtes Produkt zu entwickeln, das während der Lebensdauer eines Produkts mehrmals aktualisiert wird, und Wartbarkeit ist unerlässlich (etwas, das ich am Arbeitsplatz lernen musste, weil niemand hat es in der Universität gelehrt).