Problema al compilar verilog

0

Me doy cuenta de que este código verilog no es ideal, y más adelante podría pedir una revisión general en algún lugar, pero en este momento no estoy buscando una revisión general, excepto en la medida en que afecta el problema que tengo Está roto fundamentalmente, por supuesto, entonces quiero saber!). Me doy cuenta de que el momento no es el correcto, y los números codificados, etc. son malos, es solo un primer intento de aprendizaje y mi problema es comprender la advertencia en este momento.

Estoy tratando de hacer una salida VGA en un papilio pro. Funciona de alguna manera si acabo de generar la sincronización vertical y horizontal, pero cuando intento dar salida a las señales rgb obtengo esta advertencia: -

  

ADVERTENCIA: ConstraintSystem: 119 - Restricción < NET "vga_r" LOC="P78"     | > [main.ucf (6)]: esta restricción no se puede distribuir desde el   Diseñar objetos que coincidan con 'NET "vga_r"' porque esos objetos de diseño   No contenga ni maneje ninguna instancia del tipo correcto.

     

ADVERTENCIA: ConstraintSystem - Un objeto de diseño de destino para la ubicación   restricción '< NET "vga_r" LOC="P78" | > [main.ucf (6)] 'no pudo   se encontrarán, por lo que se eliminará la restricción de ubicación.

module main(input clk_32, output vga_hs, output vga_vs, output vga_r, output vga_g, output vga_b);

    wire clk_50;

    // Use a clock generator IP module to make a 50MHZ clock for the VGA
   clkgen clock_gen(clk_32, clk_50);

   // Current scan line number
   reg[0:9] row_count;

   // Current pixel position in scan line
    reg[0:10] pixel_count;

   always @(posedge clk_50)
    begin
        if (pixel_count == 1599)
         begin
             pixel_count <= 0;
           if (row_count == 524)
              begin
                  row_count <= 0;
              end
              else
              begin
                  row_count <= row_count + 1'b1;
             end
         end
         else
         begin
             pixel_count <= pixel_count + 1;
         end
    end


    // Set "on" only during the visible part of the screen
    wire on;
    assign on = (pixel_count > 112 && pixel_count < 752) && (row_count > 12 && row_count < 492);

    // Assert the hsync and vsync pins during the proper parts of the video frame
    assign vga_hs = ~(pixel_count < 96);
    assign vga_vs = ~(row_count < 2);

    // Just turn on the R,G,B outputs during the main area of the screen for now.
    assign vga_g = on;
    assign vga_b = on;
    assign vga_r = on;

endmodule

y mi archivo UCF contiene esto, lo cual creo que es correcto ...

NET "clk_32"    LOC="P94"   | IOSTANDARD=LVTTL | PERIOD=31.25ns;
NET "vga_vs"   LOC="P99"    | IOSTANDARD=LVTTL;
NET "vga_hs"   LOC="P97"    | IOSTANDARD=LVTTL;
NET "vga_b"    LOC="P92"    | IOSTANDARD=LVTTL;
NET "vga_g"    LOC="P80"    | IOSTANDARD=LVTTL;
NET "vga_r"    LOC="P78"    | IOSTANDARD=LVTTL;

clkgen es un generador de reloj generado por las herramientas y parece funcionar correctamente.

No entiendo lo que me dice la advertencia, parece que impide que la síntesis funcione. Todo se ve bien para mí, pero claramente me estoy perdiendo algo, ¿alguien puede ver lo que estoy haciendo mal? (¡Y sé amable, soy nuevo en verilog!)

    
pregunta John Burton

1 respuesta

2

Una posible causa: la síntesis está fusionando vga_g , vga_b y vga_r en una sola red, porque todas son equivalentes. Entonces, el paso de traducción no puede ubicarlos en ubicaciones diferentes, porque solo hay una red en la salida de síntesis.

Solución 1. Haga una instancia explícita de sus OBUF.

 OBUF obuf_vga_g ( .I ( on ), .O ( vga_g ) ); 
 OBUF obuf_vga_b ( .I ( on ), .O ( vga_b ) ); 
 OBUF obuf_vga_r ( .I ( on ), .O ( vga_r ) ); 

Esto hace explícito en su código que las redes de salida se almacenan en búfer desde la señal on y se adjuntan a los pines de salida. Obviamente, la herramienta ya debe saber que estas redes están conectadas a los pines de salida porque son salidas del módulo de nivel superior. Tener que hacer este tipo de cosas es solo una de las peculiaridades de utilizar una herramienta diseñada originalmente para describir lógica para los diferentes propósitos de diseñar .

Solución 2. Use restricciones para eliminar la combinación de lógica duplicada.

Dependiendo de la herramienta de síntesis que use, debería haber una restricción disponible que puede adjuntar a sus señales vga_b , etc., para evitar que se fusionen en el paso de síntesis. En Synplicity, creo que usaría syn_keep para evitar eliminar la lógica combinatoria redundante.

Como señaló Apalopohapa en un comentario, es posible que también debas activar una bandera para permitir que Synthesis genere automáticamente los OBUF que necesitas. Esto debería estar predeterminado en 'on', pero no está mal para verificarlo dos veces.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas