错误:HDL编译器:806第31行:" sumador"附近的语法错误

时间:2015-05-19 19:13:17

标签: verilog

我不知道为什么每次编译我都会收到此错误。拜托我需要你的帮忙。感谢

module operaciones(

    input [3:0] A,
    input [3:0] B,
    input [3:0] numop,
    output reg [3:0] C
    );

  wire bas1,bas2;

  always  @ ( A[3] | A[2] | A[1] | A[0] | B[3] | B[2] | B[1] | B[0] | numop[3] | numop[2] | numop[1] | numop[0] )

    case (numop)
      4'b0000 : sumador_4bits sumador(A,B,bas1,C,bas2);
      4'b0001 : restador_4bits restador(A,B,C);
      4'b0010 : mult_4bits multiplicador(A,B,C);
      4'b0011 : complemento_a_1 comp1(A,C);
      4'b0100 : complemento_a_2 comp2(A,C);
      4'b0101 : AND anda(A,B,C);
      4'b0110 : OR ora(A,B,C);
      4'b0111 : NOT nota(A,C);
      4'b1000 : XOR xora(A,B,C);
    endcase

endmodule

1 个答案:

答案 0 :(得分:1)

您无法在always块内实例化模块。如果要在执行时确定要执行的操作,那么您需要在always块之外实例化所有这些实例,然后确定使用哪一个为case语句分配输出,如下所示:

module operaciones(

    input [3:0] A,
    input [3:0] B,
    input [3:0] numop,
    output reg [3:0] C
    );

  wire bas1,bas2;

  wire [3:0] C0, C1, C2, C3, C4, C5, C6, C7, C8;

  sumador_4bits sumador(A,B,bas1,C0,bas2);
  restador_4bits restador(A,B,C1);
  mult_4bits multiplicador(A,B,C2);
  complemento_a_1 comp1(A,C3);
  complemento_a_2 comp2(A,C4);
  and1 anda(A,B,C5);
  or1 ora(A,B,C6);
  not1 nota(A,C7);
  xor1 xora(A,B,C8);

  always  @ ( C0 or C1 or C2 or C3 or C4 or C5 or C6 or C7 or C8 or numop )
    case (numop)
      4'b0000 : C = C0;
      4'b0001 : C = C1;
      4'b0010 : C = C2;
      4'b0011 : C = C3;
      4'b0100 : C = C4;
      4'b0101 : C = C5;
      4'b0110 : C = C6;
      4'b0111 : C = C7;
      4'b1000 : C = C8;
      default : C = C0;
    endcase
endmodule

我做的其他改变:

  • 敏感度列表应使用or代替|
  • 您不需要列出灵敏度列表中矢量的每一位,只需列出矢量
  • 看起来您正在使用自己的模块用于内置门(和,或......),但您使用的实例名称与基于大小写的这些保留字不同。我更改了实例名称,因此不仅仅是大小写使它们成为合法的名称。
  • 我不知道你是否想要合成这个,但是如果你这样做了,那么由于案例陈述没有完成,这将合成一个锁存器。我添加了一个默认值,这样无论输入是什么都有一个赋值。