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