error "no está declarado" en Verilog

2

Creé un módulo de codificador 8-3 simple (llamado encoder8to3 ) para reemplazar algunas instancias repetidas de código Verilog. Luego intenté usar el módulo en levers2.v . Recibo el siguiente error cuando ejecuto un archivo de prueba de Verilog:

  

ERROR: HDLCompiler: 69 - "C: / Documents and Settings / me / xilinx   projects / wQCBG / levers2.v "Línea 132: no está declarada.

Veo todo tipo de ejemplos de cómo crear módulos, pero no muchos sobre cómo usar los que se crean. Todo lo que encuentro son fragmentos del uso y no la declaración.

¿Alguien me dirá cómo declarar correctamente encoder8to3 en levers2 por favor?

EDITAR - codez, palancas2, reducido.

module levers2(
     input [7:0] LL,
     input [7:0] RL,
    output reg [10:0] DIVISOR,
     output reg TD_ANY_MARK,
     output reg TD_NUMBERS,
     output reg TD_ONE_MARK,
     output reg TD_DONT_DISENGAGE,
    output reg FAULT
    );

(snip)

reg [7:0] x;

always @(LL, RL) begin
(snip)
        FAULT <= 0;
        /*
        encoder8to3(LL, x, FAULT);
(snip)

El propio módulo codificador es:

module encoder8to3(
    input [7:0] A,
    output reg [2:0] B,
    output reg F
    );

    always @(A) begin
        F <= 0;
        if (A[0]) B <= 0;
        else if (A[1]) B <= 1;
        else if (A[2]) B <= 2;
        else if (A[3]) B <= 3;
        else if (A[4]) B <= 4;
        else if (A[5]) B <= 5;
        else if (A[6]) B <= 6;
        else if (A[7]) B <= 7;
        else F <= 1;
    end

endmodule

Estoy aprendiendo, y estoy teniendo algunos problemas con la sintaxis de Verilog. Entonces, de alguna manera, necesito decirle a levers2 (la primera parte del código) dónde encontrar encoder8to3 o quizás, como c, solo avisar al compilador que el módulo se usará finalmente.

    
pregunta Tony Ennis

1 respuesta

4

Debe asignar un nombre a la instancia (ver más abajo)

También parece que puede estar intentando declararlo en un bloque siempre, esto no funcionará. Declararlo fuera de cualquier bloque (por ejemplo, en la parte superior del módulo)

Además, usar el método de creación de instancias de "conexión por nombre" (o asociación nombrada) en lugar de "conexión por orden" (o asociación posicional) es menos propenso a errores accidentales por error en la orden, especialmente con módulos con muchos puertos .

Por lo tanto, la instanciación de la conexión por nombre sería

encoder8to3 enc_instance (.A(LL), .B(x), .F(FAULT));

Con este método, podría escribirse así y seguir conectado correctamente:

encoder8to3 enc_instance (.A(LL), .F(FAULT), .B(x));

Mientras que usa:

encoder8to3 enc_instance (LL, FAULT, x);

conectaría B con FALLA y F con x.

Aquí hay un pdf razonable en módulos e instáutelos. Estoy de acuerdo en que los tutoriales de Verilog son bastante escasos en el terreno (en comparación con algo como C), por lo que comenzar puede ser un poco desconcertante. Si puede encontrar una copia a un precio razonable, le recomiendo el libro de Pong Chu "FPGA Prototyping with Verilog Example" que mencioné en mi respuesta a su otra pregunta, así como el enfoque en la síntesis que mencioné. necesitas comenzar a escribir código decente, y es muy claro y conciso.
También hay una
lista de correo de Google para Verilog que puede encontrar de uso, y fpga4fun tiene algunos buenos tutoriales y un foro. Y por supuesto que hay aquí :-)

EDITAR - sobre dónde declarar el módulo:

La creación de instancias solo conecta los puertos entre sí, por lo que no importa dónde se declare (fuera de un bloque). Si quieres hacer algo con este módulo dentro del bloque siempre usa alguna lógica intermedia. Cree un par de registros, use el bloque siempre para manipularlos como desee y, a continuación, conéctelos a los puertos del módulo instanciado (en la instanciación).

De la forma en que lo tiene en este momento, el módulo instanciado se puede ver en paralelo con su módulo en lugar de dentro, ya que solo se conecta directamente a las entradas y salidas del módulo. Eche un vistazo al esquema RTL para ver qué genera el código (en síntesis en la pestaña de diseño)

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas