ISE: obliga al compilador a aceptar bucles largos

2

En este momento, ISE limita generate lazos a 64. Cuando subo, produce el error:

  

Se superó el límite de recuento de bucle. La condición nunca es falsa.

Encontré que la opción loop_iteration_limit debería agregarse al proyecto correspondiente .xst archivo. Sin embargo, cuando agrego la línea -loop_iteration_limit 10000 al archivo .xst y la compilación, esa línea desaparece.

¿Cómo puedo hacer largos bucles en Verilog con ISE? (La razón por la que quiero hacer esto es instanciar muchas copias de un inversor para intentar calentar mi FPGA y probar la fuente de alimentación).

    
pregunta Randomblue

2 respuestas

2

¿Qué tal si creas un registro de desplazamiento masivo y un cronograma tan rápido como sea posible con ceros alternos y alternativos?

signal sr:std_logic_vector(10000 downto 0); -- tune the length of this to suit your device
process
begin
   wait until rising_edge(clk);
   sr <= sr(sr'high-1 downto 0) & input_signal;
end process;

Aunque no usará mucha lógica de LUT. Tampoco pruebe otros bloques incrustados como BRAM y DSP.

    
respondido por el Martin Thompson
0

"Eso no usará mucha lógica LUT sin embargo. Tampoco pruebe ningún otro bloque incrustado como BRAM y DSP ".

Creo que hacer un registro masivo de turnos alternando ceros y es una solución elegante. Si juega bien sus cartas y evita conjuntos / reinicios explícitos o utiliza directamente bits individuales, el sintetizador puede inferir que puede usar registros de desplazamiento ajustados basados en SRL (basados en LUT) para ahorrar espacio, pero también puede hacerlo explícitamente. solicite registros de desplazamiento basados en SRL haciendo uso de las primitivas de la biblioteca SRL16E o SRLC32E para construir una estructura más grande. Además, si corta las cosas en trozos de registro de desplazamiento de 34 bits, podrá hacer que su estructura se enrede a través de todos los LUT y FF disponibles, como lo sugiere el fragmento de código de Verilog a continuación que se ajustará perfectamente dentro una rebanada de Spartan-6 o 7 series:

wire [4:0] bits; // Shift interconnect: 0->1->2->3->4 SRL16E #(.INIT(16'hAAAA)) // First 16-bit LUT-based shift register srl1 ( .CLK(clock), .CE(1'b1), .A3(1'b1), .A2(1'b1), .A1(1'b1), .A0(1'b1), .D(bits[0]), .Q(bits[1]) ); FDE #(.INIT(1'b1)) // First 1-bit FF-based shift register fde1 ( .C(clock), .CE(1'b1), .D(bits[1]), .Q(bits[2]) ); SRL16E #(.INIT(16'h5555)) // Second 16-bit LUT-based shift register srl2 ( .CLK(clock), .CE(1'b1), .A3(1'b1), .A2(1'b1), .A1(1'b1), .A0(1'b1), .D(bits[2]), .Q(bits[3]) ); FDE #(.INIT(1'b0)) // Second 1-bit FF-based shift register fde2 ( .C(clock), .CE(1'b1), .D(bits[3]), .Q(bits[4]) );

XAPP52 "Los registros de cambios eficientes, los contadores LFSR y los generadores de secuencias pseudoaleatorias largas" tienen varios ejemplos de este enfoque.

Para obtener más información general sobre SRL16E y SRLC32E, consulte:
UG768 "Guía de bibliotecas FPGA de la serie Xilinx 7 para diseños HDL"
UG615 "Spartan-6 Libraries Guide for HDL Designs".

Para extraer los bloques de memoria RAM y los DSP, necesitaría circuitos adicionales, posiblemente alimentando colecciones de fuentes de registro de desplazamiento para sembrarlas con datos que cambian constantemente. Los bloques de RAM de doble puerto podrían usarse para construir una gran cadena FIFO que es de 1 bit de ancho y N-etapas (dependiendo de los recursos disponibles en su FPGA). Por lo tanto, podría utilizar los bloques de RAM para extender su cadena de registro de desplazamiento a longitudes realmente épicas.

    
respondido por el Bert Sierra

Lea otras preguntas en las etiquetas