使用门原语时出现简单的语法错误?

时间:2014-02-25 23:03:20

标签: verilog

所以我正在尝试为我的第一个Verilog课程DSD II实现一个基本的ALU。 Xilinx不断报告我称之为门基元“和”/“或”的线路上的错误,但我在以前的分配中使用过它们,没有错误。谁能看到我错过的东西?

代码:

module ALU(a,b, opcode, carry, Y, zeroflag);

  input [15:0]a;
  input [15:0]b;
  input [3:0]opcode;
  wire In = {opcode,a,b};
  output reg carry;
  output reg [15:0]Y;
  output reg zeroflag;

  always @(In)
  begin
    case(opcode)

    //Zero Op
    4'b0000 : 
      begin
        Y = 16'h00;
        carry = 0;
        zeroflag = 1;
      end

    //Add
    4'b0001:
      begin
        Ripple_Carry_Adder RCA1(Y,carry,a,b,carry);
      end

    //Subtract
    4'b0010:
      begin
      end

    //Multiply
    4'b0011:
      begin
        Y = a*b;

        if (Y > 65535)
          carry = 1;
        else
          carry = 0;

        if (Y == 0)
          zeroflag = 1;
        else 
          zeroflag = 0;
      end

    //Divide
    4'b0100:
      begin
        Y = a/b;

        if (Y > 65535)
          carry = 1;
        else
          carry = 0;

        if (Y == 0)
          zeroflag = 1;
        else 
        zeroflag = 0;
      end

    //And
    4'b0110:
      begin
        and(Y, a, b);

        if (Y == 0)
          zeroflag = 1;
        else
          zeroflag = 0;
      end

    //Or
    4'b0111:
      begin
        or(Y,a,b);

        if (Y == 0)
          zeroflag = 1;
        else
          zeroflag = 0;
      end

    //Zero Test
    4'b1001:
      if((a || b) == 0)
        begin
          Y = 0;
          zeroflag = 1;
          carry = 0;
        end

    //Greater Than
    4'b1010:
      begin
        if(a > b)
          Y = a;
        else if (b > a)
          Y = b;
        else
          Y = 16'h00;

        if (Y == 0)
          zeroflag = 1;
        else
          zeroflag = 0;
      end

    //Equal
    4'b1011:
      begin
        if (a == b)
          Y = 16'h11;
        else
          Y = 16'h00;

        if (Y == 0)
          zeroflag = 1;
        else
          zeroflag = 0;
      end

    //Less Than
    4'b1100:
      begin
        if(a < b)
          Y = a;
        else if (b < a)
          Y = b;
        else
          Y = 16'h00;

        if (Y == 0)
          zeroflag = 1;
        else
          zeroflag = 0;
      end

    default :
      begin 
        Y = 16'hxx;
        carry = 1'bx;
        zeroflag = 1'bx;
      end
    endcase

  end
endmodule

1 个答案:

答案 0 :(得分:2)

您正在实例化始终块内的基元(以及模块Ripple_Carry_Adder),这是不允许的。

无论何时创建模块或基本实例,都要将其视为放置物理硬件。你无法有条件地创造它 - 它始终存在。

因此,对于像ALU设计这样的东西,您可能希望所有操作(加,子,乘,除等)发生始终,然后根据操作码选择所需的输出