Verilog FSM 和模块实例化

Verilog FSM and module instantiation

此有限状态机将充当数据路径的控制器,该数据路径包含计算两个 4 位数字的 GCD 所需的运算符。我对这种语言相当陌生,我知道问题可能是缺少分号或者我的声明可能有问题,但我无法弄清楚问题是什么。我不断收到错误消息:

ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 44 行:"if" 附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 60 行:“=”附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 64 行:“=”附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 68 行:“;”附近的语法错误。

我也愿意接受有关一般逻辑的任何提示,FSM 的代码如下所示:

module GCD_FSM(clk,data_in,reset,data_out,x_in,y_in,gcd_out,xgty,xlty,xequaly,go_in,xnew,ynew);

    input   clk, data_in, reset,go_in;
    input reg[3:0] x_in,y_in,gcd_out;
    output reg [1:0] data_out;
    reg [3:0] x,y;
    output reg[3:0] xnew,ynew;
    output reg xgty,xlty,xequaly,cleango;

    // Declare state register
    reg [1:0]state;

    // Declare states
    parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 =4;

    /* Output depends only on the state
    always @ (state) begin
        case (state)
            S0:
                data_out = 2'b01;
            S1:
                data_out = 2'b10;
            S2:
                data_out = 2'b11;
            S3:
                data_out = 2'b00;
            default:
                data_out = 2'b00;
        endcase
    end
    */


    // Determine the next state
    always @ (posedge clk or posedge reset) begin
        if (reset)
            state <= S0;
        else
            case (state)
                S0:
                    debounce start(.clock(clk),.noisy(go_in),.clean(cleango));
                    if (cleango)
                        state <= S1;
                    else
                        state <= S0;
                S1:
                    state <= S2;
                S2:

                    if (xlty)
                        state <= S3;
                    else if(xgty)
                        state <= S4;
                    else if(xequaly)
                        state <= S5;
                S3:
                    ripple_carry_adder_subtractor ysubx(.S(ynew),.C(carry),.V(overflow),.A(y),.B(x),.Op(1));
                    y = ynew;
                    state <= S2;
                S4:
                    ripple_carry_adder_subtractor xsuby(.S(xnew),.C(carry),.V(overflow),.A(x),.B(y),.Op(1));
                    x = xnew;
                    state <= S2;
                S5:
                    gcd_out = x;
                    state <= S0;

            endcase
    end

endmodule

我注意到的一些错误:

  • 第 3 行,您在末尾缺少 ;output reg[3:0] gcd_out
  • 未定义变量 go_incleango
  • 模块去抖未定义