2016-04-12 34 views
0

Also arbeite ich an einer Laboraufgabe für eine Computer Engineering-Klasse. Ich habe eine Aufgabe, und ich versuche, alle Hilfe zu bekommen, die ich bekommen kann, und für den Professor muss ich erst ein paar Tage warten, bevor ich mit ihnen um Hilfe sprechen kann. Ich sehe also, ob ich ihr helfen kann.Hamming (7,4) Code - Endliche Zustandsmaschine

Mein Problem ist, dass mein endlicher Automat nicht funktioniert, wie es sein sollte, wie von der Laboraufgabe gefordert. Die Zustandsmaschine soll 3 Zustände haben; Leerlauf, s1, s2. Leerlauf soll nur Nullen in der Wellenform zeigen, Status 1 wird die zufällig generierte 4-Bit-Nummer aus dem LFSR anzeigen, und Zustand 2 zeigt das Ergebnis der 4-Bit-Nummer, nachdem Hamming (7,4) durchgeführt wurde. Die Uhr wird in einen 1HZ-Takt geändert, wobei clk division verwendet wird.

-Code lautet wie folgt:

CLOCK_1HZ

module clock_1hz (clk, reset, clk2); 
    input clk, reset; 
    output clk2; 

    reg temp; 
    reg [25:0] cnt; 

always @(posedge clk or posedge reset) 
    begin 
     if (reset) 
      begin 
       cnt = {25{1'b0}}; 
      end 
     else 
      begin 
       if (cnt == 26'b10111110101111000001111111) 
        begin 
         cnt = {25{1'b0}}; 
         temp = 1'b1; 
        end 
       else if (cnt < 26'b01011111010111100000111111) 
        begin 
         cnt = cnt + 1; 
         temp = 1'b1; 
        end 
       else 
        begin 
         cnt = cnt + 1; 
         temp = 1'b0; 
        end 
      end 
    end 

    assign clk2 = temp; 

endmodule 

LFSR

module lfsr (out, clk, rst); 

    output [4:1] out; 
    input clk, rst; 

    reg [4:1] w; 

always @(posedge clk or posedge rst) 

    begin 

    if (rst) 
     begin 
      w = 4'b1011; 
     end 

    else 
     w = {w[3],w[2],w[1]^w[4], w[4]}; 
    end 

assign out=w; 

endmodule 

Hamming

module hamming(din, dout); 
    output [6:0] dout; 
    input [3:0] din; 

    assign dout[6] = din[3]; 
    assign dout[5] = din[2]; 
    assign dout[4] = din[1]; 
    assign dout[3] = din[1]^din[2]^din[3]; 
    assign dout[2] = din[0];  
    assign dout[1] = din[0]^din[2]^din[3]; 
    assign dout[0] = din[0]^din[1]^din[3]; 

endmodule 

All dieser Code funktioniert ordnungsgemäß und berechnet das richtige HAMMING und die Taktteilung funktioniert gut mit dem LFSR und funktioniert, wenn es als Hierarchieentwurf kombiniert wird.

Wenn ich die FSM für diesen Code mache, arbeitet es bis zur Berechnung der Hamming-Nummer, ändert aber nicht den Zustand, wenn angegeben.

  • Wenn Schalter 1 eingestellt: Zustand IDLE
  • Wenn Schalter 2 Set: Status 1, zeigt 4-Bit-LFSR Nummer
  • Wenn Schalter 2 Set: State 2, zeigt 7-Bit Hamming-Ergebnis

Nachstehend ist mein Code für die Finite State Machine und dass im Anschluss an die Wellenform-Ausgabe.

module fsm (clk , reset , sw1 , sw2 , sw3 , lights); 

    input clk, reset, sw1, sw2, sw3; 
    output reg [6:0] lights; 

    reg[2:0] state; 

    wire clkhz; 
    wire [3:0] lfsr_out; 
    wire [6:0] hout; 

    parameter S0 = 3'b000, S1 =3'b001, S2 = 3'b010; // states 

    clock_1hz u1(.clk(clk), 
        .reset(reset), 
        .clk2(clkhz)); 
    lfsr u2(.rst(reset), 
       .clk(clkhz), 
       .out(lfsr_out)); 
    hamming u3(.din(lfsr_out), 
        .dout(hout)); 

always @(posedge clk or posedge reset) 
    begin 
     if (reset == 1) 
      begin 
       state <= S0; 
      end 
     else 
      case(state) 
       S0: if(sw1 == 1) 
         begin 
          state <= S0; 
         end 
       S1: if(sw2 == 1) 
         begin 
          state <= S1; 
         end 
       S2: if(sw3 == 1) 
         begin 
          state <= S2; 
         end 
       default state <= S0; 
    endcase 
end 

always @(*) 
    begin 
     case(state) 
       S0: lights = 7'b0000000; //led are all off 
       S1: lights = lfsr_out; //4bit lfsr shown on led 
       S2: lights = hout; // display hamming code result 
       default lights = 7'b0000000; //led are all off 
     endcase 
    end 
endmodule 

Signalform endlicher Automat:

Snapshot

+0

mit dem Code, können Sie nie 'ändern Staat ". Eine Verilog-Case-Anweisung erfordert nicht "break;" wie C/C++ oder Java. – Greg

Antwort

0

Ich glaube nicht, es ist ein Zustandsmaschine ist, die Sie hier benötigen. Aus Ihrer Beschreibung der Anforderungen, vielleicht müssen Sie nur den aktuellen Schalter gedrückt halten? Wenn das der Fall ist, könnten Sie etwas entlang der Linien von tun:

always @(posedge clk or posedge reset) 
    if (reset == 1) 
    state <= S0; 
    else 
    if (sw1) 
     state <= S0; 
    else if (sw2) 
     state <= S1; 
    else if (sw3) 
     state <= S2; 

Jetzt wird state die Stromschalter gedrückt zu erinnern. Aus Ihrer Beschreibung der Anforderungen scheint dies nicht davon abhängig zu sein, welcher Schalter welcher Schalter zuvor gedrückt wurde und so sieht es nicht so aus, als ob Sie einen Zustandsautomaten benötigen - das Verhalten hängt nicht vom Zustand ab.

(Sie brauchen nicht all diese begin s und end s, auch nicht. Sie brauchen sie nicht, wenn es nur eine Aussage in der Branche ist.)

+0

Das hat mir geholfen und es funktioniert jetzt wie ein Zauber. Vielen Dank – punjabi4life