jueves, 15 de julio de 2010

Xilinx XST y la inserción de BUFG/BUFGMX para controlar latches

Como bien es enseñado y todos los diseñadores lo dicen, latches no deberían ser usados en diseños sincrónicos; sin embargo hay casos en que realmente son necesarios y no queda otra que usarlos.

La herramienta de síntesis del ISE, XST, inserta automáticamente un BUFG o BUFGMX entre el pad de entrada del FPGA de la señal de control/habilitación del latch y la entrada de habilitación del latch. De este modo XST usa el ruteo de específico para reloj (clock routing) para controlar la habilitación (gate) del Latch. Esta inserción automática se puede verificar ya sea leyendo el reporte del Place and Route, o usando la herramienta FPGA Editor.
Para la comprobación de lo antes dicho se sintetizó el código que está el pie de esta entrada (sin el uso del atributo), y claramente se puede ver en la siguiente figura, que es una captura parcial del FPGA Editor, el ruteo de la señal de control del latch usando el ruteo dedicado del reloj.




Para evitar el mal uso de este importante y escaso recurso, se le debe indicar al XST que no use un BUFG o BUFGMX para controlar el latch, sino que use un simple IBUF, es decir, el buffer de entrada que se usa para cualquier otra senal que no sea de reloj. XST provee al diseñador ciertos atributos para casos como este (y muchos otros) detallados en la guía "XST User Guide".
Para éste caso se hace uso del atributo BUFFER_TYPE, asignándole el valor ‘ibuf’. Nota: BUFFER_TYPE es un atributo que reemplaza al attribute CLOCK_BUFFER usado en versiones anteriores al ISE 12. Xilinx aconseja el uso de BUFFER_TYPE para nuevos diseños.
La sintáxis del atributo es la siguiente:

  attribute buffer_type: string;
  attribute buffer_type of: signal is"{bufgdll|ibufg|bufgp|ibuf|bufr|none}";

La siguiente figura confirma el resultado esperado cuando se utiliza el atributo BUFFER_TYPE con la senal 'control' asignándole el valor 'ibuf'::



El código VHDL usado para la realización de las pruebas es el siguiente:

 1 library ieee;
 2 use ieee.std_logic_1164.all;
 3
 4 entity latch_test_no_buffer is
 5   port(
 6     data:           in std_ulogic;
 7     control:        in std_ulogic;
 8     latched_data: out std_ulogic
 9     );
10 end latch_test_no_buffer;
11
12 architecture beh of latch_test_no_buffer is
13   attribute buffer_type: string;
14   attribute buffer_type of control: signal is "ibuf";
15 begin
16  latch_proc: process(data, control)
17   begin  
18     if(control = '1') then
19       latched_data <= data;
20     end if;
21  end process latch_proc;
22 end beh;

No hay comentarios:

Publicar un comentario