error "esperando el endmodule", ¿no puede entender por qué?

0

Estoy intentando construir un contador con un reinicio de sincronización, que se mostrará en la pantalla de 7 segmentos en la placa fpga. Vi algunas publicaciones sobre mi problema:

  

"texto cercano" si "; esperando un módulo final"

Pero aún no puedo entender por qué estoy recibiendo ese error, sé que me falta una regla importante, pero no puedo resolverlo.

module up_counter(
input clk,rst,  
output segA, segB, segC, segD, segE ,segF , segG, segDP);
reg [3:0] BCD;

always @(posedge clk);
    reg [7:0] SevenSeg;
    if (BCD==4'h9) begin 
        BCD <= 4'h0;
        SevenSeg = 8'b11111100;
    end else if (rst==0) begin
        BCD <= 4'h0;
        SevenSeg = 8'b11111100;
    end else begin
        BCD <= BCD+4'h1;
        always @(*)
           case(BCD)
              4'h0:SevenSeg = 8'b11111100;//0
              4'h1:SevenSeg = 8'b01100000;//1
              4'h2:SevenSeg = 8'b11011010;//2
              4'h3:SevenSeg = 8'b11110010;
              4'h4:SevenSeg = 8'b01100110;
              4'h5:SevenSeg = 8'b10110110;
              4'h6:SevenSeg = 8'b10111110;
              4'h7:SevenSeg = 8'b11100000;
              4'h8:SevenSeg = 8'b11111110;
              4'h9:SevenSeg = 8'b11110110;
           default: SevenSeg = 8'b11100000;
           endcase
    end

assign {segA, segB, segC, segD, segE ,segF , segG, segDP} = SevenSeg;

endmodule

Esta adición "siempre" vino después, leí ese caso y si las declaraciones tienen que venir siempre, pero esto no ayudó.    siempre @(*)    caso (BCD) Furthur más, traté de poner un "siempre" antes de:     si (BCD == 4'h9) comienza Pero entonces tengo el mismo error:

  

"texto cercano" siempre "; esperando un módulo final"

Me siento muy limitado, porque en este momento, cada vez que tengo un "si", me sale un error, por lo que me falta una regla seria y básica. Muchas gracias, realmente aprecio tu ayuda.

Gracias a todos por su ayuda, creo que lo hice, cada vez que me lo dio, y este es el código de mejora:

module up_counter(
input clk,rst,
output segA, segB, segC, segD, segE ,segF , segG, segDP);
reg [3:0] BCD;
reg [7:0] SevenSeg;

always @(posedge clk)
begin
if (BCD==4'h9) begin 
   BCD <= 4'h0;
   SevenSeg = 8'b11111100;
end else if (rst==0) begin
   BCD <= 4'h0;
   SevenSeg = 8'b11111100;
end

else begin
   BCD <= BCD+4'h1;
   case(BCD)
     4'h0:SevenSeg <= 8'b11111100;//0
     4'h1:SevenSeg <= 8'b01100000;//1
     4'h2:SevenSeg <= 8'b11011010;//2
     4'h3:SevenSeg <= 8'b11110010;
     4'h4:SevenSeg <= 8'b01100110;
     4'h5:SevenSeg <= 8'b10110110;
     4'h6:SevenSeg <= 8'b10111110;
     4'h7:SevenSeg <= 8'b11100000;
     4'h8:SevenSeg <= 8'b11111110;
     4'h9:SevenSeg <= 8'b11110110;
     default: SevenSeg <= 8'b11100000;
endcase
end
end
assign {segA, segB, segC, segD, segE ,segF , segG, segDP} = SevenSeg;

endmodule

Resolvió el problema que tenía, pero ahora, solo obtengo 8 en la pantalla de 7 segmentos, ¿hay más reglas que faltan?

    
pregunta albert1905

1 respuesta

5

Veo dos problemas:

  1. El punto y coma al final de la primera línea always significa que toda la estructura if que sigue no está dentro del bloque siempre.

  2. Usted tiene un segundo bloque always anidado dentro de su primer. No hay necesidad de hacer eso. Como ya estás dentro de un bloque always , se deducirá un multiplexor de tu declaración case incluso sin otro always .

    La construcción always @(*) se utiliza cuando se desea producir un multiplexor combinatorio, lo que significa que desea poder acceder a las salidas del multiplexor sin trabar. Ya que está enclavando de inmediato las salidas de mux aquí, no hay necesidad de esto.

  3. No puede (AFAIK, pero no estoy al tanto de las últimas revisiones de Verilog) declarar nuevas señales ( reg o wire declaraciones) dentro de un bloque siempre. Mueva su declaración de SevenSeg a la parte superior del módulo.

Nota de estilo: use begin y end dentro de cada always , incluso si solo tendrá una declaración en el bloque. Hace que sea más fácil seguir el código y evita errores cuando edita el código más adelante.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas