【问题标题】:Hamming (7,4) Code - Finite State Machine汉明 (7,4) 码 - 有限状态机
【发布时间】:2016-04-12 04:41:39
【问题描述】:

所以我正在为计算机工程课程做一个实验室作业。我有一个作业要交,我正在尽我所能获得帮助,至于教授,我必须等到几天才能与他们交谈以寻求帮助。所以我看看能不能帮到她。

我的问题是我的有限状态机无法按照实验室作业的要求工作。状态机应该有 3 个状态;空闲,s1,s2。空闲应该显示波形中的所有零,状态 1 将显示从 LFSR 随机生成的 4 位数字,状态 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 时,它可以计算汉明数,但在指示时不会改变状态。

  • 当开关 1 设置时:状态 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

有限状态机的波形:

【问题讨论】:

  • 使用给定的代码,您永远无法更改state。 Verilog case 语句不需要像 C/C++ 或 Java 那样的 break;

标签: verilog state-machine hamming-code


【解决方案1】:

我不认为这是您需要的状态机。根据您对要求的描述,也许您只需要记住当前按下的开关?如果是这种情况,您可以按照以下方式进行操作:

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 正在记住当前按下的开关。从您对要求的描述来看,这样做似乎并不取决于在此之前按下哪个开关,因此看起来您不需要 状态机 - 行为不依赖于国家。

(您也不需要所有begins 和ends。如果分支中只有一条语句,则不需要它们。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多