Programación a nivel de flujo de datos en Verilog

0

Hice el siguiente programa para mostrar el número de días en el mes provisto por el usuario. Y para comprobar si el año que el usuario ingresó es un año bisiesto o no. Estoy tratando de hacer el programa en el nivel de flujo de datos. No sé si puedo usar si / else en el nivel de flujo de datos en Verilog. El siguiente programa me está dando errores en el lugar notificado.

module LeapYear(year,month,leapOrNot,Days);

input year,month;

output leapOrNot,Days;
 // error here
      if((year&400)==0) && ((year % 100)!==0 || (year & 4)==0)begin
       leapOrNot=1;
       end
  else

if(month==4 || month==6|| month==9|| month==11)begin
    Days=30;
end else
    if(month==1 || month==3|| month==5|| month==7|| month==8|| month==10|| month==12)begin
         Days=31;
  end  else
        if(month==2 && leapOrNot==1) begin
            Days=29;
     end   else begin
              Days=28;
              end

  endmodule

Por favor, dime cuál es la razón de este error. El error es

 ** Error: C:/Modeltech_5.7f/examples/LeapYear.v(9): near "if": syntax error

Saludos

    
pregunta Alfred

2 respuestas

3

Tu código tiene muchos, muchos problemas. El equilibrio entre paréntesis es uno de los más pequeños.

En primer lugar, una instrucción if solo puede aparecer en el cuerpo de una instrucción / bloque de comportamiento ( always ). Esta es la causa del mensaje de error que enumeró.

En segundo lugar, los puertos de entrada del módulo no pueden ser enteros, que es lo que parece suponer. Los valores de múltiples bits deben tener anchos explícitos.

También hay muchos otros problemas de sintaxis, lógica y estilo, demasiado numerosos para entrar. Prueba el siguiente código en su lugar.

module LeapYear (year, month, leapOrNot, Days);

input [15:0] year;    // 0-65535
input  [3:0] month;   // 1-12

output leapOrNot;
reg    leapOrNot;

output Days;
reg    Days;

always @* begin
  if ((year % 400) == 0 && (year % 100) != 0 && (year % 4) == 0) begin
    leapOrNot <= 1;
  end else begin
    leapOrNot <= 0;
  end
end

always @* begin
  if (month==2) begin
    if (leapOrNot==1) begin
      Days <= 29;
    end else begin
      Days <= 28;
    end
  end else if (month==4 || month==6 || month==9 || month==11) begin
    Days <= 30;
  end else begin
    Days <= 31;
  end
end

endmodule
    
respondido por el Dave Tweed
1

Tienes

    if((year&400)==0) && ((year % 100)!==0 || (year & 4)==0) begin
//    ^             ^
       leapOrNot=1;
     end

Los dos paréntesis que marqué en el código coinciden entre sí, por lo que la herramienta considera que esta es la condición completa de la declaración if . La herramienta espera que el begin esté inmediatamente después del cierre de paréntesis.

De acuerdo con The Verilog Golden Reference Guide , se requiere poner un paréntesis alrededor de toda la expresión condicional en la declaración if .

    if (((year&400)==0) && ((year % 100)!==0 || (year & 4)==0)) begin
//     ^                                                      ^
//     Added                                                  Added
       leapOrNot=1;
    end
    
respondido por el The Photon

Lea otras preguntas en las etiquetas