Actualmente tengo un Spartan-6 FPGA en una placa Digilent Nexus 3. Estoy usando Xilinx 14.6 Project Navigator para escribir el código y programar el FPGA.
Mi código para el módulo superior (y único) es el siguiente:
21 module blinker(
22 input clk,
23 output reg led_state
24 );
25
26 reg [31:0] count;
27 wire count_max = 32'd50000000;
28
29 assign count_next = (count_next > count_max) ? 32'd00000000 : count + 32'd00000001;
30 assign led_next = (count == count_max) ? ~led_state : led_state;
31
32 always @(posedge clk)
33 begin
34 count <= count_next;
35 led_state <= led_next;
36 end
37
38 endmodule
De acuerdo con el manual de referencia de Nexus 3, la placa tiene un oscilador de 100 MHz en el pin V10, por lo que en mi archivo de restricciones de usuario, asigné el pin V10 a la señal de entrada de clk de mi módulo.
Dado que el oscilador está a 100MHz, configuré count_max en 50,000,000, de modo que el led_state debería invertir cada 50 x 10 ^ 6 bordes de clk, o cada medio segundo, suponiendo 100MHz.
Cuando intenté la síntesis utilizando XST en el Project Navigator, recibo estos mensajes de advertencia:
WARNING:HDLCompiler:413 - "C:\Users\Public\Documents\Xilinx Projects\blinker\blinker.v" Line 29: Result of 32-bit expression is truncated to fit in 1-bit target.
WARNING:Xst:2404 - FFs/Latches <count<31:1>> (without init value) have a constant value of 0 in block <blinker>.
WARNING:Xst:2170 - Unit blinker : the following signal(s) form a combinatorial loop: n0011<0>.
Sin embargo, todavía puedo seguir adelante y construir el archivo .bit y programar el Nexus 3. El resultado, sin embargo, es que el LED, al que designé por la salida, simplemente permaneció encendido todo el tiempo (a menos que está parpadeando tan rápido que no me doy cuenta de que parpadea).
Pensé que tal vez tenía que ver con la Advertencia donde el Sintetizador truncaba la expresión en la Línea 29, así que intenté declarar count_next como un vector de 32 bits [31: 0], tanto como un registro como un cable, y También inicializando su valor. Probé el sintetizador y obtengo errores en su lugar.
Declarar e inicializar el conteo, led_state, count_next, led_next tampoco funcionó.
Me preguntaba si alguien puede mirar esto y decirme qué problema tiene con el código. También hay un bucle combinatorio para la señal "n0011 < 0 >" que no reconozco.