error de sintaxis cerca del módulo o módulo no declarado?

0

Estoy tratando de escribir un módulo principal y otro como secundario (llamado "sumador"). Sin embargo, seguí recibiendo errores diciéndome que hay errores de sintaxis con el "sumador". Por favor ayúdame con mi código:

Aquí está la implementación del módulo:

module adder(
output reg [3:0] S_out,
input [3:0] S_in,
input [3:0] coin
);
initial begin 
assign S_out = S_in + coin;end
endmodule

y aquí está el módulo principal:

module Assign2(
input Nickel,
input Dime,
input Quarter,
input Start,

output reg Release_Paper,
output reg Return_Coins
);
'include "adder.v"//this line is removed 

wire CLK;
CLoK C1(CLK);
reg [3:0]S_in;
reg [3:0]S_out;
reg [3:0]coin;

wire [2:0]i;
assign i = {Quarter, Dime, Nickel};

wire reset;
parameter S0 = 4'b0000;
parameter S1 = 4'b0001;
parameter S2 = 4'b0010;
parameter S3 = 4'b0011;
parameter S4 = 4'b0100;
parameter S5 = 4'b0101;
parameter S6 = 4'b0110;
parameter S7 = 4'b0111;
parameter S8 = 4'b1000;
parameter S9 = 4'b1001;
assign reset = Start;

always @(posedge CLK) begin 
if (reset == 1) begin
    S_in = S0;
    S_out = S0;
end
case(i)
    3'b001: coin <= S1; 
    3'b010: coin <= S2;
    3'b100: coin <= S5;
endcase
#100;
adder jjjjj(.S_out(S_out), .coin(coin), .S_in(S_in));//here is the error
if (S_out == 4'b1010) Release_Paper <= 1'b1;

else if (S_out > 4'b1010) Return_Coins <= 1'b1;
end 

endmodule

EDITAR: He eliminado la inclusión y aquí está el mensaje de error: [HDL 9-806] Error de sintaxis cerca de "addr". [".... Assign2HDL / Assign2.v": 66]

La plataforma es Xilinx Vivado 2017.1, y también probé Xilinx ISE 13.4, que extrañamente tiene algún problema con mi reloj:

Línea 28: condición de bucle no constante no se admite para siempre

y aquí está el reloj:

module CLoK(
output reg CLK
);

initial begin
   CLK = 1'b0;

   forever
      #2 CLK = ~CLK;
end

endmodule
    
pregunta Junye Li

1 respuesta

4

Hay varios problemas importantes que puedo ver:

  1. Tienes una instrucción #include "adder.v" aleatoria y completamente innecesaria. (Aunque veo que dices que lo has eliminado, pero entonces ¿por qué sigue en tu pregunta)?

  2. Su módulo sumador no está escrito correctamente. Ha colocado una instrucción assign dentro de un bloque initial que no es una sintaxis legal. Además, no desea que se haga en un bloque inicial, ya que de lo contrario intentaría inferir una lógica de tipo ROM ("agregue estos dos números solo en el encendido") utilizando expresiones no constantes que no es posible hacer por síntesis. Deshazte de la declaración initial .

    module adder(
        output reg [3:0] S_out,
        input      [3:0] S_in,
        input      [3:0] coin
    );
        assign S_out = S_in + coin;
    endmodule
    
  3. Usted no puede inferir una instancia de un módulo en un bloque always .

    always @(posedge CLK) begin 
        ...
        adder jjjjj(.S_out(S_out), .coin(coin), .S_in(S_in));//here is the error -> of course!!
        ...
    end 
    

    Recuerda que no estás escribiendo un programa. Verilog es un HDL, estás describiendo hardware . Básicamente, lo que está describiendo aquí "siempre en el borde positivo de CLK, agregue repentinamente un poco de hardware adicional, luego bórrelo nuevamente". Eso no tiene sentido como construcción y es una sintaxis ilegal.

    En su lugar, debe inferir que los módulos fuera siempre bloquean. Todo el hardware debe existir en la síntesis, no se puede crear dinámicamente desde ninguna parte.

  4. De hecho, todo el bloque siempre es un completo disparate. Está mezclando asignaciones de bloqueo y no bloqueantes, está agregando retrasos de tiempo que no son sintetizables (solo simulación), está intentando crear una instancia de los módulos como en (3), las declaraciones de inicio y finalización están por todas partes, etc. / p>

    Recomendaría encarecidamente adoptar el estilo de siempre con las declaraciones begin y end , y poner cada una en su propia línea, lo que hará que sea mucho más fácil para usted y para cualquier otra persona que lea. Es para resolver lo que estás tratando de hacer. Por ejemplo:

    always @ (posedge CLK) begin
        if (reset) begin
            //do reset stuff
        end else begin
            //do non-reset stuff
            //Notice how it is much clearer with stuff on separate lines. and well indented.
        end
    end
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas