0

そのため、コンピューター エンジニアリング クラスのラボ課題に取り組んでいます。期限のある課題があり、できる限りの助けを得ようとしていますが、教授については、彼らと話すことができるようになるまで数日待たなければなりません. だから私は彼女を助けることができるかどうかを見ています.

私の問題は、ラボの割り当てから求められたように、有限状態マシンが機能していないことです。ステート マシンには 3 つの状態があると想定されています。アイドル、s1、s2。Idle は波形のすべてのゼロを示し、State 1 は LFSR からランダムに生成された 4 ビット数を示し、State 2 はハミング (7,4) が行われた後の 4 ビット数からの結果を示します。クロックは 1HZ クロックに変更され、clk 分周が使用されます。

コードは次のとおりです。

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 

ハミング

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

このコードはすべて適切に機能し、正しいハミングを計算し、クロック分周は LFSR とうまく機能し、階層設計として組み合わせると機能します。

このコードの FSM を作成すると、ハミング数を計算するまで機能しますが、指示されたときに状態を変更しません。

  • Switch 1 設定時:State IDLE
  • スイッチ 2 が設定されている場合: 状態 1、4 ビットの LFSR 番号を表示
  • スイッチ 2 が設定されている場合: 状態 2、7 ビットのハミング結果を表示

以下は、有限状態マシンのコードであり、それに続くのは波形出力です。

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

有限ステートマシンの波形:

スナップショット

4

1 に答える 1

0

ここで必要なのはステートマシンではないと思います。要件の説明から、おそらく現在押されているスイッチを覚えておく必要がありますか? その場合は、次の行に沿って何かを行うことができます。

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;

現在state押されているスイッチを記憶しています。要件の説明から、これを行うことは、その前にどのスイッチが押されたかに依存していないように見えるため、状態マシンが必要なようには見えません-動作は状態に依存しません。

(これらすべてbeginの およびendも必要ありません。ブランチにステートメントが 1 つしかない場合は必要ありません。)

于 2016-04-12T09:00:16.223 に答える